Whamcloud - gitweb
LU-1330 obdclass: splits server-side object stack from client
[fs/lustre-release.git] / lustre / mdc / mdc_request.c
index 853143f..9f3dea4 100644 (file)
@@ -48,7 +48,6 @@
 #include <lustre_acl.h>
 #include <obd_class.h>
 #include <lustre_fid.h>
-#include <md_object.h>
 #include <lprocfs_status.h>
 #include <lustre_param.h>
 #include <lustre_log.h>
@@ -1198,9 +1197,9 @@ static int mdc_ioc_fid2path(struct obd_export *exp, struct getinfo_fid2path *gf)
         /* Val is struct getinfo_fid2path result plus path */
         vallen = sizeof(*gf) + gf->gf_pathlen;
 
-        rc = obd_get_info(NULL, exp, keylen, key, &vallen, gf, NULL);
-        if (rc)
-                GOTO(out, rc);
+       rc = obd_get_info(NULL, exp, keylen, key, &vallen, gf, NULL);
+       if (rc != 0 && rc != -EREMOTE)
+               GOTO(out, rc);
 
         if (vallen <= sizeof(*gf))
                 GOTO(out, rc = -EPROTO);
@@ -1229,9 +1228,13 @@ 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);
+
        /* Copy hsm_progress struct */
        req_hpk = req_capsule_client_get(&req->rq_pill, &RMF_MDS_HSM_PROGRESS);
-       LASSERT(req_hpk);
+       if (req_hpk == NULL)
+               GOTO(out, rc = -EPROTO);
+
        *req_hpk = *hpk;
 
        ptlrpc_request_set_replen(req);
@@ -1256,10 +1259,14 @@ 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);
+
        /* Copy hsm_progress struct */
        archive_mask = req_capsule_client_get(&req->rq_pill,
                                              &RMF_MDS_HSM_ARCHIVE);
-       LASSERT(archive_mask);
+       if (archive_mask == NULL)
+               GOTO(out, rc = -EPROTO);
+
        *archive_mask = archives;
 
        ptlrpc_request_set_replen(req);
@@ -1327,6 +1334,8 @@ 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);
+
        ptlrpc_request_set_replen(req);
 
        rc = mdc_queue_wait(req);
