diff options
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/file.c | 18 | ||||
-rw-r--r-- | fs/gfs2/trans.c | 4 |
2 files changed, 10 insertions, 12 deletions
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 9aa6af13823c..d1d791ef38de 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c | |||
@@ -373,11 +373,10 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
373 | loff_t size; | 373 | loff_t size; |
374 | int ret; | 374 | int ret; |
375 | 375 | ||
376 | /* Wait if fs is frozen. This is racy so we check again later on | 376 | sb_start_pagefault(inode->i_sb); |
377 | * and retry if the fs has been frozen after the page lock has | 377 | |
378 | * been acquired | 378 | /* Update file times before taking page lock */ |
379 | */ | 379 | file_update_time(vma->vm_file); |
380 | vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); | ||
381 | 380 | ||
382 | ret = gfs2_rs_alloc(ip); | 381 | ret = gfs2_rs_alloc(ip); |
383 | if (ret) | 382 | if (ret) |
@@ -462,14 +461,9 @@ out: | |||
462 | gfs2_holder_uninit(&gh); | 461 | gfs2_holder_uninit(&gh); |
463 | if (ret == 0) { | 462 | if (ret == 0) { |
464 | set_page_dirty(page); | 463 | set_page_dirty(page); |
465 | /* This check must be post dropping of transaction lock */ | 464 | wait_on_page_writeback(page); |
466 | if (inode->i_sb->s_frozen == SB_UNFROZEN) { | ||
467 | wait_on_page_writeback(page); | ||
468 | } else { | ||
469 | ret = -EAGAIN; | ||
470 | unlock_page(page); | ||
471 | } | ||
472 | } | 465 | } |
466 | sb_end_pagefault(inode->i_sb); | ||
473 | return block_page_mkwrite_return(ret); | 467 | return block_page_mkwrite_return(ret); |
474 | } | 468 | } |
475 | 469 | ||
diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c index ad3e2fb763d7..adbd27875ef9 100644 --- a/fs/gfs2/trans.c +++ b/fs/gfs2/trans.c | |||
@@ -50,6 +50,7 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks, | |||
50 | if (revokes) | 50 | if (revokes) |
51 | tr->tr_reserved += gfs2_struct2blk(sdp, revokes, | 51 | tr->tr_reserved += gfs2_struct2blk(sdp, revokes, |
52 | sizeof(u64)); | 52 | sizeof(u64)); |
53 | sb_start_intwrite(sdp->sd_vfs); | ||
53 | gfs2_holder_init(sdp->sd_trans_gl, LM_ST_SHARED, 0, &tr->tr_t_gh); | 54 | gfs2_holder_init(sdp->sd_trans_gl, LM_ST_SHARED, 0, &tr->tr_t_gh); |
54 | 55 | ||
55 | error = gfs2_glock_nq(&tr->tr_t_gh); | 56 | error = gfs2_glock_nq(&tr->tr_t_gh); |
@@ -68,6 +69,7 @@ fail_gunlock: | |||
68 | gfs2_glock_dq(&tr->tr_t_gh); | 69 | gfs2_glock_dq(&tr->tr_t_gh); |
69 | 70 | ||
70 | fail_holder_uninit: | 71 | fail_holder_uninit: |
72 | sb_end_intwrite(sdp->sd_vfs); | ||
71 | gfs2_holder_uninit(&tr->tr_t_gh); | 73 | gfs2_holder_uninit(&tr->tr_t_gh); |
72 | kfree(tr); | 74 | kfree(tr); |
73 | 75 | ||
@@ -116,6 +118,7 @@ void gfs2_trans_end(struct gfs2_sbd *sdp) | |||
116 | gfs2_holder_uninit(&tr->tr_t_gh); | 118 | gfs2_holder_uninit(&tr->tr_t_gh); |
117 | kfree(tr); | 119 | kfree(tr); |
118 | } | 120 | } |
121 | sb_end_intwrite(sdp->sd_vfs); | ||
119 | return; | 122 | return; |
120 | } | 123 | } |
121 | 124 | ||
@@ -136,6 +139,7 @@ void gfs2_trans_end(struct gfs2_sbd *sdp) | |||
136 | 139 | ||
137 | if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS) | 140 | if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS) |
138 | gfs2_log_flush(sdp, NULL); | 141 | gfs2_log_flush(sdp, NULL); |
142 | sb_end_intwrite(sdp->sd_vfs); | ||
139 | } | 143 | } |
140 | 144 | ||
141 | /** | 145 | /** |