Whamcloud - gitweb
LU-9679 modules: convert MIN/MAX to kernel style
[fs/lustre-release.git] / lustre / mdt / mdt_hsm.c
index b4ab8ac..92b842a 100644 (file)
@@ -66,7 +66,7 @@ int mdt_hsm_attr_set(struct mdt_thread_info *info, struct mdt_object *obj,
        ENTRY;
 
        attrs = (struct hsm_attrs *)info->mti_xattr_buf;
-       CLASSERT(sizeof(info->mti_xattr_buf) >= sizeof(*attrs));
+       BUILD_BUG_ON(sizeof(info->mti_xattr_buf) < sizeof(*attrs));
 
        /* pack HSM attributes */
        lustre_hsm2buf(info->mti_xattr_buf, mh);
@@ -138,7 +138,7 @@ int mdt_hsm_progress(struct tgt_session_info *tsi)
        if (!mdt_hsm_is_admin(info))
                GOTO(out, rc = -EPERM);
 
-       rc = mdt_hsm_coordinator_update(info, hpk);
+       rc = mdt_hsm_update_request_state(info, hpk);
 out:
        mdt_thread_info_fini(info);
        RETURN(rc);
@@ -146,22 +146,49 @@ out:
 
 int mdt_hsm_ct_register(struct tgt_session_info *tsi)
 {
-       struct mdt_thread_info  *info;
-       __u32                   *archives;
-       int                      rc;
+       struct mdt_thread_info *info = tsi2mdt_info(tsi);
+       struct ptlrpc_request *req = mdt_info_req(info);
+       struct obd_export *exp = req->rq_export;
+       size_t archives_size;
+       __u32 *archives;
+       int archive_count;
+       int rc;
        ENTRY;
 
+       if (!mdt_hsm_is_admin(info))
+               GOTO(out, rc = -EPERM);
+
        archives = req_capsule_client_get(tsi->tsi_pill, &RMF_MDS_HSM_ARCHIVE);
        if (archives == NULL)
-               RETURN(err_serious(-EPROTO));
+               GOTO(out, rc = err_serious(-EPROTO));
 
-       info = tsi2mdt_info(tsi);
-       if (!mdt_hsm_is_admin(info))
-               GOTO(out, rc = -EPERM);
+       archives_size = req_capsule_get_size(tsi->tsi_pill,
+                                            &RMF_MDS_HSM_ARCHIVE, RCL_CLIENT);
+
+       /* compatibility check for the old clients */
+       if (!exp_connect_archive_id_array(exp)) {
+               if (archives_size != sizeof(*archives))
+                       GOTO(out, rc = err_serious(-EPROTO));
+
+               /* XXX: directly include this function here? */
+               rc = mdt_hsm_agent_register_mask(info,
+                                                &tsi->tsi_exp->exp_client_uuid,
+                                                *archives);
+               GOTO(out, rc);
+       }
+
+       if (archives_size % sizeof(*archives) != 0)
+               GOTO(out, rc = err_serious(-EPROTO));
+
+       archive_count = archives_size / sizeof(*archives);
+       if (archive_count == 1 && *archives == 0) {
+               archive_count = 0;
+               archives = NULL;
+       }
+
+       rc = mdt_hsm_agent_register(info, &tsi->tsi_exp->exp_client_uuid,
+                                   archive_count, archives);
 
-       /* XXX: directly include this function here? */
-       rc = mdt_hsm_agent_register_mask(info, &tsi->tsi_exp->exp_client_uuid,
-                                        *archives);
 out:
        mdt_thread_info_fini(info);
        RETURN(rc);
@@ -313,6 +340,9 @@ int mdt_hsm_state_set(struct tgt_session_info *tsi)
 
        /* Change archive_id if provided. */
        if (hss->hss_valid & HSS_ARCHIVE_ID) {
+               struct ptlrpc_request *req = mdt_info_req(info);
+               struct obd_export *exp = req->rq_export;
+
                if (!(ma->ma_hsm.mh_flags & HS_EXISTS)) {
                        CDEBUG(D_HSM, "Could not set an archive number for "
                               DFID "if HSM EXISTS flag is not set.\n",
@@ -320,10 +350,11 @@ int mdt_hsm_state_set(struct tgt_session_info *tsi)
                        GOTO(out_unlock, rc);
                }
 
-               /* Detect out-of range archive id */
-               if (hss->hss_archive_id > LL_HSM_MAX_ARCHIVE) {
-                       CDEBUG(D_HSM, "archive id %u exceeds maximum %zu.\n",
-                              hss->hss_archive_id, LL_HSM_MAX_ARCHIVE);
+               if (!exp_connect_archive_id_array(exp) &&
+                   hss->hss_archive_id > LL_HSM_ORIGIN_MAX_ARCHIVE) {
+                       CDEBUG(D_HSM, "archive id %u from old clients "
+                              "exceeds maximum %zu.\n",
+                              hss->hss_archive_id, LL_HSM_ORIGIN_MAX_ARCHIVE);
                        GOTO(out_unlock, rc = -EINVAL);
                }
 
@@ -371,12 +402,12 @@ out:
  */
 int mdt_hsm_action(struct tgt_session_info *tsi)
 {
-       struct mdt_thread_info          *info;
-       struct hsm_current_action       *hca;
-       struct hsm_action_list          *hal = NULL;
-       struct hsm_action_item          *hai;
-       int                              hal_size;
-       int                              rc;
+       struct mdt_thread_info *info;
+       struct hsm_current_action *hca;
+       enum hsm_copytool_action action; /* HSMA_* */
+       enum agent_req_status status; /* ARS_* */
+       struct hsm_extent extent;
+       int rc;
        ENTRY;
 
        hca = req_capsule_server_get(tsi->tsi_pill,
@@ -390,42 +421,15 @@ int mdt_hsm_action(struct tgt_session_info *tsi)
        info = tsi2mdt_info(tsi);
        /* Only valid if client is remote */
        rc = mdt_init_ucred(info, (struct mdt_body *)info->mti_body);
-       if (rc)
+       if (rc < 0)
                GOTO(out, rc = err_serious(rc));
 
-       /* Coordinator information */
-       hal_size = sizeof(*hal) +
-                  cfs_size_round(MTI_NAME_MAXLEN) /* fsname */ +
-                  cfs_size_round(sizeof(*hai));
-
-       MDT_HSM_ALLOC(hal, hal_size);
-       if (hal == NULL)
-               GOTO(out_ucred, rc = -ENOMEM);
-
-       hal->hal_version = HAL_VERSION;
-       hal->hal_archive_id = 0;
-       hal->hal_flags = 0;
-       obd_uuid2fsname(hal->hal_fsname, mdt_obd_name(info->mti_mdt),
-                       MTI_NAME_MAXLEN);
-       hal->hal_count = 1;
-       hai = hai_first(hal);
-       hai->hai_action = HSMA_NONE;
-       hai->hai_cookie = 0;
-       hai->hai_gid = 0;
-       hai->hai_fid = info->mti_body->mbo_fid1;
-       hai->hai_len = sizeof(*hai);
-
-       rc = mdt_hsm_get_actions(info, hal);
-       if (rc)
-               GOTO(out_free, rc);
-
-       /* cookie is used to give back request status */
-       if (hai->hai_cookie == 0)
-               hca->hca_state = HPS_WAITING;
-       else
-               hca->hca_state = HPS_RUNNING;
+       rc = mdt_hsm_get_action(info, &info->mti_body->mbo_fid1, &action,
+                               &status, &extent);
+       if (rc < 0)
+               GOTO(out_ucred, rc);
 
-       switch (hai->hai_action) {
+       switch (action) {
        case HSMA_NONE:
                hca->hca_action = HUA_NONE;
                break;
@@ -444,16 +448,26 @@ int mdt_hsm_action(struct tgt_session_info *tsi)
        default:
                hca->hca_action = HUA_NONE;
                CERROR("%s: Unknown hsm action: %d on "DFID"\n",
-                      mdt_obd_name(info->mti_mdt),
-                      hai->hai_action, PFID(&hai->hai_fid));
+                      mdt_obd_name(info->mti_mdt), action,
+                      PFID(&info->mti_body->mbo_fid1));
+               break;
+       }
+
+       switch (status) {
+       case ARS_WAITING:
+               hca->hca_state = HPS_WAITING;
+               break;
+       case ARS_STARTED:
+               hca->hca_state = HPS_RUNNING;
+               break;
+       default:
+               hca->hca_state = HPS_NONE;
                break;
        }
 
-       hca->hca_location = hai->hai_extent;
+       hca->hca_location = extent;
 
        EXIT;
-out_free:
-       MDT_HSM_FREE(hal, hal_size);
 out_ucred:
        mdt_exit_ucred(info);
 out:
@@ -462,7 +476,7 @@ out:
 }
 
 /* Return true if a FID is present in an action list. */
-static bool is_fid_in_hal(struct hsm_action_list *hal, const lustre_fid *fid)
+static bool is_fid_in_hal(struct hsm_action_list *hal, const struct lu_fid *fid)
 {
        struct hsm_action_item *hai;
        int i;