diff options
Diffstat (limited to 'fs/ceph/file.c')
-rw-r--r-- | fs/ceph/file.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index c03ac4c4bcd1..861b9954a63a 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
@@ -805,6 +805,7 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to) | |||
805 | size_t len = iocb->ki_nbytes; | 805 | size_t len = iocb->ki_nbytes; |
806 | struct inode *inode = file_inode(filp); | 806 | struct inode *inode = file_inode(filp); |
807 | struct ceph_inode_info *ci = ceph_inode(inode); | 807 | struct ceph_inode_info *ci = ceph_inode(inode); |
808 | struct page *pinned_page = NULL; | ||
808 | ssize_t ret; | 809 | ssize_t ret; |
809 | int want, got = 0; | 810 | int want, got = 0; |
810 | int checkeof = 0, read = 0; | 811 | int checkeof = 0, read = 0; |
@@ -817,7 +818,7 @@ again: | |||
817 | want = CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO; | 818 | want = CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO; |
818 | else | 819 | else |
819 | want = CEPH_CAP_FILE_CACHE; | 820 | want = CEPH_CAP_FILE_CACHE; |
820 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_RD, want, &got, -1); | 821 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_RD, want, -1, &got, &pinned_page); |
821 | if (ret < 0) | 822 | if (ret < 0) |
822 | return ret; | 823 | return ret; |
823 | 824 | ||
@@ -840,6 +841,10 @@ again: | |||
840 | } | 841 | } |
841 | dout("aio_read %p %llx.%llx dropping cap refs on %s = %d\n", | 842 | dout("aio_read %p %llx.%llx dropping cap refs on %s = %d\n", |
842 | inode, ceph_vinop(inode), ceph_cap_string(got), (int)ret); | 843 | inode, ceph_vinop(inode), ceph_cap_string(got), (int)ret); |
844 | if (pinned_page) { | ||
845 | page_cache_release(pinned_page); | ||
846 | pinned_page = NULL; | ||
847 | } | ||
843 | ceph_put_cap_refs(ci, got); | 848 | ceph_put_cap_refs(ci, got); |
844 | 849 | ||
845 | if (checkeof && ret >= 0) { | 850 | if (checkeof && ret >= 0) { |
@@ -924,7 +929,8 @@ retry_snap: | |||
924 | else | 929 | else |
925 | want = CEPH_CAP_FILE_BUFFER; | 930 | want = CEPH_CAP_FILE_BUFFER; |
926 | got = 0; | 931 | got = 0; |
927 | err = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, &got, pos + count); | 932 | err = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, pos + count, |
933 | &got, NULL); | ||
928 | if (err < 0) | 934 | if (err < 0) |
929 | goto out; | 935 | goto out; |
930 | 936 | ||
@@ -1225,7 +1231,7 @@ static long ceph_fallocate(struct file *file, int mode, | |||
1225 | else | 1231 | else |
1226 | want = CEPH_CAP_FILE_BUFFER; | 1232 | want = CEPH_CAP_FILE_BUFFER; |
1227 | 1233 | ||
1228 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, &got, endoff); | 1234 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, endoff, &got, NULL); |
1229 | if (ret < 0) | 1235 | if (ret < 0) |
1230 | goto unlock; | 1236 | goto unlock; |
1231 | 1237 | ||