Whamcloud - gitweb
LU-4684 migrate: replace PFID via source 24/33324/2
authorLai Siyao <lai.siyao@intel.com>
Fri, 31 Aug 2018 11:47:12 +0000 (19:47 +0800)
committerOleg Drokin <green@whamcloud.com>
Mon, 29 Oct 2018 15:58:11 +0000 (15:58 +0000)
In directory migration, when it needs to update OST object PFID,
it should always do via source object, because target object may
be remote. And in this case, lod_obj_stripe_replace_parent_fid_cb()
doesn't compare parent FID with that in XATTR_NAME_FID, but set
with the passed in FID directly.

Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: Icd7f6521ecac43cfeaee3e61e662d94115d63d68
Reviewed-on: https://review.whamcloud.com/33324
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Mike Pershin <mpershin@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lod/lod_internal.h
lustre/lod/lod_object.c
lustre/mdd/mdd_dir.c

index 005a12a..1039942 100644 (file)
@@ -710,6 +710,7 @@ struct lod_obj_stripe_cb_data {
        union {
                const struct lu_attr    *locd_attr;
                int                     locd_ost_index;
        union {
                const struct lu_attr    *locd_attr;
                int                     locd_ost_index;
+               const struct lu_buf     *locd_buf;
        };
        lod_obj_stripe_cb_t             locd_stripe_cb;
        lod_obj_comp_skip_cb_t          locd_comp_skip_cb;
        };
        lod_obj_stripe_cb_t             locd_stripe_cb;
        lod_obj_comp_skip_cb_t          locd_comp_skip_cb;
index 847625b..69da6a3 100644 (file)
@@ -2473,20 +2473,25 @@ lod_obj_stripe_replace_parent_fid_cb(const struct lu_env *env,
                return rc;
        }
 
                return rc;
        }
 
-       filter_fid_le_to_cpu(ff, ff, sizeof(*ff));
-
        /*
        /*
-        * mdd_declare_migrate_create() declares this via source object because
-        * target is not ready yet, so declare anyway.
+        * locd_buf is set if it's called by dir migration, which doesn't check
+        * pfid and comp id.
         */
         */
-       if (!data->locd_declare &&
-           lu_fid_eq(lu_object_fid(&lo->ldo_obj.do_lu), &ff->ff_parent) &&
-           ff->ff_layout.ol_comp_id == comp->llc_id)
-               return 0;
+       if (data->locd_buf) {
+               memset(ff, 0, sizeof(*ff));
+               ff->ff_parent = *(struct lu_fid *)data->locd_buf->lb_buf;
+       } else {
+               filter_fid_le_to_cpu(ff, ff, sizeof(*ff));
+
+               if (lu_fid_eq(lod_object_fid(lo), &ff->ff_parent) &&
+                   ff->ff_layout.ol_comp_id == comp->llc_id)
+                       return 0;
+
+               memset(ff, 0, sizeof(*ff));
+               ff->ff_parent = *lu_object_fid(&lo->ldo_obj.do_lu);
+       }
 
        /* rewrite filter_fid */
 
        /* rewrite filter_fid */
-       memset(ff, 0, sizeof(*ff));
-       ff->ff_parent = *lu_object_fid(&lo->ldo_obj.do_lu);
        ff->ff_parent.f_ver = stripe_idx;
        ff->ff_layout.ol_stripe_size = comp->llc_stripe_size;
        ff->ff_layout.ol_stripe_count = comp->llc_stripe_count;
        ff->ff_parent.f_ver = stripe_idx;
        ff->ff_layout.ol_stripe_size = comp->llc_stripe_size;
        ff->ff_layout.ol_stripe_count = comp->llc_stripe_count;
