lkml.org 
[lkml]   [2022]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v11 23/51] ceph: pass the request to parse_reply_info_readdir()
    Date
    From: Xiubo Li <xiubli@redhat.com>

    Instead of passing just the r_reply_info to the readdir reply parser,
    pass the request pointer directly instead. This will facilitate
    implementing readdir on fscrypted directories.

    Signed-off-by: Xiubo Li <xiubli@redhat.com>
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    ---
    fs/ceph/mds_client.c | 22 ++++++++++++----------
    1 file changed, 12 insertions(+), 10 deletions(-)

    diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
    index a76166d93575..d11599bb85f6 100644
    --- a/fs/ceph/mds_client.c
    +++ b/fs/ceph/mds_client.c
    @@ -406,9 +406,10 @@ static int parse_reply_info_trace(void **p, void *end,
    * parse readdir results
    */
    static int parse_reply_info_readdir(void **p, void *end,
    - struct ceph_mds_reply_info_parsed *info,
    - u64 features)
    + struct ceph_mds_request *req,
    + u64 features)
    {
    + struct ceph_mds_reply_info_parsed *info = &req->r_reply_info;
    u32 num, i = 0;
    int err;

    @@ -650,15 +651,16 @@ static int parse_reply_info_getvxattr(void **p, void *end,
    * parse extra results
    */
    static int parse_reply_info_extra(void **p, void *end,
    - struct ceph_mds_reply_info_parsed *info,
    + struct ceph_mds_request *req,
    u64 features, struct ceph_mds_session *s)
    {
    + struct ceph_mds_reply_info_parsed *info = &req->r_reply_info;
    u32 op = le32_to_cpu(info->head->op);

    if (op == CEPH_MDS_OP_GETFILELOCK)
    return parse_reply_info_filelock(p, end, info, features);
    else if (op == CEPH_MDS_OP_READDIR || op == CEPH_MDS_OP_LSSNAP)
    - return parse_reply_info_readdir(p, end, info, features);
    + return parse_reply_info_readdir(p, end, req, features);
    else if (op == CEPH_MDS_OP_CREATE)
    return parse_reply_info_create(p, end, info, features, s);
    else if (op == CEPH_MDS_OP_GETVXATTR)
    @@ -671,9 +673,9 @@ static int parse_reply_info_extra(void **p, void *end,
    * parse entire mds reply
    */
    static int parse_reply_info(struct ceph_mds_session *s, struct ceph_msg *msg,
    - struct ceph_mds_reply_info_parsed *info,
    - u64 features)
    + struct ceph_mds_request *req, u64 features)
    {
    + struct ceph_mds_reply_info_parsed *info = &req->r_reply_info;
    void *p, *end;
    u32 len;
    int err;
    @@ -695,7 +697,7 @@ static int parse_reply_info(struct ceph_mds_session *s, struct ceph_msg *msg,
    ceph_decode_32_safe(&p, end, len, bad);
    if (len > 0) {
    ceph_decode_need(&p, end, len, bad);
    - err = parse_reply_info_extra(&p, p+len, info, features, s);
    + err = parse_reply_info_extra(&p, p+len, req, features, s);
    if (err < 0)
    goto out_bad;
    }
    @@ -3419,14 +3421,14 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
    }

    dout("handle_reply tid %lld result %d\n", tid, result);
    - rinfo = &req->r_reply_info;
    if (test_bit(CEPHFS_FEATURE_REPLY_ENCODING, &session->s_features))
    - err = parse_reply_info(session, msg, rinfo, (u64)-1);
    + err = parse_reply_info(session, msg, req, (u64)-1);
    else
    - err = parse_reply_info(session, msg, rinfo, session->s_con.peer_features);
    + err = parse_reply_info(session, msg, req, session->s_con.peer_features);
    mutex_unlock(&mdsc->mutex);

    /* Must find target inode outside of mutexes to avoid deadlocks */
    + rinfo = &req->r_reply_info;
    if ((err >= 0) && rinfo->head->is_target) {
    struct inode *in;
    struct ceph_vino tvino = {
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-03-22 15:15    [W:4.655 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site