Whamcloud - gitweb
LU-6523 lmv: Error not handled for lmv_find_target
[fs/lustre-release.git] / lustre / lmv / lmv_obd.c
index 0198517..f91804e 100644 (file)
@@ -691,14 +691,18 @@ static int lmv_fid2path(struct obd_export *exp, int len, void *karg,
        struct getinfo_fid2path *gf;
        struct lmv_tgt_desc     *tgt;
        struct getinfo_fid2path *remote_gf = NULL;
+       struct lu_fid           root_fid;
        int                     remote_gf_size = 0;
        int                     rc;
 
-       gf = (struct getinfo_fid2path *)karg;
+       gf = karg;
        tgt = lmv_find_target(lmv, &gf->gf_fid);
        if (IS_ERR(tgt))
                RETURN(PTR_ERR(tgt));
 
+       root_fid = *gf->gf_u.gf_root_fid;
+       LASSERT(fid_is_sane(&root_fid));
+
 repeat_fid2path:
        rc = obd_iocontrol(OBD_IOC_FID2PATH, tgt->ltd_exp, len, gf, uarg);
        if (rc != 0 && rc != -EREMOTE)
@@ -711,23 +715,24 @@ repeat_fid2path:
                char *ptr;
 
                ori_gf = (struct getinfo_fid2path *)karg;
-               if (strlen(ori_gf->gf_path) +
-                   strlen(gf->gf_path) > ori_gf->gf_pathlen)
+               if (strlen(ori_gf->gf_u.gf_path) +
+                   strlen(gf->gf_u.gf_path) > ori_gf->gf_pathlen)
                        GOTO(out_fid2path, rc = -EOVERFLOW);
 
-               ptr = ori_gf->gf_path;
+               ptr = ori_gf->gf_u.gf_path;
 
-               memmove(ptr + strlen(gf->gf_path) + 1, ptr,
-                       strlen(ori_gf->gf_path));
+               memmove(ptr + strlen(gf->gf_u.gf_path) + 1, ptr,
+                       strlen(ori_gf->gf_u.gf_path));
 
-               strncpy(ptr, gf->gf_path, strlen(gf->gf_path));
-               ptr += strlen(gf->gf_path);
+               strncpy(ptr, gf->gf_u.gf_path,
+                       strlen(gf->gf_u.gf_path));
+               ptr += strlen(gf->gf_u.gf_path);
                *ptr = '/';
        }
 
        CDEBUG(D_INFO, "%s: get path %s "DFID" rec: "LPU64" ln: %u\n",
               tgt->ltd_exp->exp_obd->obd_name,
-              gf->gf_path, PFID(&gf->gf_fid), gf->gf_recno,
+              gf->gf_u.gf_path, PFID(&gf->gf_fid), gf->gf_recno,
               gf->gf_linkno);
 
        if (rc == 0)
@@ -756,7 +761,8 @@ repeat_fid2path:
        remote_gf->gf_fid = gf->gf_fid;
        remote_gf->gf_recno = -1;
        remote_gf->gf_linkno = -1;
-       memset(remote_gf->gf_path, 0, remote_gf->gf_pathlen);
+       memset(remote_gf->gf_u.gf_path, 0, remote_gf->gf_pathlen);
+       *remote_gf->gf_u.gf_root_fid = root_fid;
        gf = remote_gf;
        goto repeat_fid2path;
 
@@ -777,13 +783,15 @@ static int lmv_hsm_req_count(struct lmv_obd *lmv,
        /* count how many requests must be sent to the given target */
        for (i = 0; i < hur->hur_request.hr_itemcount; i++) {
                curr_tgt = lmv_find_target(lmv, &hur->hur_user_item[i].hui_fid);
+               if (IS_ERR(curr_tgt))
+                       RETURN(PTR_ERR(curr_tgt));
                if (obd_uuid_equals(&curr_tgt->ltd_uuid, &tgt_mds->ltd_uuid))
                        nr++;
        }
        return nr;
 }
 
