X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_lib.c;h=a7d51307673f7d79bc39b26c9a5e1f4e6b9cfa26;hb=cb61ed93f8563c26b6a6db396478fe54f8dc42cb;hp=7d2a7c0992be5203c05aff62b59b8474d64ab2e3;hpb=fca35f74f9ec5c5ed77e774f3e3209d9df057a01;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index 7d2a7c0..a7d5130 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -681,11 +681,25 @@ void mdt_dump_lmm(int level, const struct lov_mds_md *lmm, __u64 valid) void mdt_dump_lmv(unsigned int level, const union lmv_mds_md *lmv) { const struct lmv_mds_md_v1 *lmm1; + const struct lmv_foreign_md *lfm; int i; if (likely(!cfs_cdebug_show(level, DEBUG_SUBSYSTEM))) return; + /* foreign LMV case */ + lfm = &lmv->lmv_foreign_md; + if (le32_to_cpu(lfm->lfm_magic) == LMV_MAGIC_FOREIGN) { + CDEBUG_LIMIT(level, + "foreign magic 0x%08X, length %u, type %u, flags %u, value '%.*s'\n", + le32_to_cpu(lfm->lfm_magic), + le32_to_cpu(lfm->lfm_length), + le32_to_cpu(lfm->lfm_type), + le32_to_cpu(lfm->lfm_flags), + le32_to_cpu(lfm->lfm_length), lfm->lfm_value); + return; + } + lmm1 = &lmv->lmv_md_v1; CDEBUG(level, "magic 0x%08X, master %#X stripe_count %#x hash_type %#x\n", @@ -776,6 +790,12 @@ int mdt_fix_reply(struct mdt_thread_info *info) req_capsule_shrink(pill, &RMF_LOGCOOKIES, acl_size, RCL_SERVER); } + /* Shrink optional SECCTX buffer if it is not used */ + if (req_capsule_has_field(pill, &RMF_FILE_SECCTX, RCL_SERVER) && + req_capsule_get_size(pill, &RMF_FILE_SECCTX, RCL_SERVER) != 0 && + !(body->mbo_valid & OBD_MD_SECCTX)) + req_capsule_shrink(pill, &RMF_FILE_SECCTX, 0, RCL_SERVER); + /* * Some more field should be shrinked if needed. * This should be done by those who added fields to reply message. @@ -995,7 +1015,7 @@ static __u64 mdt_attr_valid_xlate(__u64 in, struct mdt_reint_record *rr, MDS_ATTR_FROM_OPEN | MDS_ATTR_LSIZE | MDS_ATTR_LBLOCKS | MDS_ATTR_OVERRIDE); if (in != 0) - CERROR("Unknown attr bits: %#llx\n", in); + CDEBUG(D_INFO, "Unknown attr bits: %#llx\n", in); return out; } @@ -1162,6 +1182,7 @@ static int mdt_setattr_unpack(struct mdt_thread_info *info) rr->rr_eadata = req_capsule_client_get(pill, &RMF_EADATA); rr->rr_eadatalen = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT); + if (rr->rr_eadatalen > 0) { const struct lmv_user_md *lum; @@ -1228,8 +1249,8 @@ static int mdt_create_unpack(struct mdt_thread_info *info) struct mdt_rec_create *rec; struct lu_attr *attr = &info->mti_attr.ma_attr; struct mdt_reint_record *rr = &info->mti_rr; - struct req_capsule *pill = info->mti_pill; - struct md_op_spec *sp = &info->mti_spec; + struct req_capsule *pill = info->mti_pill; + struct md_op_spec *sp = &info->mti_spec; int rc; ENTRY; @@ -1294,6 +1315,10 @@ static int mdt_create_unpack(struct mdt_thread_info *info) if (rc < 0) RETURN(rc); + rc = req_check_sepol(pill); + if (rc) + RETURN(rc); + rc = mdt_dlmreq_unpack(info); RETURN(rc); } @@ -1333,6 +1358,10 @@ static int mdt_link_unpack(struct mdt_thread_info *info) if (rc < 0) RETURN(rc); + rc = req_check_sepol(pill); + if (rc) + RETURN(rc); + rc = mdt_dlmreq_unpack(info); RETURN(rc); @@ -1344,7 +1373,7 @@ static int mdt_unlink_unpack(struct mdt_thread_info *info) struct mdt_rec_unlink *rec; struct lu_attr *attr = &info->mti_attr.ma_attr; struct mdt_reint_record *rr = &info->mti_rr; - struct req_capsule *pill = info->mti_pill; + struct req_capsule *pill = info->mti_pill; int rc; ENTRY; @@ -1376,6 +1405,10 @@ static int mdt_unlink_unpack(struct mdt_thread_info *info) info->mti_spec.no_create = !!req_is_replay(mdt_info_req(info)); + rc = req_check_sepol(pill); + if (rc) + RETURN(rc); + rc = mdt_dlmreq_unpack(info); RETURN(rc); } @@ -1430,6 +1463,10 @@ static int mdt_rename_unpack(struct mdt_thread_info *info) spec->no_create = !!req_is_replay(mdt_info_req(info)); + rc = req_check_sepol(pill); + if (rc) + RETURN(rc); + rc = mdt_dlmreq_unpack(info); RETURN(rc); @@ -1487,6 +1524,7 @@ static int mdt_migrate_unpack(struct mdt_thread_info *info) rr->rr_eadatalen = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT); + if (rr->rr_eadatalen > 0) { rr->rr_eadata = req_capsule_client_get(pill, &RMF_EADATA); @@ -1575,6 +1613,7 @@ static int mdt_open_unpack(struct mdt_thread_info *info) if (req_capsule_field_present(pill, &RMF_EADATA, RCL_CLIENT)) { rr->rr_eadatalen = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT); + if (rr->rr_eadatalen > 0) { rr->rr_eadata = req_capsule_client_get(pill, &RMF_EADATA); @@ -1597,6 +1636,12 @@ static int mdt_open_unpack(struct mdt_thread_info *info) rc = mdt_file_secctx_unpack(pill, &sp->sp_cr_file_secctx_name, &sp->sp_cr_file_secctx, &sp->sp_cr_file_secctx_size); + if (rc < 0) + RETURN(rc); + + rc = req_check_sepol(pill); + if (rc) + RETURN(rc); RETURN(rc); } @@ -1640,6 +1685,10 @@ static int mdt_setxattr_unpack(struct mdt_thread_info *info) if (req_capsule_field_present(pill, &RMF_EADATA, RCL_CLIENT)) { rr->rr_eadatalen = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT); + + if (rr->rr_eadatalen > info->mti_mdt->mdt_max_ea_size) + RETURN(-E2BIG); + if (rr->rr_eadatalen > 0) { rr->rr_eadata = req_capsule_client_get(pill, &RMF_EADATA); @@ -1653,6 +1702,10 @@ static int mdt_setxattr_unpack(struct mdt_thread_info *info) RETURN(-EFAULT); } + rc = req_check_sepol(pill); + if (rc) + RETURN(rc); + if (mdt_dlmreq_unpack(info) < 0) RETURN(-EPROTO);