diff options
Diffstat (limited to 'fs')
-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: |