diff options
Diffstat (limited to 'fs/ceph/dir.c')
-rw-r--r-- | fs/ceph/dir.c | 10 |
1 files changed, 9 insertions, 1 deletions
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 | ||