Whamcloud - gitweb
LU-14579 flr: GPF in lod_sub_declare_destroy 99/43199/5
authorBobi Jam <bobijam@whamcloud.com>
Fri, 2 Apr 2021 04:47:32 +0000 (12:47 +0800)
committerOleg Drokin <green@whamcloud.com>
Thu, 15 Apr 2021 06:30:12 +0000 (06:30 +0000)
mirror split and unlink race reveals some problem:

- in mdd_unlink(), protect mdd_declare_unlink() in mdd_write_lock.

- lod_parse_striping() need to free lod's striping in memroy before
  parsing on-disk LOVEA.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I44182eb9139c35f57d711ef5f7db65c0ccfca56c
Reviewed-on: https://review.whamcloud.com/43199
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Yingjin Qian <qian@ddn.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lod/lod_lov.c
lustre/lod/lod_object.c
lustre/mdd/mdd_dir.c

index 4376eaa..849414b 100644 (file)
@@ -1126,10 +1126,7 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
            magic != LOV_MAGIC_SEL)
                GOTO(out, rc = -EINVAL);
 
-       if (lo->ldo_is_foreign)
-               lod_free_foreign_lov(lo);
-       else
-               lod_free_comp_entries(lo);
+       lod_striping_free_nolock(env, lo);
 
        if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                comp_v1 = (struct lov_comp_md_v1 *)lmm;
@@ -1462,7 +1459,6 @@ int lod_striping_reload(const struct lu_env *env, struct lod_object *lo,
        ENTRY;
 
        mutex_lock(&lo->ldo_layout_mutex);
-       lod_striping_free_nolock(env, lo);
        rc = lod_parse_striping(env, lo, buf);
        mutex_unlock(&lo->ldo_layout_mutex);
 
index e861921..017d389 100644 (file)
@@ -6057,8 +6057,8 @@ lod_obj_stripe_destroy_cb(const struct lu_env *env, struct lod_object *lo,
        else if (!OBD_FAIL_CHECK(OBD_FAIL_LFSCK_LOST_SPEOBJ) ||
                 stripe_idx == cfs_fail_val)
                return lod_sub_destroy(env, dt, th);
-       else
-               return 0;
+
+       return 0;
 }
 
 /**
index ce98d97..2e0a55e 100644 (file)
@@ -1740,17 +1740,17 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj,
        if (IS_ERR(handle))
                RETURN(PTR_ERR(handle));
 
+       if (likely(mdd_cobj != NULL))
+               mdd_write_lock(env, mdd_cobj, DT_TGT_CHILD);
+
        rc = mdd_declare_unlink(env, mdd, mdd_pobj, mdd_cobj,
                                lname, ma, handle, no_name, is_dir);
        if (rc)
-               GOTO(stop, rc);
+               GOTO(cleanup, rc);
 
        rc = mdd_trans_start(env, mdd, handle);
        if (rc)
-               GOTO(stop, rc);
-
-       if (likely(mdd_cobj != NULL))
-               mdd_write_lock(env, mdd_cobj, DT_TGT_CHILD);
+               GOTO(cleanup, rc);
 
        if (likely(no_name == 0) && !OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING2)) {
                rc = __mdd_index_delete(env, mdd_pobj, name, is_dir, handle);
@@ -1792,7 +1792,7 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj,
 
        /* Enough for only unlink the entry */
        if (unlikely(mdd_cobj == NULL))
-               GOTO(stop, rc);
+               GOTO(cleanup, rc);
 
        if (cattr->la_nlink > 0 || mdd_cobj->mod_count > 0) {
                /* update ctime of an unlinked file only if it is still
@@ -1841,7 +1841,6 @@ cleanup:
                        lname, NULL, handle);
        }
 
-stop:
        rc = mdd_trans_stop(env, mdd, rc, handle);
 
        return rc;