aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fs-writeback.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fs-writeback.c')
-rw-r--r--fs/fs-writeback.c15
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 }