2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3 * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
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.
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>
36 * gfs2_jindex_free - Clear all the journal index information
37 * @sdp: The GFS2 superblock
41 void gfs2_jindex_free(struct gfs2_sbd
*sdp
)
43 struct list_head list
, *head
;
44 struct gfs2_jdesc
*jd
;
45 struct gfs2_journal_extent
*jext
;
47 spin_lock(&sdp
->sd_jindex_spin
);
48 list_add(&list
, &sdp
->sd_jindex_list
);
49 list_del_init(&sdp
->sd_jindex_list
);
51 spin_unlock(&sdp
->sd_jindex_spin
);
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
,
60 list_del(&jext
->extent_list
);
63 list_del(&jd
->jd_list
);
69 static struct gfs2_jdesc
*jdesc_find_i(struct list_head
*head
, unsigned int jid
)
71 struct gfs2_jdesc
*jd
;
74 list_for_each_entry(jd
, head
, jd_list
) {
75 if (jd
->jd_jid
== jid
) {
87 struct gfs2_jdesc
*gfs2_jdesc_find(struct gfs2_sbd
*sdp
, unsigned int jid
)
89 struct gfs2_jdesc
*jd
;
91 spin_lock(&sdp
->sd_jindex_spin
);
92 jd
= jdesc_find_i(&sdp
->sd_jindex_list
, jid
);
93 spin_unlock(&sdp
->sd_jindex_spin
);
98 int gfs2_jdesc_check(struct gfs2_jdesc
*jd
)
100 struct gfs2_inode
*ip
= GFS2_I(jd
->jd_inode
);
101 struct gfs2_sbd
*sdp
= GFS2_SB(jd
->jd_inode
);
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
);
110 jd
->jd_blocks
= ip
->i_disksize
>> sdp
->sd_sb
.sb_bsize_shift
;
112 error
= gfs2_write_alloc_required(ip
, 0, ip
->i_disksize
, &ar
);
114 gfs2_consist_inode(ip
);
122 * gfs2_make_fs_rw - Turn a Read-Only FS into a Read-Write one
123 * @sdp: the filesystem
128 int gfs2_make_fs_rw(struct gfs2_sbd
*sdp
)
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
;
136 error
= gfs2_glock_nq_init(sdp
->sd_trans_gl
, LM_ST_SHARED
, 0, &t_gh
);
140 j_gl
->gl_ops
->go_inval(j_gl
, DIO_METADATA
);
142 error
= gfs2_find_jhead(sdp
->sd_jdesc
, &head
);
146 if (!(head
.lh_flags
& GFS2_LOG_HEAD_UNMOUNT
)) {
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
);
156 error
= gfs2_quota_init(sdp
);
160 set_bit(SDF_JOURNAL_LIVE
, &sdp
->sd_flags
);
162 gfs2_glock_dq_uninit(&t_gh
);
167 t_gh
.gh_flags
|= GL_NOCACHE
;
168 gfs2_glock_dq_uninit(&t_gh
);
173 static void gfs2_statfs_change_in(struct gfs2_statfs_change_host
*sc
, const void *buf
)
175 const struct gfs2_statfs_change
*str
= buf
;
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
);
182 static void gfs2_statfs_change_out(const struct gfs2_statfs_change_host
*sc
, void *buf
)
184 struct gfs2_statfs_change
*str
= buf
;
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
);
191 int gfs2_statfs_init(struct gfs2_sbd
*sdp
)
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
;
201 error
= gfs2_glock_nq_init(m_ip
->i_gl
, LM_ST_EXCLUSIVE
, GL_NOCACHE
,
206 error
= gfs2_meta_inode_buffer(m_ip
, &m_bh
);
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
);
216 error
= gfs2_meta_inode_buffer(l_ip
, &l_bh
);
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
);
233 gfs2_glock_dq_uninit(&gh
);
237 void gfs2_statfs_change(struct gfs2_sbd
*sdp
, s64 total
, s64 free
,
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
;
245 error
= gfs2_meta_inode_buffer(l_ip
, &l_bh
);
249 gfs2_trans_add_bh(l_ip
->i_gl
, l_bh
, 1);
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
);
261 int gfs2_statfs_sync(struct gfs2_sbd
*sdp
)
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
;
271 error
= gfs2_glock_nq_init(m_ip
->i_gl
, LM_ST_EXCLUSIVE
, GL_NOCACHE
,
276 error
= gfs2_meta_inode_buffer(m_ip
, &m_bh
);
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
);
287 spin_unlock(&sdp
->sd_statfs_spin
);
289 error
= gfs2_meta_inode_buffer(l_ip
, &l_bh
);
293 error
= gfs2_trans_begin(sdp
, 2 * RES_DINODE
, 0);
297 gfs2_trans_add_bh(l_ip
->i_gl
, l_bh
, 1);
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
);
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
));
318 gfs2_glock_dq_uninit(&gh
);
323 struct list_head list
;
324 struct gfs2_holder gh
;
328 * gfs2_lock_fs_check_clean - Stop all writes to the FS and check that all
330 * @sdp: the file system
331 * @state: the state to put the transaction lock into
332 * @t_gh: the hold on the transaction lock
337 static int gfs2_lock_fs_check_clean(struct gfs2_sbd
*sdp
,
338 struct gfs2_holder
*t_gh
)
340 struct gfs2_inode
*ip
;
341 struct gfs2_jdesc
*jd
;
344 struct gfs2_log_header_host lh
;
347 list_for_each_entry(jd
, &sdp
->sd_jindex_list
, jd_list
) {
348 lfcc
= kmalloc(sizeof(struct lfcc
), GFP_KERNEL
);
353 ip
= GFS2_I(jd
->jd_inode
);
354 error
= gfs2_glock_nq_init(ip
->i_gl
, LM_ST_SHARED
, 0, &lfcc
->gh
);
359 list_add(&lfcc
->list
, &list
);
362 error
= gfs2_glock_nq_init(sdp
->sd_trans_gl
, LM_ST_DEFERRED
,
365 list_for_each_entry(jd
, &sdp
->sd_jindex_list
, jd_list
) {
366 error
= gfs2_jdesc_check(jd
);
369 error
= gfs2_find_jhead(jd
, &lh
);
372 if (!(lh
.lh_flags
& GFS2_LOG_HEAD_UNMOUNT
)) {
379 gfs2_glock_dq_uninit(t_gh
);
382 while (!list_empty(&list
)) {
383 lfcc
= list_entry(list
.next
, struct lfcc
, list
);
384 list_del(&lfcc
->list
);
385 gfs2_glock_dq_uninit(&lfcc
->gh
);
392 * gfs2_freeze_fs - freezes the file system
393 * @sdp: the file system
395 * This function flushes data and meta data for all machines by
396 * aquiring the transaction log exclusively. All journals are
397 * ensured to be in a clean state as well.
402 int gfs2_freeze_fs(struct gfs2_sbd
*sdp
)
406 mutex_lock(&sdp
->sd_freeze_lock
);
408 if (!sdp
->sd_freeze_count
++) {
409 error
= gfs2_lock_fs_check_clean(sdp
, &sdp
->sd_freeze_gh
);
411 sdp
->sd_freeze_count
--;
414 mutex_unlock(&sdp
->sd_freeze_lock
);
420 * gfs2_unfreeze_fs - unfreezes the file system
421 * @sdp: the file system
423 * This function allows the file system to proceed by unlocking
424 * the exclusively held transaction lock. Other GFS2 nodes are
425 * now free to acquire the lock shared and go on with their lives.
429 void gfs2_unfreeze_fs(struct gfs2_sbd
*sdp
)
431 mutex_lock(&sdp
->sd_freeze_lock
);
433 if (sdp
->sd_freeze_count
&& !--sdp
->sd_freeze_count
)
434 gfs2_glock_dq_uninit(&sdp
->sd_freeze_gh
);
436 mutex_unlock(&sdp
->sd_freeze_lock
);