diff options
Diffstat (limited to 'fs/ext3/fsync.c')
-rw-r--r-- | fs/ext3/fsync.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/ext3/fsync.c b/fs/ext3/fsync.c index 09b13bb34c94..0bcf63adb80a 100644 --- a/fs/ext3/fsync.c +++ b/fs/ext3/fsync.c | |||
@@ -43,7 +43,7 @@ | |||
43 | * inode to disk. | 43 | * inode to disk. |
44 | */ | 44 | */ |
45 | 45 | ||
46 | int ext3_sync_file(struct file *file, int datasync) | 46 | int ext3_sync_file(struct file *file, loff_t start, loff_t end, int datasync) |
47 | { | 47 | { |
48 | struct inode *inode = file->f_mapping->host; | 48 | struct inode *inode = file->f_mapping->host; |
49 | struct ext3_inode_info *ei = EXT3_I(inode); | 49 | struct ext3_inode_info *ei = EXT3_I(inode); |
@@ -54,6 +54,17 @@ int ext3_sync_file(struct file *file, int datasync) | |||
54 | if (inode->i_sb->s_flags & MS_RDONLY) | 54 | if (inode->i_sb->s_flags & MS_RDONLY) |
55 | return 0; | 55 | return 0; |
56 | 56 | ||
57 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); | ||
58 | if (ret) | ||
59 | return ret; | ||
60 | |||
61 | /* | ||
62 | * Taking the mutex here just to keep consistent with how fsync was | ||
63 | * called previously, however it looks like we don't need to take | ||
64 | * i_mutex at all. | ||
65 | */ | ||
66 | mutex_lock(&inode->i_mutex); | ||
67 | |||
57 | J_ASSERT(ext3_journal_current_handle() == NULL); | 68 | J_ASSERT(ext3_journal_current_handle() == NULL); |
58 | 69 | ||
59 | /* | 70 | /* |
@@ -70,8 +81,10 @@ int ext3_sync_file(struct file *file, int datasync) | |||
70 | * (they were dirtied by commit). But that's OK - the blocks are | 81 | * (they were dirtied by commit). But that's OK - the blocks are |
71 | * safe in-journal, which is all fsync() needs to ensure. | 82 | * safe in-journal, which is all fsync() needs to ensure. |
72 | */ | 83 | */ |
73 | if (ext3_should_journal_data(inode)) | 84 | if (ext3_should_journal_data(inode)) { |
85 | mutex_unlock(&inode->i_mutex); | ||
74 | return ext3_force_commit(inode->i_sb); | 86 | return ext3_force_commit(inode->i_sb); |
87 | } | ||
75 | 88 | ||
76 | if (datasync) | 89 | if (datasync) |
77 | commit_tid = atomic_read(&ei->i_datasync_tid); | 90 | commit_tid = atomic_read(&ei->i_datasync_tid); |
@@ -91,5 +104,6 @@ int ext3_sync_file(struct file *file, int datasync) | |||
91 | */ | 104 | */ |
92 | if (needs_barrier) | 105 | if (needs_barrier) |
93 | blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); | 106 | blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); |
107 | mutex_unlock(&inode->i_mutex); | ||
94 | return ret; | 108 | return ret; |
95 | } | 109 | } |