Whamcloud - gitweb
LU-3556 osd-ldiskfs: remove dependency on mdd module
[fs/lustre-release.git] / lustre / mdt / mdt_lib.c
index 4eec5f2..8a4042f 100644 (file)
@@ -757,6 +757,48 @@ static __u64 mdt_attr_valid_xlate(__u64 in, struct mdt_reint_record *rr,
                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)
@@ -813,11 +855,16 @@ 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)
@@ -875,6 +922,24 @@ static int mdt_setattr_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;
@@ -887,6 +952,11 @@ int mdt_close_unpack(struct mdt_thread_info *info)
        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));
 }