diff options
author | Xiubo Li <xiubli@redhat.com> | 2024-02-22 02:22:43 +0100 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2024-03-19 14:35:55 +0100 |
commit | 825b82f6b82aa38dbb771d24e135152012500e51 (patch) | |
tree | 0e8cc011cb756cf30aa6a5eeda0ce11d14e961a7 /fs/ceph | |
parent | ceph: stop copying to iter at EOF on sync reads (diff) | |
download | linux-825b82f6b82aa38dbb771d24e135152012500e51.tar.xz linux-825b82f6b82aa38dbb771d24e135152012500e51.zip |
ceph: set correct cap mask for getattr request for read
In case of hitting the file EOF, ceph_read_iter() needs to retrieve the
file size from MDS, and Fr caps aren't neccessary.
[ idryomov: fold into existing retry_op == READ_INLINE branch ]
Reported-by: Frank Hsiao <frankhsiao@qnap.com>
Signed-off-by: Xiubo Li <xiubli@redhat.com>
Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
Tested-by: Frank Hsiao <frankhsiao@qnap.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/file.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 3d1cd079dbf1..16873d07692f 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -2129,14 +2129,16 @@ again: int statret; struct page *page = NULL; loff_t i_size; + int mask = CEPH_STAT_CAP_SIZE; if (retry_op == READ_INLINE) { page = __page_cache_alloc(GFP_KERNEL); if (!page) return -ENOMEM; + + mask = CEPH_STAT_CAP_INLINE_DATA; } - statret = __ceph_do_getattr(inode, page, - CEPH_STAT_CAP_INLINE_DATA, !!page); + statret = __ceph_do_getattr(inode, page, mask, !!page); if (statret < 0) { if (page) __free_page(page); @@ -2177,7 +2179,7 @@ again: /* hit EOF or hole? */ if (retry_op == CHECK_EOF && iocb->ki_pos < i_size && ret < len) { - doutc(cl, "hit hole, ppos %lld < size %lld, reading more\n", + doutc(cl, "may hit hole, ppos %lld < size %lld, reading more\n", iocb->ki_pos, i_size); read += ret; |