|
@@ -4455,7 +4455,12 @@ int ext4_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|
|
return -EIO;
|
|
|
}
|
|
|
|
|
|
- if (wbc->sync_mode != WB_SYNC_ALL)
|
|
|
+ /*
|
|
|
+ * No need to force transaction in WB_SYNC_NONE mode. Also
|
|
|
+ * ext4_sync_fs() will force the commit after everything is
|
|
|
+ * written.
|
|
|
+ */
|
|
|
+ if (wbc->sync_mode != WB_SYNC_ALL || wbc->for_sync)
|
|
|
return 0;
|
|
|
|
|
|
err = ext4_force_commit(inode->i_sb);
|
|
@@ -4465,7 +4470,11 @@ int ext4_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|
|
err = __ext4_get_inode_loc(inode, &iloc, 0);
|
|
|
if (err)
|
|
|
return err;
|
|
|
- if (wbc->sync_mode == WB_SYNC_ALL)
|
|
|
+ /*
|
|
|
+ * sync(2) will flush the whole buffer cache. No need to do
|
|
|
+ * it here separately for each inode.
|
|
|
+ */
|
|
|
+ if (wbc->sync_mode == WB_SYNC_ALL && !wbc->for_sync)
|
|
|
sync_dirty_buffer(iloc.bh);
|
|
|
if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) {
|
|
|
EXT4_ERROR_INODE_BLOCK(inode, iloc.bh->b_blocknr,
|