Skip to content

Commit 3859af9

Browse files
lxbszidryomov
authored andcommitted
ceph: pass the request to parse_reply_info_readdir()
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> Reviewed-by: Jeff Layton <jlayton@kernel.org> Reviewed-and-tested-by: Luís Henriques <lhenriques@suse.de> Reviewed-by: Milind Changire <mchangir@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
1 parent 8552909 commit 3859af9

1 file changed

Lines changed: 13 additions & 10 deletions

File tree

fs/ceph/mds_client.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -407,9 +407,10 @@ static int parse_reply_info_trace(void **p, void *end,
407407
* parse readdir results
408408
*/
409409
static int parse_reply_info_readdir(void **p, void *end,
410-
struct ceph_mds_reply_info_parsed *info,
411-
u64 features)
410+
struct ceph_mds_request *req,
411+
u64 features)
412412
{
413+
struct ceph_mds_reply_info_parsed *info = &req->r_reply_info;
413414
u32 num, i = 0;
414415
int err;
415416

@@ -651,15 +652,16 @@ static int parse_reply_info_getvxattr(void **p, void *end,
651652
* parse extra results
652653
*/
653654
static int parse_reply_info_extra(void **p, void *end,
654-
struct ceph_mds_reply_info_parsed *info,
655+
struct ceph_mds_request *req,
655656
u64 features, struct ceph_mds_session *s)
656657
{
658+
struct ceph_mds_reply_info_parsed *info = &req->r_reply_info;
657659
u32 op = le32_to_cpu(info->head->op);
658660

659661
if (op == CEPH_MDS_OP_GETFILELOCK)
660662
return parse_reply_info_filelock(p, end, info, features);
661663
else if (op == CEPH_MDS_OP_READDIR || op == CEPH_MDS_OP_LSSNAP)
662-
return parse_reply_info_readdir(p, end, info, features);
664+
return parse_reply_info_readdir(p, end, req, features);
663665
else if (op == CEPH_MDS_OP_CREATE)
664666
return parse_reply_info_create(p, end, info, features, s);
665667
else if (op == CEPH_MDS_OP_GETVXATTR)
@@ -672,9 +674,9 @@ static int parse_reply_info_extra(void **p, void *end,
672674
* parse entire mds reply
673675
*/
674676
static int parse_reply_info(struct ceph_mds_session *s, struct ceph_msg *msg,
675-
struct ceph_mds_reply_info_parsed *info,
676-
u64 features)
677+
struct ceph_mds_request *req, u64 features)
677678
{
679+
struct ceph_mds_reply_info_parsed *info = &req->r_reply_info;
678680
void *p, *end;
679681
u32 len;
680682
int err;
@@ -696,7 +698,7 @@ static int parse_reply_info(struct ceph_mds_session *s, struct ceph_msg *msg,
696698
ceph_decode_32_safe(&p, end, len, bad);
697699
if (len > 0) {
698700
ceph_decode_need(&p, end, len, bad);
699-
err = parse_reply_info_extra(&p, p+len, info, features, s);
701+
err = parse_reply_info_extra(&p, p+len, req, features, s);
700702
if (err < 0)
701703
goto out_bad;
702704
}
@@ -3598,14 +3600,15 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
35983600
}
35993601

36003602
dout("handle_reply tid %lld result %d\n", tid, result);
3601-
rinfo = &req->r_reply_info;
36023603
if (test_bit(CEPHFS_FEATURE_REPLY_ENCODING, &session->s_features))
3603-
err = parse_reply_info(session, msg, rinfo, (u64)-1);
3604+
err = parse_reply_info(session, msg, req, (u64)-1);
36043605
else
3605-
err = parse_reply_info(session, msg, rinfo, session->s_con.peer_features);
3606+
err = parse_reply_info(session, msg, req,
3607+
session->s_con.peer_features);
36063608
mutex_unlock(&mdsc->mutex);
36073609

36083610
/* Must find target inode outside of mutexes to avoid deadlocks */
3611+
rinfo = &req->r_reply_info;
36093612
if ((err >= 0) && rinfo->head->is_target) {
36103613
struct inode *in = xchg(&req->r_new_inode, NULL);
36113614
struct ceph_vino tvino = {

0 commit comments

Comments
 (0)