diff options
Diffstat (limited to 'fs/ceph/addr.c')
-rw-r--r-- | fs/ceph/addr.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 4a3f55f27ab4..5d2b88e3ff0b 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c | |||
@@ -1207,6 +1207,7 @@ static int ceph_filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1207 | struct inode *inode = file_inode(vma->vm_file); | 1207 | struct inode *inode = file_inode(vma->vm_file); |
1208 | struct ceph_inode_info *ci = ceph_inode(inode); | 1208 | struct ceph_inode_info *ci = ceph_inode(inode); |
1209 | struct ceph_file_info *fi = vma->vm_file->private_data; | 1209 | struct ceph_file_info *fi = vma->vm_file->private_data; |
1210 | struct page *pinned_page = NULL; | ||
1210 | loff_t off = vmf->pgoff << PAGE_CACHE_SHIFT; | 1211 | loff_t off = vmf->pgoff << PAGE_CACHE_SHIFT; |
1211 | int want, got, ret; | 1212 | int want, got, ret; |
1212 | 1213 | ||
@@ -1218,7 +1219,8 @@ static int ceph_filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1218 | want = CEPH_CAP_FILE_CACHE; | 1219 | want = CEPH_CAP_FILE_CACHE; |
1219 | while (1) { | 1220 | while (1) { |
1220 | got = 0; | 1221 | got = 0; |
1221 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_RD, want, &got, -1); | 1222 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_RD, want, -1, |
1223 | &got, &pinned_page); | ||
1222 | if (ret == 0) | 1224 | if (ret == 0) |
1223 | break; | 1225 | break; |
1224 | if (ret != -ERESTARTSYS) { | 1226 | if (ret != -ERESTARTSYS) { |
@@ -1233,6 +1235,8 @@ static int ceph_filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1233 | 1235 | ||
1234 | dout("filemap_fault %p %llu~%zd dropping cap refs on %s ret %d\n", | 1236 | dout("filemap_fault %p %llu~%zd dropping cap refs on %s ret %d\n", |
1235 | inode, off, (size_t)PAGE_CACHE_SIZE, ceph_cap_string(got), ret); | 1237 | inode, off, (size_t)PAGE_CACHE_SIZE, ceph_cap_string(got), ret); |
1238 | if (pinned_page) | ||
1239 | page_cache_release(pinned_page); | ||
1236 | ceph_put_cap_refs(ci, got); | 1240 | ceph_put_cap_refs(ci, got); |
1237 | 1241 | ||
1238 | return ret; | 1242 | return ret; |
@@ -1266,7 +1270,8 @@ static int ceph_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1266 | want = CEPH_CAP_FILE_BUFFER; | 1270 | want = CEPH_CAP_FILE_BUFFER; |
1267 | while (1) { | 1271 | while (1) { |
1268 | got = 0; | 1272 | got = 0; |
1269 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, &got, off + len); | 1273 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, off + len, |
1274 | &got, NULL); | ||
1270 | if (ret == 0) | 1275 | if (ret == 0) |
1271 | break; | 1276 | break; |
1272 | if (ret != -ERESTARTSYS) { | 1277 | if (ret != -ERESTARTSYS) { |