From: Lai Siyao Date: Thu, 9 Jun 2022 11:26:40 +0000 (-0400) Subject: LU-15850 mdt: pack default LMV in open reply X-Git-Tag: 2.15.51~28 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=f6e4272fb0be5b798b7685bb40067e3f6877c8a5 LU-15850 mdt: pack default LMV in open reply Add flag MDS_OPEN_DEFAULT_LMV to indicate that default LMV should be packed in open reply, otherwise if open fetches LOOKUP lock, client won't know directory has default LMV, and in subdir creation default LMV won't take effect. Test-Parameters: clientversion=2.14 testlist=sanity mdtcount=4 mdscount=2 env=SANITY_EXCEPT="39l 134b 150b 160g 205a 208 230e 230p 270a 300g 807" Test-Parameters: serverversion=2.14 testlist=sanity mdtcount=4 mdscount=2 env=SANITY_EXCEPT="65n 247f" Signed-off-by: Lai Siyao Change-Id: If2300ca39f406169eff9eab8f973ca1c2bfc8202 Reviewed-on: https://review.whamcloud.com/47576 Tested-by: jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo Reviewed-by: Hongchao Zhang Reviewed-by: Oleg Drokin --- diff --git a/lustre/include/uapi/linux/lustre/lustre_user.h b/lustre/include/uapi/linux/lustre/lustre_user.h index 620e26a..edeff5a 100644 --- a/lustre/include/uapi/linux/lustre/lustre_user.h +++ b/lustre/include/uapi/linux/lustre/lustre_user.h @@ -1563,13 +1563,15 @@ enum la_valid { #define MDS_OPEN_PCC 010000000000000ULL /* PCC: auto RW-PCC cache attach * for newly created file */ #define MDS_OP_WITH_FID 020000000000000ULL /* operation carried out by FID */ +#define MDS_OPEN_DEFAULT_LMV 040000000000000ULL /* open fetches default LMV */ /* lustre internal open flags, which should not be set from user space */ #define MDS_OPEN_FL_INTERNAL (MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS | \ MDS_OPEN_OWNEROVERRIDE | MDS_OPEN_LOCK | \ MDS_OPEN_BY_FID | MDS_OPEN_LEASE | \ MDS_OPEN_RELEASE | MDS_OPEN_RESYNC | \ - MDS_OPEN_PCC | MDS_OP_WITH_FID) + MDS_OPEN_PCC | MDS_OP_WITH_FID | \ + MDS_OPEN_DEFAULT_LMV) /********* Changelogs **********/ diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c index 1dea486..5d571d3 100644 --- a/lustre/mdc/mdc_lib.c +++ b/lustre/mdc/mdc_lib.c @@ -337,6 +337,7 @@ void mdc_open_pack(struct req_capsule *pill, struct md_op_data *op_data, rec->cr_archive_id = op_data->op_archive_id; } } + cr_flags |= MDS_OPEN_DEFAULT_LMV; set_mrc_cr_flags(rec, cr_flags); } diff --git a/lustre/mdc/mdc_locks.c b/lustre/mdc/mdc_locks.c index cb098e6..41692b3 100644 --- a/lustre/mdc/mdc_locks.c +++ b/lustre/mdc/mdc_locks.c @@ -396,6 +396,8 @@ mdc_intent_open_pack(struct obd_export *exp, struct lookup_intent *it, */ req_capsule_set_size(&req->rq_pill, &RMF_NIOBUF_INLINE, RCL_SERVER, sizeof(struct niobuf_remote)); + req_capsule_set_size(&req->rq_pill, &RMF_DEFAULT_MDT_MD, RCL_SERVER, + sizeof(struct lmv_user_md)); ptlrpc_request_set_replen(req); /* Get real repbuf allocated size as rounded up power of 2 */ diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index 39fcb2a..a41865d 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -787,6 +787,12 @@ int mdt_fix_reply(struct mdt_thread_info *info) !(body->mbo_valid & OBD_MD_ENCCTX)) req_capsule_shrink(pill, &RMF_FILE_ENCCTX, 0, RCL_SERVER); + /* Shrink optional default LMV buffer if it is not used */ + if (req_capsule_has_field(pill, &RMF_DEFAULT_MDT_MD, RCL_SERVER) && + req_capsule_get_size(pill, &RMF_DEFAULT_MDT_MD, RCL_SERVER) != 0 && + !(body->mbo_valid & OBD_MD_DEFAULT_MEA)) + req_capsule_shrink(pill, &RMF_DEFAULT_MDT_MD, 0, RCL_SERVER); + /* * Some more field should be shrinked if needed. * This should be done by those who added fields to reply message. diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index eccefec..9e40091 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -311,8 +311,10 @@ void mdt_mfd_set_mode(struct mdt_file_data *mfd, u64 open_flags) */ static void mdt_prep_ma_buf_from_rep(struct mdt_thread_info *info, struct mdt_object *obj, - struct md_attr *ma) + struct md_attr *ma, __u64 open_flags) { + struct req_capsule *pill; + if (ma->ma_lmv || ma->ma_lmm) { CDEBUG(D_INFO, DFID " %s already set.\n", PFID(mdt_object_fid(obj)), @@ -322,19 +324,26 @@ static void mdt_prep_ma_buf_from_rep(struct mdt_thread_info *info, return; } + pill = info->mti_pill; if (S_ISDIR(obj->mot_header.loh_attr)) { - ma->ma_lmv = req_capsule_server_get(info->mti_pill, - &RMF_MDT_MD); - ma->ma_lmv_size = req_capsule_get_size(info->mti_pill, - &RMF_MDT_MD, + ma->ma_lmv = req_capsule_server_get(pill, &RMF_MDT_MD); + ma->ma_lmv_size = req_capsule_get_size(pill, &RMF_MDT_MD, RCL_SERVER); if (ma->ma_lmv_size > 0) ma->ma_need |= MA_LMV; + + if (open_flags & MDS_OPEN_DEFAULT_LMV) { + ma->ma_default_lmv = req_capsule_server_get(pill, + &RMF_DEFAULT_MDT_MD); + ma->ma_default_lmv_size = req_capsule_get_size(pill, + &RMF_DEFAULT_MDT_MD, + RCL_SERVER); + if (ma->ma_default_lmv_size > 0) + ma->ma_need |= MA_LMV_DEF; + } } else { - ma->ma_lmm = req_capsule_server_get(info->mti_pill, - &RMF_MDT_MD); - ma->ma_lmm_size = req_capsule_get_size(info->mti_pill, - &RMF_MDT_MD, + ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD); + ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_MDT_MD, RCL_SERVER); if (ma->ma_lmm_size > 0) ma->ma_need |= MA_LOV; @@ -397,6 +406,12 @@ static int mdt_mfd_open(struct mdt_thread_info *info, struct mdt_object *p, repbody->mbo_valid |= OBD_MD_FLDIREA | OBD_MD_MEA; } + if (ma->ma_valid & MA_LMV_DEF) { + LASSERT(ma->ma_default_lmv_size != 0); + LASSERT(isdir); + repbody->mbo_valid |= OBD_MD_FLDIREA | OBD_MD_DEFAULT_MEA; + } + if (open_flags & MDS_FMODE_WRITE) rc = mdt_write_get(o); else if (open_flags & MDS_FMODE_EXEC) @@ -748,7 +763,7 @@ static int mdt_open_by_fid(struct mdt_thread_info *info, struct ldlm_reply *rep, mdt_set_disposition(info, rep, DISP_OPEN_CREATE); - mdt_prep_ma_buf_from_rep(info, o, ma); + mdt_prep_ma_buf_from_rep(info, o, ma, open_flags); rc = mdt_attr_get_complex(info, o, ma); if (rc) GOTO(out, rc); @@ -1094,7 +1109,7 @@ static int mdt_open_by_fid_lock(struct mdt_thread_info *info, mdt_set_disposition(info, rep, (DISP_IT_EXECD | DISP_LOOKUP_EXECD)); - mdt_prep_ma_buf_from_rep(info, o, ma); + mdt_prep_ma_buf_from_rep(info, o, ma, open_flags); if (open_flags & MDS_OPEN_RELEASE) ma->ma_need |= MA_HSM; rc = mdt_attr_get_complex(info, o, ma); @@ -1197,7 +1212,7 @@ static int mdt_cross_open(struct mdt_thread_info *info, if (rc) goto out; - mdt_prep_ma_buf_from_rep(info, o, ma); + mdt_prep_ma_buf_from_rep(info, o, ma, open_flags); rc = mdt_attr_get_complex(info, o, ma); if (rc != 0) GOTO(out, rc); @@ -1510,7 +1525,7 @@ again_pw: mdt_clear_disposition(info, ldlm_rep, DISP_OPEN_CREATE); GOTO(out_child, result); } else { - mdt_prep_ma_buf_from_rep(info, child, ma); + mdt_prep_ma_buf_from_rep(info, child, ma, open_flags); /* XXX: we should call this once, see few lines below */ if (result == 0) result = mdt_attr_get_complex(info, child, ma); @@ -1561,7 +1576,7 @@ again_pw: /* We have to get attr & LOV EA & HSM for this * object. */ - mdt_prep_ma_buf_from_rep(info, child, ma); + mdt_prep_ma_buf_from_rep(info, child, ma, open_flags); ma->ma_need |= MA_HSM; result = mdt_attr_get_complex(info, child, ma); if (result != 0) diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index a60f1d1..64aa3bb 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -819,7 +819,7 @@ static int mdt_reint_setattr(struct mdt_thread_info *info, struct mdt_object *mo; struct mdt_body *repbody; ktime_t kstart = ktime_get(); - int rc, rc2; + int rc; ENTRY; DEBUG_REQ(D_INODE, req, "setattr "DFID" %x", PFID(rr->rr_fid1), @@ -1033,9 +1033,6 @@ out: ktime_us_delta(ktime_get(), kstart)); mdt_client_compatibility(info); - rc2 = mdt_fix_reply(info); - if (rc == 0) - rc = rc2; return rc; } @@ -3074,7 +3071,7 @@ static int mdt_reint_resync(struct mdt_thread_info *info, struct mdt_body *repbody; struct md_layout_change layout = { .mlc_mirror_id = rr->rr_mirror_id }; bool lease_broken; - int rc, rc2; + int rc; ENTRY; DEBUG_REQ(D_INODE, req, DFID", FLR file resync", PFID(rr->rr_fid1)); @@ -3140,9 +3137,6 @@ out_obj: mdt_object_put(info->mti_env, mo); out: mdt_client_compatibility(info); - rc2 = mdt_fix_reply(info); - if (rc == 0) - rc = rc2; return rc; } diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index 973c422..9d20c18 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -470,6 +470,7 @@ static const struct req_msg_field *ldlm_intent_open_server[] = { &RMF_NIOBUF_INLINE, &RMF_FILE_SECCTX, &RMF_FILE_ENCCTX, + &RMF_DEFAULT_MDT_MD, }; static const struct req_msg_field *ldlm_intent_getattr_client[] = { diff --git a/lustre/ptlrpc/wiretest.c b/lustre/ptlrpc/wiretest.c index c0bbcab..7b7b3e4 100644 --- a/lustre/ptlrpc/wiretest.c +++ b/lustre/ptlrpc/wiretest.c @@ -2615,6 +2615,8 @@ void lustre_assert_wire_constants(void) (long long)MDS_OPEN_RESYNC); LASSERTF(MDS_OPEN_PCC == 00000000010000000000000ULL, "found 0%.22lloULL\n", (long long)MDS_OPEN_PCC); + LASSERTF(MDS_OPEN_DEFAULT_LMV == 00000000040000000000000ULL, "found 0%.22lloULL\n", + (long long)MDS_OPEN_DEFAULT_LMV); LASSERTF(LUSTRE_SYNC_FL == 0x00000008UL, "found 0x%.8xUL\n", (unsigned)LUSTRE_SYNC_FL); LASSERTF(LUSTRE_IMMUTABLE_FL == 0x00000010UL, "found 0x%.8xUL\n", diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c index d58d8bd..d6d0a2b 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -1203,6 +1203,7 @@ check_mdt_body(void) CHECK_VALUE_64O(MDS_OPEN_LEASE); CHECK_VALUE_64O(MDS_OPEN_RESYNC); CHECK_VALUE_64O(MDS_OPEN_PCC); + CHECK_VALUE_64O(MDS_OPEN_DEFAULT_LMV); /* these should be identical to their EXT3_*_FL counterparts, and * are redefined only to avoid dragging in ext3_fs.h */ diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c index d99e5d8..2b20a38 100644 --- a/lustre/utils/wiretest.c +++ b/lustre/utils/wiretest.c @@ -2642,6 +2642,8 @@ void lustre_assert_wire_constants(void) (long long)MDS_OPEN_RESYNC); LASSERTF(MDS_OPEN_PCC == 00000000010000000000000ULL, "found 0%.22lloULL\n", (long long)MDS_OPEN_PCC); + LASSERTF(MDS_OPEN_DEFAULT_LMV == 00000000040000000000000ULL, "found 0%.22lloULL\n", + (long long)MDS_OPEN_DEFAULT_LMV); LASSERTF(LUSTRE_SYNC_FL == 0x00000008UL, "found 0x%.8xUL\n", (unsigned)LUSTRE_SYNC_FL); LASSERTF(LUSTRE_IMMUTABLE_FL == 0x00000010UL, "found 0x%.8xUL\n",