diff options
| -rw-r--r-- | fs/ext3/fsync.c | 20 | ||||
| -rw-r--r-- | fs/jbd/journal.c | 2 |
2 files changed, 10 insertions, 12 deletions
diff --git a/fs/ext3/fsync.c b/fs/ext3/fsync.c index 8209f266e9ad..26289e8f4163 100644 --- a/fs/ext3/fsync.c +++ b/fs/ext3/fsync.c | |||
| @@ -48,7 +48,7 @@ int ext3_sync_file(struct file * file, struct dentry *dentry, int datasync) | |||
| 48 | struct inode *inode = dentry->d_inode; | 48 | struct inode *inode = dentry->d_inode; |
| 49 | struct ext3_inode_info *ei = EXT3_I(inode); | 49 | struct ext3_inode_info *ei = EXT3_I(inode); |
| 50 | journal_t *journal = EXT3_SB(inode->i_sb)->s_journal; | 50 | journal_t *journal = EXT3_SB(inode->i_sb)->s_journal; |
| 51 | int ret = 0; | 51 | int ret, needs_barrier = 0; |
| 52 | tid_t commit_tid; | 52 | tid_t commit_tid; |
| 53 | 53 | ||
| 54 | if (inode->i_sb->s_flags & MS_RDONLY) | 54 | if (inode->i_sb->s_flags & MS_RDONLY) |
| @@ -70,28 +70,26 @@ int ext3_sync_file(struct file * file, struct dentry *dentry, int datasync) | |||
| 70 | * (they were dirtied by commit). But that's OK - the blocks are | 70 | * (they were dirtied by commit). But that's OK - the blocks are |
| 71 | * safe in-journal, which is all fsync() needs to ensure. | 71 | * safe in-journal, which is all fsync() needs to ensure. |
| 72 | */ | 72 | */ |
| 73 | if (ext3_should_journal_data(inode)) { | 73 | if (ext3_should_journal_data(inode)) |
| 74 | ret = ext3_force_commit(inode->i_sb); | 74 | return ext3_force_commit(inode->i_sb); |
| 75 | goto out; | ||
| 76 | } | ||
| 77 | 75 | ||
| 78 | if (datasync) | 76 | if (datasync) |
| 79 | commit_tid = atomic_read(&ei->i_datasync_tid); | 77 | commit_tid = atomic_read(&ei->i_datasync_tid); |
| 80 | else | 78 | else |
| 81 | commit_tid = atomic_read(&ei->i_sync_tid); | 79 | commit_tid = atomic_read(&ei->i_sync_tid); |
| 82 | 80 | ||
| 83 | if (log_start_commit(journal, commit_tid)) { | 81 | if (test_opt(inode->i_sb, BARRIER) && |
| 84 | log_wait_commit(journal, commit_tid); | 82 | !journal_trans_will_send_data_barrier(journal, commit_tid)) |
| 85 | goto out; | 83 | needs_barrier = 1; |
| 86 | } | 84 | log_start_commit(journal, commit_tid); |
| 85 | ret = log_wait_commit(journal, commit_tid); | ||
| 87 | 86 | ||
| 88 | /* | 87 | /* |
| 89 | * In case we didn't commit a transaction, we have to flush | 88 | * In case we didn't commit a transaction, we have to flush |
| 90 | * disk caches manually so that data really is on persistent | 89 | * disk caches manually so that data really is on persistent |
| 91 | * storage | 90 | * storage |
| 92 | */ | 91 | */ |
| 93 | if (test_opt(inode->i_sb, BARRIER)) | 92 | if (needs_barrier) |
| 94 | blkdev_issue_flush(inode->i_sb->s_bdev, NULL); | 93 | blkdev_issue_flush(inode->i_sb->s_bdev, NULL); |
| 95 | out: | ||
| 96 | return ret; | 94 | return ret; |
| 97 | } | 95 | } |
diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index 99c71940155a..93d1e47647bd 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c | |||
| @@ -594,7 +594,7 @@ out: | |||
| 594 | spin_unlock(&journal->j_state_lock); | 594 | spin_unlock(&journal->j_state_lock); |
| 595 | return ret; | 595 | return ret; |
| 596 | } | 596 | } |
| 597 | EXPORT_SYMBOL(journal_commit_will_send_barrier); | 597 | EXPORT_SYMBOL(journal_trans_will_send_data_barrier); |
| 598 | 598 | ||
| 599 | /* | 599 | /* |
| 600 | * Log buffer allocation routines: | 600 | * Log buffer allocation routines: |