-static void lmv_hsm_req_build(struct lmv_obd *lmv,
+static int lmv_hsm_req_build(struct lmv_obd *lmv,
                              struct hsm_user_request *hur_in,
                              const struct lmv_tgt_desc *tgt_mds,
                              struct hsm_user_request *hur_out)
@@ -797,6 +805,8 @@ static void lmv_hsm_req_build(struct lmv_obd *lmv,
        for (i = 0; i < hur_in->hur_request.hr_itemcount; i++) {
                curr_tgt = lmv_find_target(lmv,
                                           &hur_in->hur_user_item[i].hui_fid);
+               if (IS_ERR(curr_tgt))
+                       RETURN(PTR_ERR(curr_tgt));
                if (obd_uuid_equals(&curr_tgt->ltd_uuid, &tgt_mds->ltd_uuid)) {
                        hur_out->hur_user_item[nr_out] =
                                                hur_in->hur_user_item[i];
@@ -806,6 +816,8 @@ static void lmv_hsm_req_build(struct lmv_obd *lmv,
        hur_out->hur_request.hr_itemcount = nr_out;
        memcpy(hur_data(hur_out), hur_data(hur_in),
               hur_in->hur_request.hr_data_len);
+
+       RETURN(0);
 }
 
 static int lmv_hsm_ct_unregister(struct lmv_obd *lmv, unsigned int cmd, int len,
@@ -1084,8 +1096,8 @@ static int lmv_iocontrol(unsigned int cmd, struct obd_export *exp,
                } else {
                        /* split fid list to their respective MDS */
                        for (i = 0; i < count; i++) {
-                               unsigned int            nr, reqlen;
-                               int                     rc1;
+                               int nr, rc1;
+                               size_t reqlen;
                                struct hsm_user_request *req;
 
                                tgt = lmv->tgts[i];
@@ -1093,6 +1105,8 @@ static int lmv_iocontrol(unsigned int cmd, struct obd_export *exp,
                                        continue;
 
                                nr = lmv_hsm_req_count(lmv, hur, tgt);
+                               if (nr < 0)
+                                       RETURN(nr);
                                if (nr == 0) /* nothing for this MDS */
                                        continue;
 
@@ -1103,11 +1117,12 @@ static int lmv_iocontrol(unsigned int cmd, struct obd_export *exp,
                                OBD_ALLOC_LARGE(req, reqlen);
                                if (req == NULL)
                                        RETURN(-ENOMEM);
-
-                               lmv_hsm_req_build(lmv, hur, tgt, req);
-
+                               rc1 = lmv_hsm_req_build(lmv, hur, tgt, req);
+                               if (rc1 < 0)
+                                       GOTO(hsm_req_err, rc1);
                                rc1 = obd_iocontrol(cmd, tgt->ltd_exp, reqlen,
                                                    req, uarg);
+hsm_req_err:
                                if (rc1 != 0 && rc == 0)
                                        rc = rc1;
                                OBD_FREE_LARGE(req, reqlen);
@@ -1492,18 +1507,19 @@ out_free_temp:
         return rc;
 }
 
-static int lmv_getstatus(struct obd_export *exp, struct lu_fid *fid)
+static int lmv_get_root(struct obd_export *exp, const char *fileset,
+                       struct lu_fid *fid)
 {
         struct obd_device    *obd = exp->exp_obd;
         struct lmv_obd       *lmv = &obd->u.lmv;
         int                   rc;
         ENTRY;
 
-        rc = lmv_check_connect(obd);
-        if (rc)
-                RETURN(rc);
+       rc = lmv_check_connect(obd);
+       if (rc)
+               RETURN(rc);
 
-       rc = md_getstatus(lmv->tgts[0]->ltd_exp, fid);
+       rc = md_get_root(lmv->tgts[0]->ltd_exp, fileset, fid);
        RETURN(rc);
 }
 
@@ -3323,7 +3339,7 @@ struct obd_ops lmv_obd_ops = {
 };
 
 struct md_ops lmv_md_ops = {
-        .m_getstatus            = lmv_getstatus,
+       .m_get_root             = lmv_get_root,
         .m_null_inode          = lmv_null_inode,
         .m_close                = lmv_close,
         .m_create               = lmv_create,