diff options
Diffstat (limited to 'fs/fs-writeback.c')
-rw-r--r-- | fs/fs-writeback.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 1a7c42c64ff4..5f2721b1e4be 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
@@ -461,15 +461,20 @@ writeback_single_inode(struct inode *inode, struct writeback_control *wbc) | |||
461 | 461 | ||
462 | ret = do_writepages(mapping, wbc); | 462 | ret = do_writepages(mapping, wbc); |
463 | 463 | ||
464 | /* Don't write the inode if only I_DIRTY_PAGES was set */ | 464 | /* |
465 | if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { | 465 | * Make sure to wait on the data before writing out the metadata. |
466 | int err = write_inode(inode, wait); | 466 | * This is important for filesystems that modify metadata on data |
467 | * I/O completion. | ||
468 | */ | ||
469 | if (wait) { | ||
470 | int err = filemap_fdatawait(mapping); | ||
467 | if (ret == 0) | 471 | if (ret == 0) |
468 | ret = err; | 472 | ret = err; |
469 | } | 473 | } |
470 | 474 | ||
471 | if (wait) { | 475 | /* Don't write the inode if only I_DIRTY_PAGES was set */ |
472 | int err = filemap_fdatawait(mapping); | 476 | if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { |
477 | int err = write_inode(inode, wait); | ||
473 | if (ret == 0) | 478 | if (ret == 0) |
474 | ret = err; | 479 | ret = err; |
475 | } | 480 | } |