diff options
Diffstat (limited to 'fs/gfs2/file.c')
-rw-r--r-- | fs/gfs2/file.c | 18 |
1 files changed, 6 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 | ||