Browse Source

ext4: respect the nobarrier mount option in nojournal mode

Also, if we are going to issue the barrier, we should do this after we
write out the parent directories if necessary.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Jan Kara <jack@suse.cz>
Theodore Ts'o 9 years ago
parent
commit
78d9625107
1 changed files with 4 additions and 1 deletions
  1. 4 1
      fs/ext4/fsync.c

+ 4 - 1
fs/ext4/fsync.c

@@ -106,9 +106,11 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 	}
 	}
 
 
 	if (!journal) {
 	if (!journal) {
-		ret = generic_file_fsync(file, start, end, datasync);
+		ret = __generic_file_fsync(file, start, end, datasync);
 		if (!ret && !hlist_empty(&inode->i_dentry))
 		if (!ret && !hlist_empty(&inode->i_dentry))
 			ret = ext4_sync_parent(inode);
 			ret = ext4_sync_parent(inode);
+		if (test_opt(inode->i_sb, BARRIER))
+			goto issue_flush;
 		goto out;
 		goto out;
 	}
 	}
 
 
@@ -140,6 +142,7 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 		needs_barrier = true;
 		needs_barrier = true;
 	ret = jbd2_complete_transaction(journal, commit_tid);
 	ret = jbd2_complete_transaction(journal, commit_tid);
 	if (needs_barrier) {
 	if (needs_barrier) {
+	issue_flush:
 		err = blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL);
 		err = blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL);
 		if (!ret)
 		if (!ret)
 			ret = err;
 			ret = err;