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>
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;
- 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);
+ }
- 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;
*/
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;
- 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;
rc = lod_obj_for_each_stripe(env, lo, th, &data);
RETURN(rc);
rc = lod_obj_for_each_stripe(env, lo, th, &data);
RETURN(rc);
} 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);
}
}
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;
if (S_ISREG(attr->la_mode)) {
return rc;
if (S_ISREG(attr->la_mode)) {
+ struct lu_buf fid_buf;
+
- 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);
- /*
- * 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);
+ /* 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))