From bd596fbe449f4fbab18ed184ccce1e141928b116 Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Fri, 31 Aug 2018 19:47:12 +0800 Subject: [PATCH] LU-4684 migrate: replace PFID via source 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 Change-Id: Icd7f6521ecac43cfeaee3e61e662d94115d63d68 Reviewed-on: https://review.whamcloud.com/33324 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Mike Pershin Reviewed-by: Oleg Drokin --- lustre/lod/lod_internal.h | 1 + lustre/lod/lod_object.c | 35 +++++++++++++++++++---------------- lustre/mdd/mdd_dir.c | 31 +++++++++++++++++++------------ 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/lustre/lod/lod_internal.h b/lustre/lod/lod_internal.h index 005a12a..1039942 100644 --- a/lustre/lod/lod_internal.h +++ b/lustre/lod/lod_internal.h @@ -710,6 +710,7 @@ struct lod_obj_stripe_cb_data { 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; diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index 847625b..69da6a3 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -2473,20 +2473,25 @@ lod_obj_stripe_replace_parent_fid_cb(const struct lu_env *env, 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 */ - 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; @@ -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, + 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 lu_buf *buf = &info->lti_buf; 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); } - 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_buf = buf; 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) { - 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); } @@ -4230,7 +4233,7 @@ static int lod_xattr_set(const struct lu_env *env, } 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); } diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 59072c5..4ecd99c 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -3931,18 +3931,19 @@ static int mdd_declare_migrate_create(const struct lu_env *env, return rc; if (S_ISREG(attr->la_mode)) { + struct lu_buf fid_buf; + 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; - /* - * 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; } @@ -4052,18 +4053,24 @@ static int mdd_migrate_create(const struct lu_env *env, if (rc) RETURN(rc); + /* for regular file, update OST objects XATTR_NAME_FID */ 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); - - /* 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)) -- 1.8.3.1