@@ -2522,11 +2527,11 @@ lod_obj_stripe_replace_parent_fid_cb(const struct lu_env *env,
  */
 static int lod_replace_parent_fid(const struct lu_env *env,
                                  struct dt_object *dt,
  */
 static int lod_replace_parent_fid(const struct lu_env *env,
                                  struct dt_object *dt,
+                                 const struct lu_buf *buf,
                                  struct thandle *th, bool declare)
 {
        struct lod_object *lo = lod_dt_obj(dt);
        struct lod_thread_info  *info = lod_env_info(env);
                                  struct thandle *th, bool declare)
 {
        struct lod_object *lo = lod_dt_obj(dt);
        struct lod_thread_info  *info = lod_env_info(env);
-       struct lu_buf *buf = &info->lti_buf;
        struct filter_fid *ff;
        struct lod_obj_stripe_cb_data data = { { 0 } };
        int rc;
        struct filter_fid *ff;
        struct lod_obj_stripe_cb_data data = { { 0 } };
        int rc;
@@ -2548,11 +2553,9 @@ static int lod_replace_parent_fid(const struct lu_env *env,
                        RETURN(rc);
        }
 
                        RETURN(rc);
        }
 
-       buf->lb_buf = info->lti_ea_store;
-       buf->lb_len = info->lti_ea_store_size;
-
        data.locd_declare = declare;
        data.locd_stripe_cb = lod_obj_stripe_replace_parent_fid_cb;
        data.locd_declare = declare;
        data.locd_stripe_cb = lod_obj_stripe_replace_parent_fid_cb;
+       data.locd_buf = buf;
        rc = lod_obj_for_each_stripe(env, lo, th, &data);
 
        RETURN(rc);
        rc = lod_obj_for_each_stripe(env, lo, th, &data);
 
        RETURN(rc);
@@ -3361,7 +3364,7 @@ static int lod_declare_xattr_set(const struct lu_env *env,
        } else if (S_ISDIR(mode)) {
                rc = lod_dir_declare_xattr_set(env, dt, buf, name, fl, th);
        } else if (strcmp(name, XATTR_NAME_FID) == 0) {
        } else if (S_ISDIR(mode)) {
                rc = lod_dir_declare_xattr_set(env, dt, buf, name, fl, th);
        } else if (strcmp(name, XATTR_NAME_FID) == 0) {
-               rc = lod_replace_parent_fid(env, dt, th, true);
+               rc = lod_replace_parent_fid(env, dt, buf, th, true);
        } else {
                rc = lod_sub_declare_xattr_set(env, next, buf, name, fl, th);
        }
        } else {
                rc = lod_sub_declare_xattr_set(env, next, buf, name, fl, th);
        }
@@ -4230,7 +4233,7 @@ static int lod_xattr_set(const struct lu_env *env,
                }
                RETURN(rc);
        } else if (strcmp(name, XATTR_NAME_FID) == 0) {
                }
                RETURN(rc);
        } else if (strcmp(name, XATTR_NAME_FID) == 0) {
-               rc = lod_replace_parent_fid(env, dt, th, false);
+               rc = lod_replace_parent_fid(env, dt, buf, th, false);
 
                RETURN(rc);
        }
 
                RETURN(rc);
        }
index 59072c5..4ecd99c 100644 (file)
@@ -3931,18 +3931,19 @@ static int mdd_declare_migrate_create(const struct lu_env *env,
                return rc;
 
        if (S_ISREG(attr->la_mode)) {
                return rc;
 
        if (S_ISREG(attr->la_mode)) {
+               struct lu_buf fid_buf;
+
                handle->th_complex = 1;
 
                handle->th_complex = 1;
 
-               rc = mdo_declare_xattr_del(env, sobj, XATTR_NAME_LOV, handle);
+               /* target may be remote, update PFID via sobj. */
+               fid_buf.lb_buf = (void *)mdo2fid(tobj);
+               fid_buf.lb_len = sizeof(struct lu_fid);
+               rc = mdo_declare_xattr_set(env, sobj, &fid_buf, XATTR_NAME_FID,
+                                          0, handle);
                if (rc)
                        return rc;
 
                if (rc)
                        return rc;
 
-               /*
-                * target is not initalized because its LOV is copied from
-                * source in mdd_migrate_create(), declare via sobj.
-                */
-               rc = mdo_declare_xattr_set(env, sobj, NULL, XATTR_NAME_FID, 0,
-                                          handle);
+               rc = mdo_declare_xattr_del(env, sobj, XATTR_NAME_LOV, handle);
                if (rc)
                        return rc;
        }
                if (rc)
                        return rc;
        }
@@ -4052,18 +4053,24 @@ static int mdd_migrate_create(const struct lu_env *env,
        if (rc)
                RETURN(rc);
 
        if (rc)
                RETURN(rc);
 
+       /* for regular file, update OST objects XATTR_NAME_FID */
        if (S_ISREG(attr->la_mode)) {
        if (S_ISREG(attr->la_mode)) {
+               struct lu_buf fid_buf;
+
+               /* target may be remote, update PFID via sobj. */
+               fid_buf.lb_buf = (void *)mdo2fid(tobj);
+               fid_buf.lb_len = sizeof(struct lu_fid);
+               rc = mdo_xattr_set(env, sobj, &fid_buf, XATTR_NAME_FID, 0,
+                                  handle);
+               if (rc)
+                       RETURN(rc);
+
                /* delete LOV to avoid deleting OST objs when destroying sobj */
                mdd_write_lock(env, sobj, MOR_SRC_CHILD);
                rc = mdo_xattr_del(env, sobj, XATTR_NAME_LOV, handle);
                mdd_write_unlock(env, sobj);
                if (rc)
                        RETURN(rc);
                /* delete LOV to avoid deleting OST objs when destroying sobj */
                mdd_write_lock(env, sobj, MOR_SRC_CHILD);
                rc = mdo_xattr_del(env, sobj, XATTR_NAME_LOV, handle);
                mdd_write_unlock(env, sobj);
                if (rc)
                        RETURN(rc);
-
-               /* for regular file, update OST objects XATTR_NAME_FID */
-               rc = mdo_xattr_set(env, tobj, NULL, XATTR_NAME_FID, 0, handle);
-               if (rc)
-                       RETURN(rc);
        }
 
        if (!S_ISDIR(attr->la_mode))
        }
 
        if (!S_ISDIR(attr->la_mode))