diff options
Diffstat (limited to 'fs/ext4/fsync.c')
| -rw-r--r-- | fs/ext4/fsync.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c index 0b22497d92e1..98bd140aad01 100644 --- a/fs/ext4/fsync.c +++ b/fs/ext4/fsync.c | |||
| @@ -88,9 +88,21 @@ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync) | |||
| 88 | return ext4_force_commit(inode->i_sb); | 88 | return ext4_force_commit(inode->i_sb); |
| 89 | 89 | ||
| 90 | commit_tid = datasync ? ei->i_datasync_tid : ei->i_sync_tid; | 90 | commit_tid = datasync ? ei->i_datasync_tid : ei->i_sync_tid; |
| 91 | if (jbd2_log_start_commit(journal, commit_tid)) | 91 | if (jbd2_log_start_commit(journal, commit_tid)) { |
| 92 | /* | ||
| 93 | * When the journal is on a different device than the | ||
| 94 | * fs data disk, we need to issue the barrier in | ||
| 95 | * writeback mode. (In ordered mode, the jbd2 layer | ||
| 96 | * will take care of issuing the barrier. In | ||
| 97 | * data=journal, all of the data blocks are written to | ||
| 98 | * the journal device.) | ||
| 99 | */ | ||
| 100 | if (ext4_should_writeback_data(inode) && | ||
| 101 | (journal->j_fs_dev != journal->j_dev) && | ||
| 102 | (journal->j_flags & JBD2_BARRIER)) | ||
| 103 | blkdev_issue_flush(inode->i_sb->s_bdev, NULL); | ||
| 92 | jbd2_log_wait_commit(journal, commit_tid); | 104 | jbd2_log_wait_commit(journal, commit_tid); |
| 93 | else if (journal->j_flags & JBD2_BARRIER) | 105 | } else if (journal->j_flags & JBD2_BARRIER) |
| 94 | blkdev_issue_flush(inode->i_sb->s_bdev, NULL); | 106 | blkdev_issue_flush(inode->i_sb->s_bdev, NULL); |
| 95 | return ret; | 107 | return ret; |
| 96 | } | 108 | } |