@@ -1406,7 +1415,8 @@ static int mdc_ioc_hsm_state_set(struct obd_export *exp,
 
        /* Copy states */
        req_hss = req_capsule_client_get(&req->rq_pill, &RMF_HSM_STATE_SET);
-       LASSERT(req_hss);
+       if (req_hss == NULL)
+               GOTO(out, rc = -EPROTO);
        *req_hss = *hss;
 
        ptlrpc_request_set_replen(req);
@@ -1451,18 +1461,21 @@ static int mdc_ioc_hsm_request(struct obd_export *exp,
 
        /* Copy hsm_request struct */
        req_hr = req_capsule_client_get(&req->rq_pill, &RMF_MDS_HSM_REQUEST);
-       LASSERT(req_hr);
+       if (req_hr == NULL)
+               GOTO(out, rc = -EPROTO);
        *req_hr = hur->hur_request;
 
        /* Copy hsm_user_item structs */
        req_hui = req_capsule_client_get(&req->rq_pill, &RMF_MDS_HSM_USER_ITEM);
-       LASSERT(req_hui);
+       if (req_hui == NULL)
+               GOTO(out, rc = -EPROTO);
        memcpy(req_hui, hur->hur_user_item,
               hur->hur_request.hr_itemcount * sizeof(struct hsm_user_item));
 
        /* Copy opaque field */
        req_opaque = req_capsule_client_get(&req->rq_pill, &RMF_GENERIC_DATA);
-       LASSERT(req_opaque);
+       if (req_opaque == NULL)
+               GOTO(out, rc = -EPROTO);
        memcpy(req_opaque, hur_data(hur), hur->hur_request.hr_data_len);
 
        ptlrpc_request_set_replen(req);
@@ -1492,11 +1505,11 @@ static struct kuc_hdr *changelog_kuc_hdr(char *buf, int len, int flags)
 #define D_CHANGELOG 0
 
 struct changelog_show {
-        __u64       cs_startrec;
-        __u32       cs_flags;
-        cfs_file_t *cs_fp;
-        char       *cs_buf;
-        struct obd_device *cs_obd;
+       __u64           cs_startrec;
+       __u32           cs_flags;
+       struct file     *cs_fp;
+       char            *cs_buf;
+       struct obd_device *cs_obd;
 };
 
 static int changelog_show_cb(const struct lu_env *env, struct llog_handle *llh,
@@ -1590,8 +1603,8 @@ static int mdc_changelog_send_thread(void *csdata)
         }
 
 out:
-        cfs_put_file(cs->cs_fp);
-        if (llh)
+       fput(cs->cs_fp);
+       if (llh)
                llog_cat_close(NULL, llh);
         if (ctxt)
                 llog_ctxt_put(ctxt);
@@ -1614,11 +1627,11 @@ static int mdc_ioc_changelog_send(struct obd_device *obd,
         if (!cs)
                 return -ENOMEM;
 
-        cs->cs_obd = obd;
-        cs->cs_startrec = icc->icc_recno;
-        /* matching cfs_put_file in mdc_changelog_send_thread */
-        cs->cs_fp = cfs_get_fd(icc->icc_id);
-        cs->cs_flags = icc->icc_flags;
+       cs->cs_obd = obd;
+       cs->cs_startrec = icc->icc_recno;
+       /* matching fput in mdc_changelog_send_thread */
+       cs->cs_fp = fget(icc->icc_id);
+       cs->cs_flags = icc->icc_flags;
 
         /* New thread because we should return to user app before
            writing into our pipe */
@@ -1960,19 +1973,20 @@ int mdc_get_info_rpc(struct obd_export *exp,
                              RCL_SERVER, vallen);
         ptlrpc_request_set_replen(req);
 
-        rc = ptlrpc_queue_wait(req);
-        if (rc == 0) {
-                tmp = req_capsule_server_get(&req->rq_pill, &RMF_GETINFO_VAL);
-                memcpy(val, tmp, vallen);
-                if (ptlrpc_rep_need_swab(req)) {
-                        if (KEY_IS(KEY_FID2PATH)) {
-                                lustre_swab_fid2path(val);
-                        }
-                }
-        }
-        ptlrpc_req_finished(req);
+       rc = ptlrpc_queue_wait(req);
+       /* -EREMOTE means the get_info result is partial, and it needs to
+        * continue on another MDT, see fid2path part in lmv_iocontrol */
+       if (rc == 0 || rc == -EREMOTE) {
+               tmp = req_capsule_server_get(&req->rq_pill, &RMF_GETINFO_VAL);
+               memcpy(val, tmp, vallen);
+               if (ptlrpc_rep_need_swab(req)) {
+                       if (KEY_IS(KEY_FID2PATH))
+                               lustre_swab_fid2path(val);
+               }
+       }
+       ptlrpc_req_finished(req);
 
-        RETURN(rc);
+       RETURN(rc);
 }
 
 static void lustre_swab_hai(struct hsm_action_item *h)
@@ -2032,11 +2046,12 @@ static int mdc_ioc_hsm_ct_start(struct obd_export *exp,
                if (rc == 0)
                        rc = mdc_ioc_hsm_ct_unregister(imp);
        } else {
-               cfs_file_t *fp = cfs_get_fd(lk->lk_wfd);
+               struct file *fp = fget(lk->lk_wfd);
+
                rc = libcfs_kkuc_group_add(fp, lk->lk_uid, lk->lk_group,
                                           lk->lk_data);
                if (rc && fp)
-                       cfs_put_file(fp);
+                       fput(fp);
                if (rc == 0)
                        rc = mdc_ioc_hsm_ct_register(imp, archive);
        }