CERROR("Unknown attr bits: "LPX64"\n", in);
return out;
}
+
+void mdt_set_capainfo(struct mdt_thread_info *info, int offset,
+ const struct lu_fid *fid, struct lustre_capa *capa)
+{
+ struct lu_capainfo *lci;
+
+ LASSERT(offset >= 0 && offset < LU_CAPAINFO_MAX);
+ if (!info->mti_mdt->mdt_opts.mo_mds_capa ||
+ !(exp_connect_flags(info->mti_exp) & OBD_CONNECT_MDS_CAPA))
+ return;
+
+ lci = lu_capainfo_get(info->mti_env);
+ LASSERT(lci);
+ lci->lci_fid[offset] = *fid;
+ lci->lci_capa[offset] = capa;
+}
+
+#ifdef DEBUG_CAPA
+void mdt_dump_capainfo(struct mdt_thread_info *info)
+{
+ struct lu_capainfo *lci = lu_capainfo_get(info->mti_env);
+ int i;
+
+ if (lci == NULL)
+ return;
+
+ for (i = 0; i < LU_CAPAINFO_MAX; i++) {
+ if (lci->lci_capa[i] == NULL) {
+ CERROR("no capa for index %d "DFID"\n",
+ i, PFID(&lci->lci_fid[i]));
+ continue;
+ }
+ if (lci->lci_capa[i] == BYPASS_CAPA) {
+ CERROR("bypass for index %d "DFID"\n",
+ i, PFID(&lci->lci_fid[i]));
+ continue;
+ }
+ DEBUG_CAPA(D_ERROR, lci->lci_capa[i], "index %d", i);
+ }
+}
+#endif /* DEBUG_CAPA */
+
/* unpacking */
static int mdt_setattr_unpack_rec(struct mdt_thread_info *info)
else
ma->ma_attr_flags &= ~MDS_DATA_MODIFIED;
- 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));
+ if (rec->sa_bias & MDS_HSM_RELEASE)
+ ma->ma_attr_flags |= MDS_HSM_RELEASE;
+ else
+ ma->ma_attr_flags &= ~MDS_HSM_RELEASE;
- RETURN(0);
+ 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));
+
+ RETURN(0);
}
static int mdt_ioepoch_unpack(struct mdt_thread_info *info)
RETURN(rc);
}
+static int mdt_hsm_release_unpack(struct mdt_thread_info *info)
+{
+ struct md_attr *ma = &info->mti_attr;
+ struct req_capsule *pill = info->mti_pill;
+ ENTRY;
+
+ if (!(ma->ma_attr_flags & MDS_HSM_RELEASE))
+ RETURN(0);
+
+ req_capsule_extend(pill, &RQF_MDS_RELEASE_CLOSE);
+
+ if (!(req_capsule_has_field(pill, &RMF_CLOSE_DATA, RCL_CLIENT) &&
+ req_capsule_field_present(pill, &RMF_CLOSE_DATA, RCL_CLIENT)))
+ RETURN(-EFAULT);
+
+ RETURN(0);
+}
+
int mdt_close_unpack(struct mdt_thread_info *info)
{
int rc;
rc = mdt_setattr_unpack_rec(info);
if (rc)
RETURN(rc);
+
+ rc = mdt_hsm_release_unpack(info);
+ if (rc)
+ RETURN(rc);
+
RETURN(mdt_init_ucred_reint(info));
}