staging: lustre: hsm: prevent migration of HSM archived files
authorJohn L. Hammond <john.hammond@intel.com>
Thu, 10 Nov 2016 17:31:03 +0000 (12:31 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 Nov 2016 15:02:55 +0000 (16:02 +0100)
The reference copytool cannot handle migration of HSM archive
files. In the MDT migration path check for HSM attributes and fail if
they are present. In the LMV layer allow creation of volatile files
with any MDT index. Add a test to sanity-hsm to ensure that attempting
to migrate an HSM archive file is handled safely.

Signed-off-by: John L. Hammond <john.hammond@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6866
Reviewed-on: http://review.whamcloud.com/17511
Reviewed-by: wangdi <di.wang@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/lmv/lmv_obd.c

index 12e8b1e577e46ad31bc97fd59a00d443f92fc705..c4e29f28fb8e24edfa0c1e2c14b43c9f6e4f2f6d 100644 (file)
@@ -1618,27 +1618,28 @@ lmv_locate_mds(struct lmv_obd *lmv, struct md_op_data *op_data,
         * ct_restore().
         */
        if (op_data->op_bias & MDS_CREATE_VOLATILE &&
-           (int)op_data->op_mds != -1 && lsm) {
+           (int)op_data->op_mds != -1) {
                int i;
 
                tgt = lmv_get_target(lmv, op_data->op_mds, NULL);
                if (IS_ERR(tgt))
                        return tgt;
 
-               /* refill the right parent fid */
-               for (i = 0; i < lsm->lsm_md_stripe_count; i++) {
-                       struct lmv_oinfo *oinfo;
+               if (lsm) {
+                       /* refill the right parent fid */
+                       for (i = 0; i < lsm->lsm_md_stripe_count; i++) {
+                               struct lmv_oinfo *oinfo;
 
-                       oinfo = &lsm->lsm_md_oinfo[i];
-                       if (oinfo->lmo_mds == op_data->op_mds) {
-                               *fid = oinfo->lmo_fid;
-                               break;
+                               oinfo = &lsm->lsm_md_oinfo[i];
+                               if (oinfo->lmo_mds == op_data->op_mds) {
+                                       *fid = oinfo->lmo_fid;
+                                       break;
+                               }
                        }
-               }
 
-               /* Hmm, can not find the stripe by mdt_index(op_mds) */
-               if (i == lsm->lsm_md_stripe_count)
-                       tgt = ERR_PTR(-EINVAL);
+                       if (i == lsm->lsm_md_stripe_count)
+                               *fid = lsm->lsm_md_oinfo[0].lmo_fid;
+               }
 
                return tgt;
        }