+ mdt_name_unpack(pill, &RMF_NAME, &rr->rr_name, MNF_FIX_ANON);
+
+ 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);
+ sp->u.sp_ea.eadatalen = rr->rr_eadatalen;
+ sp->u.sp_ea.eadata = rr->rr_eadata;
+ sp->no_create = !!req_is_replay(req);
+ mdt_fix_lov_magic(info);
+ }
+
+ /*
+ * Client default md_size may be 0 right after client start,
+ * until all osc are connected, set here just some reasonable
+ * value to prevent misbehavior.
+ */
+ if (rr->rr_eadatalen == 0 &&
+ !(info->mti_spec.sp_cr_flags & MDS_OPEN_DELAY_CREATE))
+ rr->rr_eadatalen = MIN_MD_SIZE;
+ }
+
+ RETURN(0);
+}
+
+static int mdt_setxattr_unpack(struct mdt_thread_info *info)
+{
+ struct mdt_reint_record *rr = &info->mti_rr;
+ struct lu_ucred *uc = mdt_ucred(info);
+ struct lu_attr *attr = &info->mti_attr.ma_attr;
+ struct req_capsule *pill = info->mti_pill;
+ struct mdt_rec_setxattr *rec;
+ int rc;
+ ENTRY;
+
+
+ CLASSERT(sizeof(struct mdt_rec_setxattr) ==
+ sizeof(struct mdt_rec_reint));
+
+ rec = req_capsule_client_get(pill, &RMF_REC_REINT);
+ if (rec == NULL)
+ RETURN(-EFAULT);
+
+ /* This prior initialization is needed for old_init_ucred_reint() */
+ uc->uc_fsuid = rec->sx_fsuid;
+ uc->uc_fsgid = rec->sx_fsgid;
+ uc->uc_cap = rec->sx_cap;
+ uc->uc_suppgids[0] = rec->sx_suppgid1;
+ uc->uc_suppgids[1] = -1;
+
+ rr->rr_opcode = rec->sx_opcode;
+ rr->rr_fid1 = &rec->sx_fid;
+ attr->la_valid = rec->sx_valid;
+ attr->la_ctime = rec->sx_time;
+ attr->la_size = rec->sx_size;
+ attr->la_flags = rec->sx_flags;
+
+ if (req_capsule_get_size(pill, &RMF_CAPA1, RCL_CLIENT))
+ mdt_set_capainfo(info, 0, rr->rr_fid1,
+ req_capsule_client_get(pill, &RMF_CAPA1));
+ else
+ mdt_set_capainfo(info, 0, rr->rr_fid1, BYPASS_CAPA);
+
+ rc = mdt_name_unpack(pill, &RMF_NAME, &rr->rr_name, 0);
+ if (rc < 0)
+ RETURN(rc);
+
+ 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);
+ if (rr->rr_eadata == NULL)
+ RETURN(-EFAULT);
+ } else {
+ rr->rr_eadata = NULL;
+ }
+ } else if (!(attr->la_valid & OBD_MD_FLXATTRRM)) {
+ CDEBUG(D_INFO, "no xattr data supplied\n");