aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2
diff options
context:
space:
mode:
authorBenjamin Marzinski <bmarzins@redhat.com>2014-05-01 23:26:55 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2014-05-14 05:04:34 -0400
commit24972557b12ce8fd5b6c6847d0e2ee1837ddc13b (patch)
treefb82edff8bfab9d4d1c4df6dd7784dd3c9f85c1b /fs/gfs2
parent5a7c6690c2759d686d2c299402327e92ed92ab6c (diff)
GFS2: remove transaction glock
GFS2 has a transaction glock, which must be grabbed for every transaction, whose purpose is to deal with freezing the filesystem. Aside from this involving a large amount of locking, it is very easy to make the current fsfreeze code hang on unfreezing. This patch rewrites how gfs2 handles freezing the filesystem. The transaction glock is removed. In it's place is a freeze glock, which is cached (but not held) in a shared state by every node in the cluster when the filesystem is mounted. This lock only needs to be grabbed on freezing, and actions which need to be safe from freezing, like recovery. When a node wants to freeze the filesystem, it grabs this glock exclusively. When the freeze glock state changes on the nodes (either from shared to unlocked, or shared to exclusive), the filesystem does a special log flush. gfs2_log_flush() does all the work for flushing out the and shutting down the incore log, and then it tries to grab the freeze glock in a shared state again. Since the filesystem is stuck in gfs2_log_flush, no new transaction can start, and nothing can be written to disk. Unfreezing the filesytem simply involes dropping the freeze glock, allowing gfs2_log_flush() to grab and then release the shared lock, so it is cached for next time. However, in order for the unfreezing ioctl to occur, gfs2 needs to get a shared lock on the filesystem root directory inode to check permissions. If that glock has already been grabbed exclusively, fsfreeze will be unable to get the shared lock and unfreeze the filesystem. In order to allow the unfreeze, this patch makes gfs2 grab a shared lock on the filesystem root directory during the freeze, and hold it until it unfreezes the filesystem. The functions which need to grab a shared lock in order to allow the unfreeze ioctl to be issued now use the lock grabbed by the freeze code instead. The freeze and unfreeze code take care to make sure that this shared lock will not be dropped while another process is using it. Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2')
-rw-r--r--fs/gfs2/aops.c2
-rw-r--r--fs/gfs2/file.c2
-rw-r--r--fs/gfs2/glops.c51
-rw-r--r--fs/gfs2/glops.h2
-rw-r--r--fs/gfs2/incore.h12
-rw-r--r--fs/gfs2/inode.c40
-rw-r--r--fs/gfs2/log.c93
-rw-r--r--fs/gfs2/log.h11
-rw-r--r--fs/gfs2/ops_fstype.c22
-rw-r--r--fs/gfs2/quota.c2
-rw-r--r--fs/gfs2/recovery.c22
-rw-r--r--fs/gfs2/rgrp.c2
-rw-r--r--fs/gfs2/super.c69
-rw-r--r--fs/gfs2/sys.c4
-rw-r--r--fs/gfs2/trans.c44
15 files changed, 226 insertions, 152 deletions
diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c
index ce62dcac90b6..5a49b037da81 100644
--- a/fs/gfs2/aops.c
+++ b/fs/gfs2/aops.c
@@ -431,7 +431,7 @@ static int gfs2_jdata_writepages(struct address_space *mapping,
431 431
432 ret = gfs2_write_cache_jdata(mapping, wbc); 432 ret = gfs2_write_cache_jdata(mapping, wbc);
433 if (ret == 0 && wbc->sync_mode == WB_SYNC_ALL) { 433 if (ret == 0 && wbc->sync_mode == WB_SYNC_ALL) {
434 gfs2_log_flush(sdp, ip->i_gl); 434 gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH);
435 ret = gfs2_write_cache_jdata(mapping, wbc); 435 ret = gfs2_write_cache_jdata(mapping, wbc);
436 } 436 }
437 return ret; 437 return ret;
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index 80d67253623c..606525215acc 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -256,7 +256,7 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask)
256 } 256 }
257 if ((flags ^ new_flags) & GFS2_DIF_JDATA) { 257 if ((flags ^ new_flags) & GFS2_DIF_JDATA) {
258 if (flags & GFS2_DIF_JDATA) 258 if (flags & GFS2_DIF_JDATA)
259 gfs2_log_flush(sdp, ip->i_gl); 259 gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH);
260 error = filemap_fdatawrite(inode->i_mapping); 260 error = filemap_fdatawrite(inode->i_mapping);
261 if (error) 261 if (error)
262 goto out; 262 goto out;
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
index 54b66809e818..0b527939c46f 100644
--- a/fs/gfs2/glops.c
+++ b/fs/gfs2/glops.c
@@ -89,18 +89,23 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl)
89 if (!tr.tr_revokes) 89 if (!tr.tr_revokes)
90 return; 90 return;
91 91
92 /* A shortened, inline version of gfs2_trans_begin() */ 92 /* A shortened, inline version of gfs2_trans_begin()
93 * tr->alloced is not set since the transaction structure is
94 * on the stack */
93 tr.tr_reserved = 1 + gfs2_struct2blk(sdp, tr.tr_revokes, sizeof(u64)); 95 tr.tr_reserved = 1 + gfs2_struct2blk(sdp, tr.tr_revokes, sizeof(u64));
94 tr.tr_ip = (unsigned long)__builtin_return_address(0); 96 tr.tr_ip = (unsigned long)__builtin_return_address(0);
95 sb_start_intwrite(sdp->sd_vfs); 97 sb_start_intwrite(sdp->sd_vfs);
96 gfs2_log_reserve(sdp, tr.tr_reserved); 98 if (gfs2_log_reserve(sdp, tr.tr_reserved) < 0) {
99 sb_end_intwrite(sdp->sd_vfs);
100 return;
101 }
97 WARN_ON_ONCE(current->journal_info); 102 WARN_ON_ONCE(current->journal_info);
98 current->journal_info = &tr; 103 current->journal_info = &tr;
99 104
100 __gfs2_ail_flush(gl, 0, tr.tr_revokes); 105 __gfs2_ail_flush(gl, 0, tr.tr_revokes);
101 106
102 gfs2_trans_end(sdp); 107 gfs2_trans_end(sdp);
103 gfs2_log_flush(sdp, NULL); 108 gfs2_log_flush(sdp, NULL, NORMAL_FLUSH);
104} 109}
105 110
106void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) 111void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync)
@@ -121,7 +126,7 @@ void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync)
121 return; 126 return;
122 __gfs2_ail_flush(gl, fsync, max_revokes); 127 __gfs2_ail_flush(gl, fsync, max_revokes);
123 gfs2_trans_end(sdp); 128 gfs2_trans_end(sdp);
124 gfs2_log_flush(sdp, NULL); 129 gfs2_log_flush(sdp, NULL, NORMAL_FLUSH);
125} 130}
126 131
127/** 132/**
@@ -144,7 +149,7 @@ static void rgrp_go_sync(struct gfs2_glock *gl)
144 return; 149 return;
145 GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE); 150 GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE);
146 151
147 gfs2_log_flush(sdp, gl); 152 gfs2_log_flush(sdp, gl, NORMAL_FLUSH);
148 filemap_fdatawrite_range(mapping, gl->gl_vm.start, gl->gl_vm.end); 153 filemap_fdatawrite_range(mapping, gl->gl_vm.start, gl->gl_vm.end);
149 error = filemap_fdatawait_range(mapping, gl->gl_vm.start, gl->gl_vm.end); 154 error = filemap_fdatawait_range(mapping, gl->gl_vm.start, gl->gl_vm.end);
150 mapping_set_error(mapping, error); 155 mapping_set_error(mapping, error);
@@ -206,7 +211,7 @@ static void inode_go_sync(struct gfs2_glock *gl)
206 211
207 GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE); 212 GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE);
208 213
209 gfs2_log_flush(gl->gl_sbd, gl); 214 gfs2_log_flush(gl->gl_sbd, gl, NORMAL_FLUSH);
210 filemap_fdatawrite(metamapping); 215 filemap_fdatawrite(metamapping);
211 if (ip) { 216 if (ip) {
212 struct address_space *mapping = ip->i_inode.i_mapping; 217 struct address_space *mapping = ip->i_inode.i_mapping;
@@ -253,7 +258,7 @@ static void inode_go_inval(struct gfs2_glock *gl, int flags)
253 } 258 }
254 259
255 if (ip == GFS2_I(gl->gl_sbd->sd_rindex)) { 260 if (ip == GFS2_I(gl->gl_sbd->sd_rindex)) {
256 gfs2_log_flush(gl->gl_sbd, NULL); 261 gfs2_log_flush(gl->gl_sbd, NULL, NORMAL_FLUSH);
257 gl->gl_sbd->sd_rindex_uptodate = 0; 262 gl->gl_sbd->sd_rindex_uptodate = 0;
258 } 263 }
259 if (ip && S_ISREG(ip->i_inode.i_mode)) 264 if (ip && S_ISREG(ip->i_inode.i_mode))
@@ -455,31 +460,39 @@ static void inode_go_dump(struct seq_file *seq, const struct gfs2_glock *gl)
455} 460}
456 461
457/** 462/**
458 * trans_go_sync - promote/demote the transaction glock 463 * freeze_go_sync - promote/demote the freeze glock
459 * @gl: the glock 464 * @gl: the glock
460 * @state: the requested state 465 * @state: the requested state
461 * @flags: 466 * @flags:
462 * 467 *
463 */ 468 */
464 469
465static void trans_go_sync(struct gfs2_glock *gl) 470static void freeze_go_sync(struct gfs2_glock *gl)
466{ 471{
467 struct gfs2_sbd *sdp = gl->gl_sbd; 472 struct gfs2_sbd *sdp = gl->gl_sbd;
473 DEFINE_WAIT(wait);
468 474
469 if (gl->gl_state != LM_ST_UNLOCKED && 475 if (gl->gl_state == LM_ST_SHARED &&
470 test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) { 476 test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
471 gfs2_meta_syncfs(sdp); 477 atomic_set(&sdp->sd_log_freeze, 1);
472 gfs2_log_shutdown(sdp); 478 wake_up(&sdp->sd_logd_waitq);
479 do {
480 prepare_to_wait(&sdp->sd_log_frozen_wait, &wait,
481 TASK_UNINTERRUPTIBLE);
482 if (atomic_read(&sdp->sd_log_freeze))
483 io_schedule();
484 } while(atomic_read(&sdp->sd_log_freeze));
485 finish_wait(&sdp->sd_log_frozen_wait, &wait);
473 } 486 }
474} 487}
475 488
476/** 489/**
477 * trans_go_xmote_bh - After promoting/demoting the transaction glock 490 * freeze_go_xmote_bh - After promoting/demoting the freeze glock
478 * @gl: the glock 491 * @gl: the glock
479 * 492 *
480 */ 493 */
481 494
482static int trans_go_xmote_bh(struct gfs2_glock *gl, struct gfs2_holder *gh) 495static int freeze_go_xmote_bh(struct gfs2_glock *gl, struct gfs2_holder *gh)
483{ 496{
484 struct gfs2_sbd *sdp = gl->gl_sbd; 497 struct gfs2_sbd *sdp = gl->gl_sbd;
485 struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode); 498 struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode);
@@ -512,7 +525,7 @@ static int trans_go_xmote_bh(struct gfs2_glock *gl, struct gfs2_holder *gh)
512 * Always returns 0 525 * Always returns 0
513 */ 526 */
514 527
515static int trans_go_demote_ok(const struct gfs2_glock *gl) 528static int freeze_go_demote_ok(const struct gfs2_glock *gl)
516{ 529{
517 return 0; 530 return 0;
518} 531}
@@ -563,10 +576,10 @@ const struct gfs2_glock_operations gfs2_rgrp_glops = {
563 .go_flags = GLOF_LVB, 576 .go_flags = GLOF_LVB,
564}; 577};
565 578
566const struct gfs2_glock_operations gfs2_trans_glops = { 579const struct gfs2_glock_operations gfs2_freeze_glops = {
567 .go_sync = trans_go_sync, 580 .go_sync = freeze_go_sync,
568 .go_xmote_bh = trans_go_xmote_bh, 581 .go_xmote_bh = freeze_go_xmote_bh,
569 .go_demote_ok = trans_go_demote_ok, 582 .go_demote_ok = freeze_go_demote_ok,
570 .go_type = LM_TYPE_NONDISK, 583 .go_type = LM_TYPE_NONDISK,
571}; 584};
572 585
diff --git a/fs/gfs2/glops.h b/fs/gfs2/glops.h
index bf95a2dc1662..7455d2629bcb 100644
--- a/fs/gfs2/glops.h
+++ b/fs/gfs2/glops.h
@@ -15,7 +15,7 @@
15extern const struct gfs2_glock_operations gfs2_meta_glops; 15extern const struct gfs2_glock_operations gfs2_meta_glops;
16extern const struct gfs2_glock_operations gfs2_inode_glops; 16extern const struct gfs2_glock_operations gfs2_inode_glops;
17extern const struct gfs2_glock_operations gfs2_rgrp_glops; 17extern const struct gfs2_glock_operations gfs2_rgrp_glops;
18extern const struct gfs2_glock_operations gfs2_trans_glops; 18extern const struct gfs2_glock_operations gfs2_freeze_glops;
19extern const struct gfs2_glock_operations gfs2_iopen_glops; 19extern const struct gfs2_glock_operations gfs2_iopen_glops;
20extern const struct gfs2_glock_operations gfs2_flock_glops; 20extern const struct gfs2_glock_operations gfs2_flock_glops;
21extern const struct gfs2_glock_operations gfs2_nondisk_glops; 21extern const struct gfs2_glock_operations gfs2_nondisk_glops;
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index bdf70c18610c..2434a96f95df 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -465,9 +465,7 @@ struct gfs2_trans {
465 unsigned int tr_reserved; 465 unsigned int tr_reserved;
466 unsigned int tr_touched:1; 466 unsigned int tr_touched:1;
467 unsigned int tr_attached:1; 467 unsigned int tr_attached:1;
468 468 unsigned int tr_alloced:1;
469 struct gfs2_holder tr_t_gh;
470
471 469
472 unsigned int tr_num_buf_new; 470 unsigned int tr_num_buf_new;
473 unsigned int tr_num_databuf_new; 471 unsigned int tr_num_databuf_new;
@@ -682,7 +680,7 @@ struct gfs2_sbd {
682 struct lm_lockstruct sd_lockstruct; 680 struct lm_lockstruct sd_lockstruct;
683 struct gfs2_holder sd_live_gh; 681 struct gfs2_holder sd_live_gh;
684 struct gfs2_glock *sd_rename_gl; 682 struct gfs2_glock *sd_rename_gl;
685 struct gfs2_glock *sd_trans_gl; 683 struct gfs2_glock *sd_freeze_gl;
686 wait_queue_head_t sd_glock_wait; 684 wait_queue_head_t sd_glock_wait;
687 atomic_t sd_glock_disposal; 685 atomic_t sd_glock_disposal;
688 struct completion sd_locking_init; 686 struct completion sd_locking_init;
@@ -794,6 +792,12 @@ struct gfs2_sbd {
794 792
795 /* For quiescing the filesystem */ 793 /* For quiescing the filesystem */
796 struct gfs2_holder sd_freeze_gh; 794 struct gfs2_holder sd_freeze_gh;
795 struct gfs2_holder sd_freeze_root_gh;
796 struct gfs2_holder sd_thaw_gh;
797 atomic_t sd_log_freeze;
798 atomic_t sd_frozen_root;
799 wait_queue_head_t sd_frozen_root_wait;
800 wait_queue_head_t sd_log_frozen_wait;
797 801
798 char sd_fsname[GFS2_FSNAME_LEN]; 802 char sd_fsname[GFS2_FSNAME_LEN];
799 char sd_table_name[GFS2_FSNAME_LEN]; 803 char sd_table_name[GFS2_FSNAME_LEN];
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 28cc7bf6575a..e62e59477884 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -1613,18 +1613,26 @@ int gfs2_permission(struct inode *inode, int mask)
1613{ 1613{
1614 struct gfs2_inode *ip; 1614 struct gfs2_inode *ip;
1615 struct gfs2_holder i_gh; 1615 struct gfs2_holder i_gh;
1616 struct gfs2_sbd *sdp = GFS2_SB(inode);
1616 int error; 1617 int error;
1617 int unlock = 0; 1618 int unlock = 0;
1619 int frozen_root = 0;
1618 1620
1619 1621
1620 ip = GFS2_I(inode); 1622 ip = GFS2_I(inode);
1621 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) { 1623 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
1622 if (mask & MAY_NOT_BLOCK) 1624 if (unlikely(gfs2_glock_is_held_excl(sdp->sd_freeze_gl) &&
1623 return -ECHILD; 1625 inode == sdp->sd_root_dir->d_inode &&
1624 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh); 1626 atomic_inc_not_zero(&sdp->sd_frozen_root)))
1625 if (error) 1627 frozen_root = 1;
1626 return error; 1628 else {
1627 unlock = 1; 1629 if (mask & MAY_NOT_BLOCK)
1630 return -ECHILD;
1631 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
1632 if (error)
1633 return error;
1634 unlock = 1;
1635 }
1628 } 1636 }
1629 1637
1630 if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode)) 1638 if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode))
@@ -1633,6 +1641,8 @@ int gfs2_permission(struct inode *inode, int mask)
1633 error = generic_permission(inode, mask); 1641 error = generic_permission(inode, mask);
1634 if (unlock) 1642 if (unlock)
1635 gfs2_glock_dq_uninit(&i_gh); 1643 gfs2_glock_dq_uninit(&i_gh);
1644 else if (frozen_root && atomic_dec_and_test(&sdp->sd_frozen_root))
1645 wake_up(&sdp->sd_frozen_root_wait);
1636 1646
1637 return error; 1647 return error;
1638} 1648}
@@ -1805,19 +1815,29 @@ static int gfs2_getattr(struct vfsmount *mnt, struct dentry *dentry,
1805 struct inode *inode = dentry->d_inode; 1815 struct inode *inode = dentry->d_inode;
1806 struct gfs2_inode *ip = GFS2_I(inode); 1816 struct gfs2_inode *ip = GFS2_I(inode);
1807 struct gfs2_holder gh; 1817 struct gfs2_holder gh;
1818 struct gfs2_sbd *sdp = GFS2_SB(inode);
1808 int error; 1819 int error;
1809 int unlock = 0; 1820 int unlock = 0;
1821 int frozen_root = 0;
1810 1822
1811 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) { 1823 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
1812 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); 1824 if (unlikely(gfs2_glock_is_held_excl(sdp->sd_freeze_gl) &&
1813 if (error) 1825 inode == sdp->sd_root_dir->d_inode &&
1814 return error; 1826 atomic_inc_not_zero(&sdp->sd_frozen_root)))
1815 unlock = 1; 1827 frozen_root = 1;
1828 else {
1829 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
1830 if (error)
1831 return error;
1832 unlock = 1;
1833 }
1816 } 1834 }
1817 1835
1818 generic_fillattr(inode, stat); 1836 generic_fillattr(inode, stat);
1819 if (unlock) 1837 if (unlock)
1820 gfs2_glock_dq_uninit(&gh); 1838 gfs2_glock_dq_uninit(&gh);
1839 else if (frozen_root && atomic_dec_and_test(&sdp->sd_frozen_root))
1840 wake_up(&sdp->sd_frozen_root_wait);
1821 1841
1822 return 0; 1842 return 0;
1823} 1843}
diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index 4a14d504ef83..3966fadbcebd 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -301,6 +301,23 @@ static void ail2_empty(struct gfs2_sbd *sdp, unsigned int new_tail)
301} 301}
302 302
303/** 303/**
304 * gfs2_log_release - Release a given number of log blocks
305 * @sdp: The GFS2 superblock
306 * @blks: The number of blocks
307 *
308 */
309
310void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks)
311{
312
313 atomic_add(blks, &sdp->sd_log_blks_free);
314 trace_gfs2_log_blocks(sdp, blks);
315 gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <=
316 sdp->sd_jdesc->jd_blocks);
317 up_read(&sdp->sd_log_flush_lock);
318}
319
320/**
304 * gfs2_log_reserve - Make a log reservation 321 * gfs2_log_reserve - Make a log reservation
305 * @sdp: The GFS2 superblock 322 * @sdp: The GFS2 superblock
306 * @blks: The number of blocks to reserve 323 * @blks: The number of blocks to reserve
@@ -358,7 +375,10 @@ retry:
358 wake_up(&sdp->sd_log_waitq); 375 wake_up(&sdp->sd_log_waitq);
359 376
360 down_read(&sdp->sd_log_flush_lock); 377 down_read(&sdp->sd_log_flush_lock);
361 378 if (unlikely(!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))) {
379 gfs2_log_release(sdp, blks);
380 return -EROFS;
381 }
362 return 0; 382 return 0;
363} 383}
364 384
@@ -671,7 +691,8 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags)
671 * 691 *
672 */ 692 */
673 693
674void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl) 694void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl,
695 enum gfs2_flush_type type)
675{ 696{
676 struct gfs2_trans *tr; 697 struct gfs2_trans *tr;
677 698
@@ -723,6 +744,42 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl)
723 } 744 }
724 spin_unlock(&sdp->sd_ail_lock); 745 spin_unlock(&sdp->sd_ail_lock);
725 gfs2_log_unlock(sdp); 746 gfs2_log_unlock(sdp);
747
748 if (atomic_read(&sdp->sd_log_freeze))
749 type = FREEZE_FLUSH;
750 if (type != NORMAL_FLUSH) {
751 if (!sdp->sd_log_idle) {
752 for (;;) {
753 gfs2_ail1_start(sdp);
754 gfs2_ail1_wait(sdp);
755 if (gfs2_ail1_empty(sdp))
756 break;
757 }
758 atomic_dec(&sdp->sd_log_blks_free); /* Adjust for unreserved buffer */
759 trace_gfs2_log_blocks(sdp, -1);
760 sdp->sd_log_flush_wrapped = 0;
761 log_write_header(sdp, 0);
762 sdp->sd_log_head = sdp->sd_log_flush_head;
763 }
764 if (type == SHUTDOWN_FLUSH || type == FREEZE_FLUSH)
765 gfs2_log_shutdown(sdp);
766 if (type == FREEZE_FLUSH) {
767 int error;
768
769 atomic_set(&sdp->sd_log_freeze, 0);
770 wake_up(&sdp->sd_log_frozen_wait);
771 error = gfs2_glock_nq_init(sdp->sd_freeze_gl,
772 LM_ST_SHARED, 0,
773 &sdp->sd_thaw_gh);
774 if (error) {
775 printk(KERN_INFO "GFS2: couln't get freeze lock : %d\n", error);
776 gfs2_assert_withdraw(sdp, 0);
777 }
778 else
779 gfs2_glock_dq_uninit(&sdp->sd_thaw_gh);
780 }
781 }
782
726 trace_gfs2_log_flush(sdp, 0); 783 trace_gfs2_log_flush(sdp, 0);
727 up_write(&sdp->sd_log_flush_lock); 784 up_write(&sdp->sd_log_flush_lock);
728 785
@@ -761,7 +818,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
761 if (sdp->sd_log_tr) { 818 if (sdp->sd_log_tr) {
762 gfs2_merge_trans(sdp->sd_log_tr, tr); 819 gfs2_merge_trans(sdp->sd_log_tr, tr);
763 } else if (tr->tr_num_buf_new || tr->tr_num_databuf_new) { 820 } else if (tr->tr_num_buf_new || tr->tr_num_databuf_new) {
764 gfs2_assert_withdraw(sdp, tr->tr_t_gh.gh_gl); 821 gfs2_assert_withdraw(sdp, tr->tr_alloced);
765 sdp->sd_log_tr = tr; 822 sdp->sd_log_tr = tr;
766 tr->tr_attached = 1; 823 tr->tr_attached = 1;
767 } 824 }
@@ -813,8 +870,6 @@ void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
813 870
814void gfs2_log_shutdown(struct gfs2_sbd *sdp) 871void gfs2_log_shutdown(struct gfs2_sbd *sdp)
815{ 872{
816 down_write(&sdp->sd_log_flush_lock);
817
818 gfs2_assert_withdraw(sdp, !sdp->sd_log_blks_reserved); 873 gfs2_assert_withdraw(sdp, !sdp->sd_log_blks_reserved);
819 gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke); 874 gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke);
820 gfs2_assert_withdraw(sdp, list_empty(&sdp->sd_ail1_list)); 875 gfs2_assert_withdraw(sdp, list_empty(&sdp->sd_ail1_list));
@@ -824,38 +879,16 @@ void gfs2_log_shutdown(struct gfs2_sbd *sdp)
824 879
825 log_write_header(sdp, GFS2_LOG_HEAD_UNMOUNT); 880 log_write_header(sdp, GFS2_LOG_HEAD_UNMOUNT);
826 881
827 gfs2_assert_warn(sdp, atomic_read(&sdp->sd_log_blks_free) == sdp->sd_jdesc->jd_blocks);
828 gfs2_assert_warn(sdp, sdp->sd_log_head == sdp->sd_log_tail); 882 gfs2_assert_warn(sdp, sdp->sd_log_head == sdp->sd_log_tail);
829 gfs2_assert_warn(sdp, list_empty(&sdp->sd_ail2_list)); 883 gfs2_assert_warn(sdp, list_empty(&sdp->sd_ail2_list));
830 884
831 sdp->sd_log_head = sdp->sd_log_flush_head; 885 sdp->sd_log_head = sdp->sd_log_flush_head;
832 sdp->sd_log_tail = sdp->sd_log_head; 886 sdp->sd_log_tail = sdp->sd_log_head;
833
834 up_write(&sdp->sd_log_flush_lock);
835}
836
837
838/**
839 * gfs2_meta_syncfs - sync all the buffers in a filesystem
840 * @sdp: the filesystem
841 *
842 */
843
844void gfs2_meta_syncfs(struct gfs2_sbd *sdp)
845{
846 gfs2_log_flush(sdp, NULL);
847 for (;;) {
848 gfs2_ail1_start(sdp);
849 gfs2_ail1_wait(sdp);
850 if (gfs2_ail1_empty(sdp))
851 break;
852 }
853 gfs2_log_flush(sdp, NULL);
854} 887}
855 888
856static inline int gfs2_jrnl_flush_reqd(struct gfs2_sbd *sdp) 889static inline int gfs2_jrnl_flush_reqd(struct gfs2_sbd *sdp)
857{ 890{
858 return (atomic_read(&sdp->sd_log_pinned) >= atomic_read(&sdp->sd_log_thresh1)); 891 return (atomic_read(&sdp->sd_log_pinned) >= atomic_read(&sdp->sd_log_thresh1) || atomic_read(&sdp->sd_log_freeze));
859} 892}
860 893
861static inline int gfs2_ail_flush_reqd(struct gfs2_sbd *sdp) 894static inline int gfs2_ail_flush_reqd(struct gfs2_sbd *sdp)
@@ -882,14 +915,14 @@ int gfs2_logd(void *data)
882 915
883 if (gfs2_jrnl_flush_reqd(sdp) || t == 0) { 916 if (gfs2_jrnl_flush_reqd(sdp) || t == 0) {
884 gfs2_ail1_empty(sdp); 917 gfs2_ail1_empty(sdp);
885 gfs2_log_flush(sdp, NULL); 918 gfs2_log_flush(sdp, NULL, NORMAL_FLUSH);
886 } 919 }
887 920
888 if (gfs2_ail_flush_reqd(sdp)) { 921 if (gfs2_ail_flush_reqd(sdp)) {
889 gfs2_ail1_start(sdp); 922 gfs2_ail1_start(sdp);
890 gfs2_ail1_wait(sdp); 923 gfs2_ail1_wait(sdp);
891 gfs2_ail1_empty(sdp); 924 gfs2_ail1_empty(sdp);
892 gfs2_log_flush(sdp, NULL); 925 gfs2_log_flush(sdp, NULL, NORMAL_FLUSH);
893 } 926 }
894 927
895 if (!gfs2_ail_flush_reqd(sdp)) 928 if (!gfs2_ail_flush_reqd(sdp))
diff --git a/fs/gfs2/log.h b/fs/gfs2/log.h
index 37216634f0aa..9499a6049212 100644
--- a/fs/gfs2/log.h
+++ b/fs/gfs2/log.h
@@ -63,14 +63,21 @@ extern void gfs2_ordered_del_inode(struct gfs2_inode *ip);
63extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct, 63extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct,
64 unsigned int ssize); 64 unsigned int ssize);
65 65
66extern void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks);
66extern int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks); 67extern int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks);
67extern void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl); 68enum gfs2_flush_type {
69 NORMAL_FLUSH = 0,
70 SYNC_FLUSH,
71 SHUTDOWN_FLUSH,
72 FREEZE_FLUSH
73};
74extern void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl,
75 enum gfs2_flush_type type);
68extern void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *trans); 76extern void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *trans);
69extern void gfs2_remove_from_ail(struct gfs2_bufdata *bd); 77extern void gfs2_remove_from_ail(struct gfs2_bufdata *bd);
70extern void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct writeback_control *wbc); 78extern void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct writeback_control *wbc);
71 79
72extern void gfs2_log_shutdown(struct gfs2_sbd *sdp); 80extern void gfs2_log_shutdown(struct gfs2_sbd *sdp);
73extern void gfs2_meta_syncfs(struct gfs2_sbd *sdp);
74extern int gfs2_logd(void *data); 81extern int gfs2_logd(void *data);
75extern void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd); 82extern void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd);
76extern void gfs2_write_revokes(struct gfs2_sbd *sdp); 83extern void gfs2_write_revokes(struct gfs2_sbd *sdp);
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index 22f954051bb8..be45c79f6745 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -129,6 +129,10 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
129 init_rwsem(&sdp->sd_log_flush_lock); 129 init_rwsem(&sdp->sd_log_flush_lock);
130 atomic_set(&sdp->sd_log_in_flight, 0); 130 atomic_set(&sdp->sd_log_in_flight, 0);
131 init_waitqueue_head(&sdp->sd_log_flush_wait); 131 init_waitqueue_head(&sdp->sd_log_flush_wait);
132 init_waitqueue_head(&sdp->sd_log_frozen_wait);
133 atomic_set(&sdp->sd_log_freeze, 0);
134 atomic_set(&sdp->sd_frozen_root, 0);
135 init_waitqueue_head(&sdp->sd_frozen_root_wait);
132 136
133 return sdp; 137 return sdp;
134} 138}
@@ -419,8 +423,8 @@ static int init_locking(struct gfs2_sbd *sdp, struct gfs2_holder *mount_gh,
419 goto fail_live; 423 goto fail_live;
420 } 424 }
421 425
422 error = gfs2_glock_get(sdp, GFS2_TRANS_LOCK, &gfs2_trans_glops, 426 error = gfs2_glock_get(sdp, GFS2_FREEZE_LOCK, &gfs2_freeze_glops,
423 CREATE, &sdp->sd_trans_gl); 427 CREATE, &sdp->sd_freeze_gl);
424 if (error) { 428 if (error) {
425 fs_err(sdp, "can't create transaction glock: %d\n", error); 429 fs_err(sdp, "can't create transaction glock: %d\n", error);
426 goto fail_rename; 430 goto fail_rename;
@@ -429,7 +433,7 @@ static int init_locking(struct gfs2_sbd *sdp, struct gfs2_holder *mount_gh,
429 return 0; 433 return 0;
430 434
431fail_trans: 435fail_trans:
432 gfs2_glock_put(sdp->sd_trans_gl); 436 gfs2_glock_put(sdp->sd_freeze_gl);
433fail_rename: 437fail_rename:
434 gfs2_glock_put(sdp->sd_rename_gl); 438 gfs2_glock_put(sdp->sd_rename_gl);
435fail_live: 439fail_live:
@@ -755,7 +759,15 @@ static int init_journal(struct gfs2_sbd *sdp, int undo)
755 set_bit(SDF_JOURNAL_CHECKED, &sdp->sd_flags); 759 set_bit(SDF_JOURNAL_CHECKED, &sdp->sd_flags);
756 gfs2_glock_dq_uninit(&ji_gh); 760 gfs2_glock_dq_uninit(&ji_gh);
757 jindex = 0; 761 jindex = 0;
758 762 if (!sdp->sd_args.ar_spectator) {
763 error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, 0,
764 &sdp->sd_thaw_gh);
765 if (error) {
766 fs_err(sdp, "can't acquire freeze glock: %d\n", error);
767 goto fail_jinode_gh;
768 }
769 }
770 gfs2_glock_dq_uninit(&sdp->sd_thaw_gh);
759 return 0; 771 return 0;
760 772
761fail_jinode_gh: 773fail_jinode_gh:
@@ -1380,7 +1392,7 @@ static void gfs2_kill_sb(struct super_block *sb)
1380 return; 1392 return;
1381 } 1393 }
1382 1394
1383 gfs2_meta_syncfs(sdp); 1395 gfs2_log_flush(sdp, NULL, SYNC_FLUSH);
1384 dput(sdp->sd_root_dir); 1396 dput(sdp->sd_root_dir);
1385 dput(sdp->sd_master_dir); 1397 dput(sdp->sd_master_dir);
1386 sdp->sd_root_dir = NULL; 1398 sdp->sd_root_dir = NULL;
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
index 619389649d03..64b29f7f6b4c 100644
--- a/fs/gfs2/quota.c
+++ b/fs/gfs2/quota.c
@@ -880,7 +880,7 @@ out:
880 gfs2_glock_dq_uninit(&ghs[qx]); 880 gfs2_glock_dq_uninit(&ghs[qx]);
881 mutex_unlock(&ip->i_inode.i_mutex); 881 mutex_unlock(&ip->i_inode.i_mutex);
882 kfree(ghs); 882 kfree(ghs);
883 gfs2_log_flush(ip->i_gl->gl_sbd, ip->i_gl); 883 gfs2_log_flush(ip->i_gl->gl_sbd, ip->i_gl, NORMAL_FLUSH);
884 return error; 884 return error;
885} 885}
886 886
diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c
index 7ad4094d68c0..a4ed78b5f47e 100644
--- a/fs/gfs2/recovery.c
+++ b/fs/gfs2/recovery.c
@@ -454,7 +454,7 @@ void gfs2_recover_func(struct work_struct *work)
454 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); 454 struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
455 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 455 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
456 struct gfs2_log_header_host head; 456 struct gfs2_log_header_host head;
457 struct gfs2_holder j_gh, ji_gh, t_gh; 457 struct gfs2_holder j_gh, ji_gh, thaw_gh;
458 unsigned long t; 458 unsigned long t;
459 int ro = 0; 459 int ro = 0;
460 unsigned int pass; 460 unsigned int pass;
@@ -508,11 +508,11 @@ void gfs2_recover_func(struct work_struct *work)
508 508
509 t = jiffies; 509 t = jiffies;
510 510
511 /* Acquire a shared hold on the transaction lock */ 511 /* Acquire a shared hold on the freeze lock */
512 512
513 error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, 513 error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED,
514 LM_FLAG_NOEXP | LM_FLAG_PRIORITY | 514 LM_FLAG_NOEXP | LM_FLAG_PRIORITY,
515 GL_NOCACHE, &t_gh); 515 &thaw_gh);
516 if (error) 516 if (error)
517 goto fail_gunlock_ji; 517 goto fail_gunlock_ji;
518 518
@@ -538,7 +538,7 @@ void gfs2_recover_func(struct work_struct *work)
538 fs_warn(sdp, "jid=%u: Can't replay: read-only block " 538 fs_warn(sdp, "jid=%u: Can't replay: read-only block "
539 "device\n", jd->jd_jid); 539 "device\n", jd->jd_jid);
540 error = -EROFS; 540 error = -EROFS;
541 goto fail_gunlock_tr; 541 goto fail_gunlock_thaw;
542 } 542 }
543 543
544 fs_info(sdp, "jid=%u: Replaying journal...\n", jd->jd_jid); 544 fs_info(sdp, "jid=%u: Replaying journal...\n", jd->jd_jid);
@@ -549,14 +549,14 @@ void gfs2_recover_func(struct work_struct *work)
549 head.lh_blkno, pass); 549 head.lh_blkno, pass);
550 lops_after_scan(jd, error, pass); 550 lops_after_scan(jd, error, pass);
551 if (error) 551 if (error)
552 goto fail_gunlock_tr; 552 goto fail_gunlock_thaw;
553 } 553 }
554 554
555 error = clean_journal(jd, &head); 555 error = clean_journal(jd, &head);
556 if (error) 556 if (error)
557 goto fail_gunlock_tr; 557 goto fail_gunlock_thaw;
558 558
559 gfs2_glock_dq_uninit(&t_gh); 559 gfs2_glock_dq_uninit(&thaw_gh);
560 t = DIV_ROUND_UP(jiffies - t, HZ); 560 t = DIV_ROUND_UP(jiffies - t, HZ);
561 fs_info(sdp, "jid=%u: Journal replayed in %lus\n", 561 fs_info(sdp, "jid=%u: Journal replayed in %lus\n",
562 jd->jd_jid, t); 562 jd->jd_jid, t);
@@ -572,8 +572,8 @@ void gfs2_recover_func(struct work_struct *work)
572 fs_info(sdp, "jid=%u: Done\n", jd->jd_jid); 572 fs_info(sdp, "jid=%u: Done\n", jd->jd_jid);
573 goto done; 573 goto done;
574 574
575fail_gunlock_tr: 575fail_gunlock_thaw:
576 gfs2_glock_dq_uninit(&t_gh); 576 gfs2_glock_dq_uninit(&thaw_gh);
577fail_gunlock_ji: 577fail_gunlock_ji:
578 if (jlocked) { 578 if (jlocked) {
579 gfs2_glock_dq_uninit(&ji_gh); 579 gfs2_glock_dq_uninit(&ji_gh);
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 281a7716e3f3..db629d1bd1bd 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -2001,7 +2001,7 @@ next_rgrp:
2001 } 2001 }
2002 /* Flushing the log may release space */ 2002 /* Flushing the log may release space */
2003 if (loops == 2) 2003 if (loops == 2)
2004 gfs2_log_flush(sdp, NULL); 2004 gfs2_log_flush(sdp, NULL, NORMAL_FLUSH);
2005 } 2005 }
2006 2006
2007 return -ENOSPC; 2007 return -ENOSPC;
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index de8afad89e51..1319b5c4ec68 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -399,7 +399,7 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
399{ 399{
400 struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode); 400 struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode);
401 struct gfs2_glock *j_gl = ip->i_gl; 401 struct gfs2_glock *j_gl = ip->i_gl;
402 struct gfs2_holder t_gh; 402 struct gfs2_holder thaw_gh;
403 struct gfs2_log_header_host head; 403 struct gfs2_log_header_host head;
404 int error; 404 int error;
405 405
@@ -407,7 +407,8 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
407 if (error) 407 if (error)
408 return error; 408 return error;
409 409
410 error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, 0, &t_gh); 410 error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, 0,
411 &thaw_gh);
411 if (error) 412 if (error)
412 goto fail_threads; 413 goto fail_threads;
413 414
@@ -433,13 +434,13 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
433 434
434 set_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags); 435 set_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);
435 436
436 gfs2_glock_dq_uninit(&t_gh); 437 gfs2_glock_dq_uninit(&thaw_gh);
437 438
438 return 0; 439 return 0;
439 440
440fail: 441fail:
441 t_gh.gh_flags |= GL_NOCACHE; 442 thaw_gh.gh_flags |= GL_NOCACHE;
442 gfs2_glock_dq_uninit(&t_gh); 443 gfs2_glock_dq_uninit(&thaw_gh);
443fail_threads: 444fail_threads:
444 kthread_stop(sdp->sd_quotad_process); 445 kthread_stop(sdp->sd_quotad_process);
445 kthread_stop(sdp->sd_logd_process); 446 kthread_stop(sdp->sd_logd_process);
@@ -635,15 +636,21 @@ struct lfcc {
635 */ 636 */
636 637
637static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp, 638static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp,
638 struct gfs2_holder *t_gh) 639 struct gfs2_holder *freeze_gh)
639{ 640{
640 struct gfs2_inode *ip; 641 struct gfs2_inode *ip;
641 struct gfs2_jdesc *jd; 642 struct gfs2_jdesc *jd;
642 struct lfcc *lfcc; 643 struct lfcc *lfcc;
643 LIST_HEAD(list); 644 LIST_HEAD(list);
644 struct gfs2_log_header_host lh; 645 struct gfs2_log_header_host lh;
646 struct gfs2_inode *dip = GFS2_I(sdp->sd_root_dir->d_inode);
645 int error; 647 int error;
646 648
649 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0,
650 &sdp->sd_freeze_root_gh);
651 if (error)
652 return error;
653 atomic_set(&sdp->sd_frozen_root, 1);
647 list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) { 654 list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) {
648 lfcc = kmalloc(sizeof(struct lfcc), GFP_KERNEL); 655 lfcc = kmalloc(sizeof(struct lfcc), GFP_KERNEL);
649 if (!lfcc) { 656 if (!lfcc) {
@@ -659,8 +666,8 @@ static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp,
659 list_add(&lfcc->list, &list); 666 list_add(&lfcc->list, &list);
660 } 667 }
661 668
662 error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_DEFERRED, 669 error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_EXCLUSIVE,
663 GL_NOCACHE, t_gh); 670 GL_NOCACHE, freeze_gh);
664 671
665 list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) { 672 list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) {
666 error = gfs2_jdesc_check(jd); 673 error = gfs2_jdesc_check(jd);
@@ -676,7 +683,7 @@ static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp,
676 } 683 }
677 684
678 if (error) 685 if (error)
679 gfs2_glock_dq_uninit(t_gh); 686 gfs2_glock_dq_uninit(freeze_gh);
680 687
681out: 688out:
682 while (!list_empty(&list)) { 689 while (!list_empty(&list)) {
@@ -685,6 +692,11 @@ out:
685 gfs2_glock_dq_uninit(&lfcc->gh); 692 gfs2_glock_dq_uninit(&lfcc->gh);
686 kfree(lfcc); 693 kfree(lfcc);
687 } 694 }
695 if (error) {
696 atomic_dec(&sdp->sd_frozen_root);
697 wait_event(sdp->sd_frozen_root_wait, atomic_read(&sdp->sd_frozen_root) == 0);
698 gfs2_glock_dq_uninit(&sdp->sd_freeze_root_gh);
699 }
688 return error; 700 return error;
689} 701}
690 702
@@ -742,7 +754,7 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)
742 int ret = 0; 754 int ret = 0;
743 755
744 if (wbc->sync_mode == WB_SYNC_ALL) 756 if (wbc->sync_mode == WB_SYNC_ALL)
745 gfs2_log_flush(GFS2_SB(inode), ip->i_gl); 757 gfs2_log_flush(GFS2_SB(inode), ip->i_gl, NORMAL_FLUSH);
746 if (bdi->dirty_exceeded) 758 if (bdi->dirty_exceeded)
747 gfs2_ail1_flush(sdp, wbc); 759 gfs2_ail1_flush(sdp, wbc);
748 else 760 else
@@ -822,9 +834,18 @@ out:
822 834
823static int gfs2_make_fs_ro(struct gfs2_sbd *sdp) 835static int gfs2_make_fs_ro(struct gfs2_sbd *sdp)
824{ 836{
825 struct gfs2_holder t_gh; 837 struct gfs2_holder thaw_gh;
826 int error; 838 int error;
827 839
840 error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, GL_NOCACHE,
841 &thaw_gh);
842 if (error && !test_bit(SDF_SHUTDOWN, &sdp->sd_flags))
843 return error;
844
845 down_write(&sdp->sd_log_flush_lock);
846 clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);
847 up_write(&sdp->sd_log_flush_lock);
848
828 kthread_stop(sdp->sd_quotad_process); 849 kthread_stop(sdp->sd_quotad_process);
829 kthread_stop(sdp->sd_logd_process); 850 kthread_stop(sdp->sd_logd_process);
830 851
@@ -832,18 +853,11 @@ static int gfs2_make_fs_ro(struct gfs2_sbd *sdp)
832 gfs2_quota_sync(sdp->sd_vfs, 0); 853 gfs2_quota_sync(sdp->sd_vfs, 0);
833 gfs2_statfs_sync(sdp->sd_vfs, 0); 854 gfs2_statfs_sync(sdp->sd_vfs, 0);
834 855
835 error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, GL_NOCACHE, 856 gfs2_log_flush(sdp, NULL, SHUTDOWN_FLUSH);
836 &t_gh); 857 gfs2_assert_warn(sdp, atomic_read(&sdp->sd_log_blks_free) == sdp->sd_jdesc->jd_blocks);
837 if (error && !test_bit(SDF_SHUTDOWN, &sdp->sd_flags))
838 return error;
839
840 gfs2_meta_syncfs(sdp);
841 gfs2_log_shutdown(sdp);
842
843 clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);
844 858
845 if (t_gh.gh_gl) 859 if (thaw_gh.gh_gl)
846 gfs2_glock_dq_uninit(&t_gh); 860 gfs2_glock_dq_uninit(&thaw_gh);
847 861
848 gfs2_quota_cleanup(sdp); 862 gfs2_quota_cleanup(sdp);
849 863
@@ -900,7 +914,7 @@ restart:
900 iput(sdp->sd_quota_inode); 914 iput(sdp->sd_quota_inode);
901 915
902 gfs2_glock_put(sdp->sd_rename_gl); 916 gfs2_glock_put(sdp->sd_rename_gl);
903 gfs2_glock_put(sdp->sd_trans_gl); 917 gfs2_glock_put(sdp->sd_freeze_gl);
904 918
905 if (!sdp->sd_args.ar_spectator) { 919 if (!sdp->sd_args.ar_spectator) {
906 gfs2_glock_dq_uninit(&sdp->sd_journal_gh); 920 gfs2_glock_dq_uninit(&sdp->sd_journal_gh);
@@ -935,8 +949,8 @@ static int gfs2_sync_fs(struct super_block *sb, int wait)
935 struct gfs2_sbd *sdp = sb->s_fs_info; 949 struct gfs2_sbd *sdp = sb->s_fs_info;
936 950
937 gfs2_quota_sync(sb, -1); 951 gfs2_quota_sync(sb, -1);
938 if (wait && sdp) 952 if (wait && sdp && !atomic_read(&sdp->sd_log_freeze))
939 gfs2_log_flush(sdp, NULL); 953 gfs2_log_flush(sdp, NULL, NORMAL_FLUSH);
940 return 0; 954 return 0;
941} 955}
942 956
@@ -986,6 +1000,9 @@ static int gfs2_unfreeze(struct super_block *sb)
986 struct gfs2_sbd *sdp = sb->s_fs_info; 1000 struct gfs2_sbd *sdp = sb->s_fs_info;
987 1001
988 gfs2_glock_dq_uninit(&sdp->sd_freeze_gh); 1002 gfs2_glock_dq_uninit(&sdp->sd_freeze_gh);
1003 atomic_dec(&sdp->sd_frozen_root);
1004 wait_event(sdp->sd_frozen_root_wait, atomic_read(&sdp->sd_frozen_root) == 0);
1005 gfs2_glock_dq_uninit(&sdp->sd_freeze_root_gh);
989 return 0; 1006 return 0;
990} 1007}
991 1008
@@ -1525,7 +1542,7 @@ static void gfs2_evict_inode(struct inode *inode)
1525 goto out_unlock; 1542 goto out_unlock;
1526 1543
1527out_truncate: 1544out_truncate:
1528 gfs2_log_flush(sdp, ip->i_gl); 1545 gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH);
1529 if (test_bit(GLF_DIRTY, &ip->i_gl->gl_flags)) { 1546 if (test_bit(GLF_DIRTY, &ip->i_gl->gl_flags)) {
1530 struct address_space *metamapping = gfs2_glock2aspace(ip->i_gl); 1547 struct address_space *metamapping = gfs2_glock2aspace(ip->i_gl);
1531 filemap_fdatawrite(metamapping); 1548 filemap_fdatawrite(metamapping);
diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c
index de25d5577e5d..7bc17edcb51f 100644
--- a/fs/gfs2/sys.c
+++ b/fs/gfs2/sys.c
@@ -240,8 +240,8 @@ static ssize_t demote_rq_store(struct gfs2_sbd *sdp, const char *buf, size_t len
240 240
241 if (gltype > LM_TYPE_JOURNAL) 241 if (gltype > LM_TYPE_JOURNAL)
242 return -EINVAL; 242 return -EINVAL;
243 if (gltype == LM_TYPE_NONDISK && glnum == GFS2_TRANS_LOCK) 243 if (gltype == LM_TYPE_NONDISK && glnum == GFS2_FREEZE_LOCK)
244 glops = &gfs2_trans_glops; 244 glops = &gfs2_freeze_glops;
245 else 245 else
246 glops = gfs2_glops_list[gltype]; 246 glops = gfs2_glops_list[gltype];
247 if (glops == NULL) 247 if (glops == NULL)
diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c
index bead90d27bad..0546ab4e28e8 100644
--- a/fs/gfs2/trans.c
+++ b/fs/gfs2/trans.c
@@ -48,6 +48,7 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,
48 tr->tr_blocks = blocks; 48 tr->tr_blocks = blocks;
49 tr->tr_revokes = revokes; 49 tr->tr_revokes = revokes;
50 tr->tr_reserved = 1; 50 tr->tr_reserved = 1;
51 tr->tr_alloced = 1;
51 if (blocks) 52 if (blocks)
52 tr->tr_reserved += 6 + blocks; 53 tr->tr_reserved += 6 + blocks;
53 if (revokes) 54 if (revokes)
@@ -57,48 +58,22 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,
57 INIT_LIST_HEAD(&tr->tr_buf); 58 INIT_LIST_HEAD(&tr->tr_buf);
58 59
59 sb_start_intwrite(sdp->sd_vfs); 60 sb_start_intwrite(sdp->sd_vfs);
60 gfs2_holder_init(sdp->sd_trans_gl, LM_ST_SHARED, 0, &tr->tr_t_gh);
61
62 error = gfs2_glock_nq(&tr->tr_t_gh);
63 if (error)
64 goto fail_holder_uninit;
65 61
66 error = gfs2_log_reserve(sdp, tr->tr_reserved); 62 error = gfs2_log_reserve(sdp, tr->tr_reserved);
67 if (error) 63 if (error)
68 goto fail_gunlock; 64 goto fail;
69 65
70 current->journal_info = tr; 66 current->journal_info = tr;
71 67
72 return 0; 68 return 0;
73 69
74fail_gunlock: 70fail:
75 gfs2_glock_dq(&tr->tr_t_gh);
76
77fail_holder_uninit:
78 sb_end_intwrite(sdp->sd_vfs); 71 sb_end_intwrite(sdp->sd_vfs);
79 gfs2_holder_uninit(&tr->tr_t_gh);
80 kfree(tr); 72 kfree(tr);
81 73
82 return error; 74 return error;
83} 75}
84 76
85/**
86 * gfs2_log_release - Release a given number of log blocks
87 * @sdp: The GFS2 superblock
88 * @blks: The number of blocks
89 *
90 */
91
92static void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks)
93{
94
95 atomic_add(blks, &sdp->sd_log_blks_free);
96 trace_gfs2_log_blocks(sdp, blks);
97 gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <=
98 sdp->sd_jdesc->jd_blocks);
99 up_read(&sdp->sd_log_flush_lock);
100}
101
102static void gfs2_print_trans(const struct gfs2_trans *tr) 77static void gfs2_print_trans(const struct gfs2_trans *tr)
103{ 78{
104 pr_warn("Transaction created at: %pSR\n", (void *)tr->tr_ip); 79 pr_warn("Transaction created at: %pSR\n", (void *)tr->tr_ip);
@@ -119,11 +94,8 @@ void gfs2_trans_end(struct gfs2_sbd *sdp)
119 94
120 if (!tr->tr_touched) { 95 if (!tr->tr_touched) {
121 gfs2_log_release(sdp, tr->tr_reserved); 96 gfs2_log_release(sdp, tr->tr_reserved);
122 if (tr->tr_t_gh.gh_gl) { 97 if (tr->tr_alloced)
123 gfs2_glock_dq(&tr->tr_t_gh);
124 gfs2_holder_uninit(&tr->tr_t_gh);
125 kfree(tr); 98 kfree(tr);
126 }
127 sb_end_intwrite(sdp->sd_vfs); 99 sb_end_intwrite(sdp->sd_vfs);
128 return; 100 return;
129 } 101 }
@@ -137,16 +109,12 @@ void gfs2_trans_end(struct gfs2_sbd *sdp)
137 gfs2_print_trans(tr); 109 gfs2_print_trans(tr);
138 110
139 gfs2_log_commit(sdp, tr); 111 gfs2_log_commit(sdp, tr);
140 if (tr->tr_t_gh.gh_gl) { 112 if (tr->tr_alloced && !tr->tr_attached)
141 gfs2_glock_dq(&tr->tr_t_gh);
142 gfs2_holder_uninit(&tr->tr_t_gh);
143 if (!tr->tr_attached)
144 kfree(tr); 113 kfree(tr);
145 }
146 up_read(&sdp->sd_log_flush_lock); 114 up_read(&sdp->sd_log_flush_lock);
147 115
148 if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS) 116 if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS)
149 gfs2_log_flush(sdp, NULL); 117 gfs2_log_flush(sdp, NULL, NORMAL_FLUSH);
150 sb_end_intwrite(sdp->sd_vfs); 118 sb_end_intwrite(sdp->sd_vfs);
151} 119}
152 120