Whamcloud - gitweb
LU-3866 hsm: permission checks on HSM operations
[fs/lustre-release.git] / lustre / mdc / mdc_request.c
index 8a0073c..ab9a375 100644 (file)
@@ -1071,19 +1071,19 @@ EXPORT_SYMBOL(mdc_sendpage);
 #endif
 
 int mdc_readpage(struct obd_export *exp, struct md_op_data *op_data,
-                 struct page **pages, struct ptlrpc_request **request)
-{
-        struct ptlrpc_request   *req;
-        struct ptlrpc_bulk_desc *desc;
-        int                      i;
-        cfs_waitq_t              waitq;
-        int                      resends = 0;
-        struct l_wait_info       lwi;
-        int                      rc;
-        ENTRY;
+                struct page **pages, struct ptlrpc_request **request)
+{
+       struct ptlrpc_request   *req;
+       struct ptlrpc_bulk_desc *desc;
+       int                      i;
+       wait_queue_head_t        waitq;
+       int                      resends = 0;
+       struct l_wait_info       lwi;
+       int                      rc;
+       ENTRY;
 
-        *request = NULL;
-        cfs_waitq_init(&waitq);
+       *request = NULL;
+       init_waitqueue_head(&waitq);
 
 restart_bulk:
         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_MDS_READPAGE);
@@ -1268,7 +1268,7 @@ static int mdc_ioc_hsm_progress(struct obd_export *exp,
        if (req == NULL)
                GOTO(out, rc = -ENOMEM);
 
-       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, 0, 0);
+       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, -1, 0);
 
        /* Copy hsm_progress struct */
        req_hpk = req_capsule_client_get(&req->rq_pill, &RMF_MDS_HSM_PROGRESS);
@@ -1300,7 +1300,7 @@ static int mdc_ioc_hsm_ct_register(struct obd_import *imp, __u32 archives)
        if (req == NULL)
                GOTO(out, rc = -ENOMEM);
 
-       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, 0, 0);
+       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, -1, 0);
 
        /* Copy hsm_progress struct */
        archive_mask = req_capsule_client_get(&req->rq_pill,
@@ -1375,7 +1375,7 @@ static int mdc_ioc_hsm_ct_unregister(struct obd_import *imp)
        if (req == NULL)
                GOTO(out, rc = -ENOMEM);
 
-       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, 0, 0);
+       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, -1, 0);
 
        ptlrpc_request_set_replen(req);
 
@@ -1498,7 +1498,7 @@ static int mdc_ioc_hsm_request(struct obd_export *exp,
                RETURN(rc);
        }
 
-       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, 0, 0);
+       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, -1, 0);
 
        /* Copy hsm_request struct */
        req_hr = req_capsule_client_get(&req->rq_pill, &RMF_MDS_HSM_REQUEST);
@@ -1531,16 +1531,16 @@ out:
 
 static struct kuc_hdr *changelog_kuc_hdr(char *buf, int len, int flags)
 {
-        struct kuc_hdr *lh = (struct kuc_hdr *)buf;
+       struct kuc_hdr *lh = (struct kuc_hdr *)buf;
 
-        LASSERT(len <= CR_MAXSIZE);
+       LASSERT(len <= KUC_CHANGELOG_MSG_MAXSIZE);
 
-        lh->kuc_magic = KUC_MAGIC;
-        lh->kuc_transport = KUC_TRANSPORT_CHANGELOG;
-        lh->kuc_flags = flags;
-        lh->kuc_msgtype = CL_RECORD;
-        lh->kuc_msglen = len;
-        return lh;
+       lh->kuc_magic = KUC_MAGIC;
+       lh->kuc_transport = KUC_TRANSPORT_CHANGELOG;
+       lh->kuc_flags = flags;
+       lh->kuc_msgtype = CL_RECORD;
+       lh->kuc_msglen = len;
+       return lh;
 }
 
 #define D_CHANGELOG 0
@@ -1598,18 +1598,18 @@ static int changelog_kkuc_cb(const struct lu_env *env, struct llog_handle *llh,
 
 static int mdc_changelog_send_thread(void *csdata)
 {
-        struct changelog_show *cs = csdata;
-        struct llog_ctxt *ctxt = NULL;
-        struct llog_handle *llh = NULL;
-        struct kuc_hdr *kuch;
-        int rc;
+       struct changelog_show *cs = csdata;
+       struct llog_ctxt *ctxt = NULL;
+       struct llog_handle *llh = NULL;
+       struct kuc_hdr *kuch;
+       int rc;
 
-        CDEBUG(D_CHANGELOG, "changelog to fp=%p start "LPU64"\n",
-               cs->cs_fp, cs->cs_startrec);
+       CDEBUG(D_CHANGELOG, "changelog to fp=%p start "LPU64"\n",
+              cs->cs_fp, cs->cs_startrec);
 
-        OBD_ALLOC(cs->cs_buf, CR_MAXSIZE);
-        if (cs->cs_buf == NULL)
-                GOTO(out, rc = -ENOMEM);
+       OBD_ALLOC(cs->cs_buf, KUC_CHANGELOG_MSG_MAXSIZE);
+       if (cs->cs_buf == NULL)
+               GOTO(out, rc = -ENOMEM);
 
         /* Set up the remote catalog handle */
         ctxt = llog_get_context(cs->cs_obd, LLOG_CHANGELOG_REPL_CTXT);
@@ -1644,7 +1644,7 @@ out:
         if (ctxt)
                 llog_ctxt_put(ctxt);
        if (cs->cs_buf)
-               OBD_FREE(cs->cs_buf, CR_MAXSIZE);
+               OBD_FREE(cs->cs_buf, KUC_CHANGELOG_MSG_MAXSIZE);
        OBD_FREE_PTR(cs);
        return rc;
 }
@@ -1836,10 +1836,10 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
         int rc;
         ENTRY;
 
-        if (!cfs_try_module_get(THIS_MODULE)) {
-                CERROR("Can't get module. Is it alive?");
-                return -EINVAL;
-        }
+       if (!try_module_get(THIS_MODULE)) {
+               CERROR("Can't get module. Is it alive?");
+               return -EINVAL;
+       }
         switch (cmd) {
         case OBD_IOC_CHANGELOG_SEND:
                 rc = mdc_ioc_changelog_send(obd, karg);
@@ -1972,7 +1972,7 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                GOTO(out, rc = -ENOTTY);
        }
 out:
-       cfs_module_put(THIS_MODULE);
+       module_put(THIS_MODULE);
 
        return rc;
 }
