diff options
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/caps.c | 6 | ||||
-rw-r--r-- | fs/ceph/dir.c | 10 | ||||
-rw-r--r-- | fs/ceph/super.h | 3 |
3 files changed, 15 insertions, 4 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index f605753c8fe9..8d74ad7ba556 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
@@ -1811,7 +1811,7 @@ out: | |||
1811 | spin_unlock(&ci->i_unsafe_lock); | 1811 | spin_unlock(&ci->i_unsafe_lock); |
1812 | } | 1812 | } |
1813 | 1813 | ||
1814 | int ceph_fsync(struct file *file, int datasync) | 1814 | int ceph_fsync(struct file *file, loff_t start, loff_t end, int datasync) |
1815 | { | 1815 | { |
1816 | struct inode *inode = file->f_mapping->host; | 1816 | struct inode *inode = file->f_mapping->host; |
1817 | struct ceph_inode_info *ci = ceph_inode(inode); | 1817 | struct ceph_inode_info *ci = ceph_inode(inode); |
@@ -1822,9 +1822,10 @@ int ceph_fsync(struct file *file, int datasync) | |||
1822 | dout("fsync %p%s\n", inode, datasync ? " datasync" : ""); | 1822 | dout("fsync %p%s\n", inode, datasync ? " datasync" : ""); |
1823 | sync_write_wait(inode); | 1823 | sync_write_wait(inode); |
1824 | 1824 | ||
1825 | ret = filemap_write_and_wait(inode->i_mapping); | 1825 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); |
1826 | if (ret < 0) | 1826 | if (ret < 0) |
1827 | return ret; | 1827 | return ret; |
1828 | mutex_lock(&inode->i_mutex); | ||
1828 | 1829 | ||
1829 | dirty = try_flush_caps(inode, NULL, &flush_tid); | 1830 | dirty = try_flush_caps(inode, NULL, &flush_tid); |
1830 | dout("fsync dirty caps are %s\n", ceph_cap_string(dirty)); | 1831 | dout("fsync dirty caps are %s\n", ceph_cap_string(dirty)); |
@@ -1841,6 +1842,7 @@ int ceph_fsync(struct file *file, int datasync) | |||
1841 | } | 1842 | } |
1842 | 1843 | ||
1843 | dout("fsync %p%s done\n", inode, datasync ? " datasync" : ""); | 1844 | dout("fsync %p%s done\n", inode, datasync ? " datasync" : ""); |
1845 | mutex_unlock(&inode->i_mutex); | ||
1844 | return ret; | 1846 | return ret; |
1845 | } | 1847 | } |
1846 | 1848 | ||
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 0972b457a03f..1065ac779840 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
@@ -1118,7 +1118,8 @@ static ssize_t ceph_read_dir(struct file *file, char __user *buf, size_t size, | |||
1118 | * an fsync() on a dir will wait for any uncommitted directory | 1118 | * an fsync() on a dir will wait for any uncommitted directory |
1119 | * operations to commit. | 1119 | * operations to commit. |
1120 | */ | 1120 | */ |
1121 | static int ceph_dir_fsync(struct file *file, int datasync) | 1121 | static int ceph_dir_fsync(struct file *file, loff_t start, loff_t end, |
1122 | int datasync) | ||
1122 | { | 1123 | { |
1123 | struct inode *inode = file->f_path.dentry->d_inode; | 1124 | struct inode *inode = file->f_path.dentry->d_inode; |
1124 | struct ceph_inode_info *ci = ceph_inode(inode); | 1125 | struct ceph_inode_info *ci = ceph_inode(inode); |
@@ -1128,6 +1129,11 @@ static int ceph_dir_fsync(struct file *file, int datasync) | |||
1128 | int ret = 0; | 1129 | int ret = 0; |
1129 | 1130 | ||
1130 | dout("dir_fsync %p\n", inode); | 1131 | dout("dir_fsync %p\n", inode); |
1132 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); | ||
1133 | if (ret) | ||
1134 | return ret; | ||
1135 | mutex_lock(&inode->i_mutex); | ||
1136 | |||
1131 | spin_lock(&ci->i_unsafe_lock); | 1137 | spin_lock(&ci->i_unsafe_lock); |
1132 | if (list_empty(head)) | 1138 | if (list_empty(head)) |
1133 | goto out; | 1139 | goto out; |
@@ -1161,6 +1167,8 @@ static int ceph_dir_fsync(struct file *file, int datasync) | |||
1161 | } while (req->r_tid < last_tid); | 1167 | } while (req->r_tid < last_tid); |
1162 | out: | 1168 | out: |
1163 | spin_unlock(&ci->i_unsafe_lock); | 1169 | spin_unlock(&ci->i_unsafe_lock); |
1170 | mutex_unlock(&inode->i_mutex); | ||
1171 | |||
1164 | return ret; | 1172 | return ret; |
1165 | } | 1173 | } |
1166 | 1174 | ||
diff --git a/fs/ceph/super.h b/fs/ceph/super.h index 56c41ef47cad..30446b144e3d 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h | |||
@@ -728,7 +728,8 @@ extern void ceph_put_cap(struct ceph_mds_client *mdsc, | |||
728 | 728 | ||
729 | extern void ceph_queue_caps_release(struct inode *inode); | 729 | extern void ceph_queue_caps_release(struct inode *inode); |
730 | extern int ceph_write_inode(struct inode *inode, struct writeback_control *wbc); | 730 | extern int ceph_write_inode(struct inode *inode, struct writeback_control *wbc); |
731 | extern int ceph_fsync(struct file *file, int datasync); | 731 | extern int ceph_fsync(struct file *file, loff_t start, loff_t end, |
732 | int datasync); | ||
732 | extern void ceph_kick_flushing_caps(struct ceph_mds_client *mdsc, | 733 | extern void ceph_kick_flushing_caps(struct ceph_mds_client *mdsc, |
733 | struct ceph_mds_session *session); | 734 | struct ceph_mds_session *session); |
734 | extern struct ceph_cap *ceph_get_cap_for_mds(struct ceph_inode_info *ci, | 735 | extern struct ceph_cap *ceph_get_cap_for_mds(struct ceph_inode_info *ci, |