diff options
Diffstat (limited to 'fs/reiserfs/file.c')
-rw-r--r-- | fs/reiserfs/file.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c index bbf31003d308..c7156dc39ce7 100644 --- a/fs/reiserfs/file.c +++ b/fs/reiserfs/file.c | |||
@@ -140,12 +140,18 @@ static void reiserfs_vfs_truncate_file(struct inode *inode) | |||
140 | * be removed... | 140 | * be removed... |
141 | */ | 141 | */ |
142 | 142 | ||
143 | static int reiserfs_sync_file(struct file *filp, int datasync) | 143 | static int reiserfs_sync_file(struct file *filp, loff_t start, loff_t end, |
144 | int datasync) | ||
144 | { | 145 | { |
145 | struct inode *inode = filp->f_mapping->host; | 146 | struct inode *inode = filp->f_mapping->host; |
146 | int err; | 147 | int err; |
147 | int barrier_done; | 148 | int barrier_done; |
148 | 149 | ||
150 | err = filemap_write_and_wait_range(inode->i_mapping, start, end); | ||
151 | if (err) | ||
152 | return err; | ||
153 | |||
154 | mutex_lock(&inode->i_mutex); | ||
149 | BUG_ON(!S_ISREG(inode->i_mode)); | 155 | BUG_ON(!S_ISREG(inode->i_mode)); |
150 | err = sync_mapping_buffers(inode->i_mapping); | 156 | err = sync_mapping_buffers(inode->i_mapping); |
151 | reiserfs_write_lock(inode->i_sb); | 157 | reiserfs_write_lock(inode->i_sb); |
@@ -153,6 +159,7 @@ static int reiserfs_sync_file(struct file *filp, int datasync) | |||
153 | reiserfs_write_unlock(inode->i_sb); | 159 | reiserfs_write_unlock(inode->i_sb); |
154 | if (barrier_done != 1 && reiserfs_barrier_flush(inode->i_sb)) | 160 | if (barrier_done != 1 && reiserfs_barrier_flush(inode->i_sb)) |
155 | blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); | 161 | blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); |
162 | mutex_unlock(&inode->i_mutex); | ||
156 | if (barrier_done < 0) | 163 | if (barrier_done < 0) |
157 | return barrier_done; | 164 | return barrier_done; |
158 | return (err < 0) ? -EIO : 0; | 165 | return (err < 0) ? -EIO : 0; |