@@ -2125,21 +2125,27 @@ static int mdc_hsm_copytool_send(int len, void *val)
 /**
  * callback function passed to kuc for re-registering each HSM copytool
  * running on MDC, after MDT shutdown/recovery.
- * @param data archive id served by the copytool
+ * @param data copytool registration data
  * @param cb_arg callback argument (obd_import)
  */
-static int mdc_hsm_ct_reregister(__u32 data, void *cb_arg)
+static int mdc_hsm_ct_reregister(void *data, void *cb_arg)
 {
+       struct kkuc_ct_data     *kcd = data;
        struct obd_import       *imp = (struct obd_import *)cb_arg;
-       __u32                    archive = data;
        int                      rc;
 
-       CDEBUG(D_HA, "recover copytool registration to MDT (archive=%#x)\n",
-              archive);
-       rc = mdc_ioc_hsm_ct_register(imp, archive);
+       if (kcd == NULL || kcd->kcd_magic != KKUC_CT_DATA_MAGIC)
+               return -EPROTO;
+
+       if (!obd_uuid_equals(&kcd->kcd_uuid, &imp->imp_obd->obd_uuid))
+               return 0;
+
+       CDEBUG(D_HA, "%s: recover copytool registration to MDT (archive=%#x)\n",
+              imp->imp_obd->obd_name, kcd->kcd_archive);
+       rc = mdc_ioc_hsm_ct_register(imp, kcd->kcd_archive);
 
        /* ignore error if the copytool is already registered */
-       return ((rc != 0) && (rc != -EEXIST)) ? rc : 0;
+       return (rc == -EEXIST) ? 0 : rc;
 }
 
 /**
@@ -2460,21 +2466,23 @@ struct ldlm_valblock_ops inode_lvbo = {
 
 static int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
 {
-        struct client_obd *cli = &obd->u.cli;
-        struct lprocfs_static_vars lvars = { 0 };
-        int rc;
-        ENTRY;
+       struct client_obd               *cli = &obd->u.cli;
+       struct lprocfs_static_vars      lvars = { 0 };
+       int                             rc;
+       ENTRY;
 
         OBD_ALLOC(cli->cl_rpc_lock, sizeof (*cli->cl_rpc_lock));
         if (!cli->cl_rpc_lock)
                 RETURN(-ENOMEM);
         mdc_init_rpc_lock(cli->cl_rpc_lock);
 
-        ptlrpcd_addref();
+       rc = ptlrpcd_addref();
+       if (rc < 0)
+               GOTO(err_rpc_lock, rc);
 
         OBD_ALLOC(cli->cl_close_lock, sizeof (*cli->cl_close_lock));
         if (!cli->cl_close_lock)
-                GOTO(err_rpc_lock, rc = -ENOMEM);
+                GOTO(err_ptlrpcd_decref, rc = -ENOMEM);
         mdc_init_rpc_lock(cli->cl_close_lock);
 
         rc = client_obd_setup(obd, cfg);
@@ -2500,9 +2508,10 @@ static int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
 
 err_close_lock:
         OBD_FREE(cli->cl_close_lock, sizeof (*cli->cl_close_lock));
+err_ptlrpcd_decref:
+        ptlrpcd_decref();
 err_rpc_lock:
         OBD_FREE(cli->cl_rpc_lock, sizeof (*cli->cl_rpc_lock));
-        ptlrpcd_decref();
         RETURN(rc);
 }
 
@@ -2538,9 +2547,9 @@ static int mdc_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage)
         case OBD_CLEANUP_EARLY:
                 break;
         case OBD_CLEANUP_EXPORTS:
-                /* Failsafe, ok if racy */
-                if (obd->obd_type->typ_refcnt <= 1)
-                        libcfs_kkuc_group_rem(0, KUC_GRP_HSM);
+               /* Failsafe, ok if racy */
+               if (obd->obd_type->typ_refcnt <= 1)
+                       libcfs_kkuc_group_rem(0, KUC_GRP_HSM, NULL);
 
                 obd_cleanup_client_import(obd);
                 ptlrpc_lprocfs_unregister_obd(obd);