回覆: [PATCH v3 2/2] ceph: set the correct mask for getattr reqeust for read

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reviewed-by: Frank Hsiao 蕭法宣 <frankhsiao@xxxxxxxx>
Tested-by: Frank Hsiao 蕭法宣 <frankhsiao@xxxxxxxx>

________________________________________
寄件者: xiubli@xxxxxxxxxx <xiubli@xxxxxxxxxx>
寄件日期: 2024年3月19日 上午 08:29
收件者: ceph-devel@xxxxxxxxxxxxxxx
副本: idryomov@xxxxxxxxx; jlayton@xxxxxxxxxx; vshankar@xxxxxxxxxx; mchangir@xxxxxxxxxx; Frank Hsiao 蕭法宣; Xiubo Li
主旨: [PATCH v3 2/2] ceph: set the correct mask for getattr reqeust for read

From: Xiubo Li <xiubli@xxxxxxxxxx>

In case of hitting the file EOF the ceph_read_iter() needs to
retrieve the file size from MDS, and the Fr caps is not a neccessary.

URL: https://patchwork.kernel.org/project/ceph-devel/list/?series=819323
Reported-by: Frank Hsiao 蕭法宣 <frankhsiao@xxxxxxxx>
Signed-off-by: Xiubo Li <xiubli@xxxxxxxxxx>
Tested-by: Frank Hsiao 蕭法宣 <frankhsiao@xxxxxxxx>
---
 fs/ceph/file.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index c35878427985..a85f95c941fc 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -2191,14 +2191,16 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)
                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;
                }

-               statret = __ceph_do_getattr(inode, page,
-                                           CEPH_STAT_CAP_INLINE_DATA, !!page);
+               if (retry_op == READ_INLINE)
+                       mask = CEPH_STAT_CAP_INLINE_DATA;
+               statret = __ceph_do_getattr(inode, page, mask, !!page);
                if (statret < 0) {
                        if (page)
                                __free_page(page);
@@ -2239,7 +2241,7 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)
                /* 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;
--
2.43.0






[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux