Whamcloud - gitweb
LU-14448 lod: verify LOV early in lod_get_default_striping 70/45370/3
authorLai Siyao <lai.siyao@whamcloud.com>
Sat, 23 Oct 2021 14:44:36 +0000 (10:44 -0400)
committerOleg Drokin <green@whamcloud.com>
Sat, 20 Nov 2021 06:28:16 +0000 (06:28 +0000)
lod_get_default_striping() will get both default LOV and default LMV,
and parse them to struct lod_default_striping one by one, however the
LOV and LMV data are both stored in lod_thread_info.lti_ea_store, so
lod_verify_striping() should verify LOV upon getting LOV, otherwise
if both exists, it's LMV that's verified, which will return -EINVAL.

Fixes: 6a08df2d0effc7a ("LU-14448 lod: verify LOV before set/inherit")
Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: I9763d35bdbc74101fa8515d5096ec457a4cb3524
Reviewed-on: https://review.whamcloud.com/45370
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Hongchao Zhang <hongchao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lod/lod_object.c

index 95319e5..e4147b8 100644 (file)
@@ -5312,6 +5312,15 @@ static int lod_get_default_striping(const struct lu_env *env,
        int rc, rc1;
 
        rc = lod_get_default_lov_striping(env, lo, lds, NULL);
+       if (lds->lds_def_striping_set) {
+               struct lod_thread_info *info = lod_env_info(env);
+               struct lod_device *d = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
+
+               rc = lod_verify_striping(env, d, lo, &info->lti_buf, false);
+               if (rc)
+                       lds->lds_def_striping_set = 0;
+       }
+
        rc1 = lod_get_default_lmv_striping(env, lo, lds);
        if (rc == 0 && rc1 < 0)
                rc = rc1;
@@ -5516,12 +5525,6 @@ static void lod_ah_init(const struct lu_env *env,
                 */
                if (likely(lp != NULL)) {
                        lod_get_default_striping(env, lp, lds);
-                       if (lds->lds_def_striping_set) {
-                               rc = lod_verify_striping(env, d, lp,
-                                                        &info->lti_buf, false);
-                               if (rc)
-                                       lds->lds_def_striping_set = 0;
-                       }
                        /* inherit default striping except ROOT */
                        if ((lds->lds_def_striping_set ||
                             lds->lds_dir_def_striping_set) &&