]> Pileus Git - ~andy/linux/blob - fs/gfs2/super.c
GFS2: Merge lock_dlm module into GFS2
[~andy/linux] / fs / gfs2 / super.c
1 /*
2  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
3  * Copyright (C) 2004-2007 Red Hat, Inc.  All rights reserved.
4  *
5  * This copyrighted material is made available to anyone wishing to use,
6  * modify, copy, or redistribute it subject to the terms and conditions
7  * of the GNU General Public License version 2.
8  */
9
10 #include <linux/sched.h>
11 #include <linux/slab.h>
12 #include <linux/spinlock.h>
13 #include <linux/completion.h>
14 #include <linux/buffer_head.h>
15 #include <linux/crc32.h>
16 #include <linux/gfs2_ondisk.h>
17 #include <linux/bio.h>
18
19 #include "gfs2.h"
20 #include "incore.h"
21 #include "bmap.h"
22 #include "dir.h"
23 #include "glock.h"
24 #include "glops.h"
25 #include "inode.h"
26 #include "log.h"
27 #include "meta_io.h"
28 #include "quota.h"
29 #include "recovery.h"
30 #include "rgrp.h"
31 #include "super.h"
32 #include "trans.h"
33 #include "util.h"
34
35 /**
36  * gfs2_jindex_free - Clear all the journal index information
37  * @sdp: The GFS2 superblock
38  *
39  */
40
41 void gfs2_jindex_free(struct gfs2_sbd *sdp)
42 {
43         struct list_head list, *head;
44         struct gfs2_jdesc *jd;
45         struct gfs2_journal_extent *jext;
46
47         spin_lock(&sdp->sd_jindex_spin);
48         list_add(&list, &sdp->sd_jindex_list);
49         list_del_init(&sdp->sd_jindex_list);
50         sdp->sd_journals = 0;
51         spin_unlock(&sdp->sd_jindex_spin);
52
53         while (!list_empty(&list)) {
54                 jd = list_entry(list.next, struct gfs2_jdesc, jd_list);
55                 head = &jd->extent_list;
56                 while (!list_empty(head)) {
57                         jext = list_entry(head->next,
58                                           struct gfs2_journal_extent,
59                                           extent_list);
60                         list_del(&jext->extent_list);
61                         kfree(jext);
62                 }
63                 list_del(&jd->jd_list);
64                 iput(jd->jd_inode);
65                 kfree(jd);
66         }
67 }
68
69 static struct gfs2_jdesc *jdesc_find_i(struct list_head *head, unsigned int jid)
70 {
71         struct gfs2_jdesc *jd;
72         int found = 0;
73
74         list_for_each_entry(jd, head, jd_list) {
75                 if (jd->jd_jid == jid) {
76                         found = 1;
77                         break;
78                 }
79         }
80
81         if (!found)
82                 jd = NULL;
83
84         return jd;
85 }
86
87 struct gfs2_jdesc *gfs2_jdesc_find(struct gfs2_sbd *sdp, unsigned int jid)
88 {
89         struct gfs2_jdesc *jd;
90
91         spin_lock(&sdp->sd_jindex_spin);
92         jd = jdesc_find_i(&sdp->sd_jindex_list, jid);
93         spin_unlock(&sdp->sd_jindex_spin);
94
95         return jd;
96 }
97
98 int gfs2_jdesc_check(struct gfs2_jdesc *jd)
99 {
100         struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
101         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
102         int ar;
103         int error;
104
105         if (ip->i_disksize < (8 << 20) || ip->i_disksize > (1 << 30) ||
106             (ip->i_disksize & (sdp->sd_sb.sb_bsize - 1))) {
107                 gfs2_consist_inode(ip);
108                 return -EIO;
109         }
110         jd->jd_blocks = ip->i_disksize >> sdp->sd_sb.sb_bsize_shift;
111
112         error = gfs2_write_alloc_required(ip, 0, ip->i_disksize, &ar);
113         if (!error && ar) {
114                 gfs2_consist_inode(ip);
115                 error = -EIO;
116         }
117
118         return error;
119 }
120
121 /**
122  * gfs2_make_fs_rw - Turn a Read-Only FS into a Read-Write one
123  * @sdp: the filesystem
124  *
125  * Returns: errno
126  */
127
128 int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
129 {
130         struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode);
131         struct gfs2_glock *j_gl = ip->i_gl;
132         struct gfs2_holder t_gh;
133         struct gfs2_log_header_host head;
134         int error;
135
136         error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, 0, &t_gh);
137         if (error)
138                 return error;
139
140         j_gl->gl_ops->go_inval(j_gl, DIO_METADATA);
141
142         error = gfs2_find_jhead(sdp->sd_jdesc, &head);
143         if (error)
144                 goto fail;
145
146         if (!(head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)) {
147                 gfs2_consist(sdp);
148                 error = -EIO;
149                 goto fail;
150         }
151
152         /*  Initialize some head of the log stuff  */
153         sdp->sd_log_sequence = head.lh_sequence + 1;
154         gfs2_log_pointers_init(sdp, head.lh_blkno);
155
156         error = gfs2_quota_init(sdp);
157         if (error)
158                 goto fail;
159
160         set_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);
161
162         gfs2_glock_dq_uninit(&t_gh);
163
164         return 0;
165
166 fail:
167         t_gh.gh_flags |= GL_NOCACHE;
168         gfs2_glock_dq_uninit(&t_gh);
169
170         return error;
171 }
172
173 static void gfs2_statfs_change_in(struct gfs2_statfs_change_host *sc, const void *buf)
174 {
175         const struct gfs2_statfs_change *str = buf;
176
177         sc->sc_total = be64_to_cpu(str->sc_total);
178         sc->sc_free = be64_to_cpu(str->sc_free);
179         sc->sc_dinodes = be64_to_cpu(str->sc_dinodes);
180 }
181
182 static void gfs2_statfs_change_out(const struct gfs2_statfs_change_host *sc, void *buf)
183 {
184         struct gfs2_statfs_change *str = buf;
185
186         str->sc_total = cpu_to_be64(sc->sc_total);
187         str->sc_free = cpu_to_be64(sc->sc_free);
188         str->sc_dinodes = cpu_to_be64(sc->sc_dinodes);
189 }
190
191 int gfs2_statfs_init(struct gfs2_sbd *sdp)
192 {
193         struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode);
194         struct gfs2_statfs_change_host *m_sc = &sdp->sd_statfs_master;
195         struct gfs2_inode *l_ip = GFS2_I(sdp->sd_sc_inode);
196         struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local;
197         struct buffer_head *m_bh, *l_bh;
198         struct gfs2_holder gh;
199         int error;
200
201         error = gfs2_glock_nq_init(m_ip->i_gl, LM_ST_EXCLUSIVE, GL_NOCACHE,
202                                    &gh);
203         if (error)
204                 return error;
205
206         error = gfs2_meta_inode_buffer(m_ip, &m_bh);
207         if (error)
208                 goto out;
209
210         if (sdp->sd_args.ar_spectator) {
211                 spin_lock(&sdp->sd_statfs_spin);
212                 gfs2_statfs_change_in(m_sc, m_bh->b_data +
213                                       sizeof(struct gfs2_dinode));
214                 spin_unlock(&sdp->sd_statfs_spin);
215         } else {
216                 error = gfs2_meta_inode_buffer(l_ip, &l_bh);
217                 if (error)
218                         goto out_m_bh;
219
220                 spin_lock(&sdp->sd_statfs_spin);
221                 gfs2_statfs_change_in(m_sc, m_bh->b_data +
222                                       sizeof(struct gfs2_dinode));
223                 gfs2_statfs_change_in(l_sc, l_bh->b_data +
224                                       sizeof(struct gfs2_dinode));
225                 spin_unlock(&sdp->sd_statfs_spin);
226
227                 brelse(l_bh);
228         }
229
230 out_m_bh:
231         brelse(m_bh);
232 out:
233         gfs2_glock_dq_uninit(&gh);
234         return 0;
235 }
236
237 void gfs2_statfs_change(struct gfs2_sbd *sdp, s64 total, s64 free,
238                         s64 dinodes)
239 {
240         struct gfs2_inode *l_ip = GFS2_I(sdp->sd_sc_inode);
241         struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local;
242         struct buffer_head *l_bh;
243         int error;
244
245         error = gfs2_meta_inode_buffer(l_ip, &l_bh);
246         if (error)
247                 return;
248
249         gfs2_trans_add_bh(l_ip->i_gl, l_bh, 1);
250
251         spin_lock(&sdp->sd_statfs_spin);
252         l_sc->sc_total += total;
253         l_sc->sc_free += free;
254         l_sc->sc_dinodes += dinodes;
255         gfs2_statfs_change_out(l_sc, l_bh->b_data + sizeof(struct gfs2_dinode));
256         spin_unlock(&sdp->sd_statfs_spin);
257
258         brelse(l_bh);
259 }
260
261 int gfs2_statfs_sync(struct gfs2_sbd *sdp)
262 {
263         struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode);
264         struct gfs2_inode *l_ip = GFS2_I(sdp->sd_sc_inode);
265         struct gfs2_statfs_change_host *m_sc = &sdp->sd_statfs_master;
266         struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local;
267         struct gfs2_holder gh;
268         struct buffer_head *m_bh, *l_bh;
269         int error;
270
271         error = gfs2_glock_nq_init(m_ip->i_gl, LM_ST_EXCLUSIVE, GL_NOCACHE,
272                                    &gh);
273         if (error)
274                 return error;
275
276         error = gfs2_meta_inode_buffer(m_ip, &m_bh);
277         if (error)
278                 goto out;
279
280         spin_lock(&sdp->sd_statfs_spin);
281         gfs2_statfs_change_in(m_sc, m_bh->b_data +
282                               sizeof(struct gfs2_dinode));
283         if (!l_sc->sc_total && !l_sc->sc_free && !l_sc->sc_dinodes) {
284                 spin_unlock(&sdp->sd_statfs_spin);
285                 goto out_bh;
286         }
287         spin_unlock(&sdp->sd_statfs_spin);
288
289         error = gfs2_meta_inode_buffer(l_ip, &l_bh);
290         if (error)
291                 goto out_bh;
292
293         error = gfs2_trans_begin(sdp, 2 * RES_DINODE, 0);
294         if (error)
295                 goto out_bh2;
296
297         gfs2_trans_add_bh(l_ip->i_gl, l_bh, 1);
298
299         spin_lock(&sdp->sd_statfs_spin);
300         m_sc->sc_total += l_sc->sc_total;
301         m_sc->sc_free += l_sc->sc_free;
302         m_sc->sc_dinodes += l_sc->sc_dinodes;
303         memset(l_sc, 0, sizeof(struct gfs2_statfs_change));
304         memset(l_bh->b_data + sizeof(struct gfs2_dinode),
305                0, sizeof(struct gfs2_statfs_change));
306         spin_unlock(&sdp->sd_statfs_spin);
307
308         gfs2_trans_add_bh(m_ip->i_gl, m_bh, 1);
309         gfs2_statfs_change_out(m_sc, m_bh->b_data + sizeof(struct gfs2_dinode));
310
311         gfs2_trans_end(sdp);
312
313 out_bh2:
314         brelse(l_bh);
315 out_bh:
316         brelse(m_bh);
317 out:
318         gfs2_glock_dq_uninit(&gh);
319         return error;
320 }
321
322 struct lfcc {
323         struct list_head list;
324         struct gfs2_holder gh;
325 };
326
327 /**
328  * gfs2_lock_fs_check_clean - Stop all writes to the FS and check that all
329  *                            journals are clean
330  * @sdp: the file system
331  * @state: the state to put the transaction lock into
332  * @t_gh: the hold on the transaction lock
333  *
334  * Returns: errno
335  */
336
337 static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp,
338                                     struct gfs2_holder *t_gh)
339 {
340         struct gfs2_inode *ip;
341         struct gfs2_holder ji_gh;
342         struct gfs2_jdesc *jd;
343         struct lfcc *lfcc;
344         LIST_HEAD(list);
345         struct gfs2_log_header_host lh;
346         int error;
347
348         list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) {
349                 lfcc = kmalloc(sizeof(struct lfcc), GFP_KERNEL);
350                 if (!lfcc) {
351                         error = -ENOMEM;
352                         goto out;
353                 }
354                 ip = GFS2_I(jd->jd_inode);
355                 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &lfcc->gh);
356                 if (error) {
357                         kfree(lfcc);
358                         goto out;
359                 }
360                 list_add(&lfcc->list, &list);
361         }
362
363         error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_DEFERRED,
364                                    GL_NOCACHE, t_gh);
365
366         list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) {
367                 error = gfs2_jdesc_check(jd);
368                 if (error)
369                         break;
370                 error = gfs2_find_jhead(jd, &lh);
371                 if (error)
372                         break;
373                 if (!(lh.lh_flags & GFS2_LOG_HEAD_UNMOUNT)) {
374                         error = -EBUSY;
375                         break;
376                 }
377         }
378
379         if (error)
380                 gfs2_glock_dq_uninit(t_gh);
381
382 out:
383         while (!list_empty(&list)) {
384                 lfcc = list_entry(list.next, struct lfcc, list);
385                 list_del(&lfcc->list);
386                 gfs2_glock_dq_uninit(&lfcc->gh);
387                 kfree(lfcc);
388         }
389         gfs2_glock_dq_uninit(&ji_gh);
390         return error;
391 }
392
393 /**
394  * gfs2_freeze_fs - freezes the file system
395  * @sdp: the file system
396  *
397  * This function flushes data and meta data for all machines by
398  * aquiring the transaction log exclusively.  All journals are
399  * ensured to be in a clean state as well.
400  *
401  * Returns: errno
402  */
403
404 int gfs2_freeze_fs(struct gfs2_sbd *sdp)
405 {
406         int error = 0;
407
408         mutex_lock(&sdp->sd_freeze_lock);
409
410         if (!sdp->sd_freeze_count++) {
411                 error = gfs2_lock_fs_check_clean(sdp, &sdp->sd_freeze_gh);
412                 if (error)
413                         sdp->sd_freeze_count--;
414         }
415
416         mutex_unlock(&sdp->sd_freeze_lock);
417
418         return error;
419 }
420
421 /**
422  * gfs2_unfreeze_fs - unfreezes the file system
423  * @sdp: the file system
424  *
425  * This function allows the file system to proceed by unlocking
426  * the exclusively held transaction lock.  Other GFS2 nodes are
427  * now free to acquire the lock shared and go on with their lives.
428  *
429  */
430
431 void gfs2_unfreeze_fs(struct gfs2_sbd *sdp)
432 {
433         mutex_lock(&sdp->sd_freeze_lock);
434
435         if (sdp->sd_freeze_count && !--sdp->sd_freeze_count)
436                 gfs2_glock_dq_uninit(&sdp->sd_freeze_gh);
437
438         mutex_unlock(&sdp->sd_freeze_lock);
439 }
440