struct lod_obj_stripe_cb_data *data)
{
struct lod_thread_info *info = lod_env_info(env);
+ struct lod_layout_component *comp = &lo->ldo_comp_entries[comp_idx];
struct filter_fid *ff = &info->lti_ff;
struct lu_buf *buf = &info->lti_buf;
int rc;
buf->lb_buf = ff;
buf->lb_len = sizeof(*ff);
rc = dt_xattr_get(env, dt, buf, XATTR_NAME_FID);
- if (rc == -ENODATA)
- return 0;
-
- if (rc < 0)
+ if (rc < 0) {
+ if (rc == -ENODATA)
+ return 0;
return rc;
+ }
+
+ filter_fid_le_to_cpu(ff, ff, sizeof(*ff));
+ if (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;
+ /* 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;
- fid_cpu_to_le(&ff->ff_parent, &ff->ff_parent);
+ ff->ff_layout.ol_stripe_size = comp->llc_stripe_size;
+ ff->ff_layout.ol_stripe_count = comp->llc_stripe_count;
+ ff->ff_layout.ol_comp_id = comp->llc_id;
+ ff->ff_layout.ol_comp_start = comp->llc_extent.e_start;
+ ff->ff_layout.ol_comp_end = comp->llc_extent.e_end;
+ filter_fid_cpu_to_le(ff, ff, sizeof(*ff));
+
if (data->locd_declare)
rc = lod_sub_declare_xattr_set(env, dt, buf, XATTR_NAME_FID,
LU_XATTR_REPLACE, th);
return rc;
}
+static int mdd_object_pfid_replace(const struct lu_env *env,
+ struct mdd_object *o)
+{
+ struct mdd_device *mdd = mdo2mdd(&o->mod_obj);
+ struct thandle *handle;
+ int rc;
+
+ handle = mdd_trans_create(env, mdd);
+ if (IS_ERR(handle))
+ RETURN(PTR_ERR(handle));
+
+ handle->th_complex = 1;
+
+ /* it doesn't need to track the PFID update via llog, because LFSCK
+ * will repair it even it goes wrong */
+ rc = mdd_declare_xattr_set(env, mdd, o, NULL, XATTR_NAME_FID,
+ 0, handle);
+ if (rc)
+ GOTO(out, rc);
+
+ rc = mdd_trans_start(env, mdd, handle);
+ if (rc != 0)
+ GOTO(out, rc);
+
+ rc = mdo_xattr_set(env, o, NULL, XATTR_NAME_FID, 0, handle);
+ if (rc)
+ GOTO(out, rc);
+
+out:
+ mdd_trans_stop(env, mdd, rc, handle);
+ return rc;
+}
+
+
static int mdd_declare_xattr_del(const struct lu_env *env,
struct mdd_device *mdd,
struct mdd_object *obj,
GOTO(out, rc);
rc = mdo_xattr_del(env, vic, XATTR_NAME_LOV, handle);
- if (rc) { /* wtf? */
- int rc2;
+ if (rc) /* wtf? */
+ GOTO(out_restore, rc);
- rc2 = mdo_xattr_set(env, obj, buf, XATTR_NAME_LOV,
- LU_XATTR_REPLACE, handle);
+ (void)mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, obj, handle);
+ (void)mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, vic, handle);
+ EXIT;
+
+out_restore:
+ if (rc) {
+ int rc2 = mdo_xattr_set(env, obj, buf, XATTR_NAME_LOV,
+ LU_XATTR_REPLACE, handle);
if (rc2)
CERROR("%s: failed to rollback of layout of: "DFID
": %d, file state unknown\n",
mdd_obj_dev_name(obj), PFID(mdo2fid(obj)), rc2);
- GOTO(out, rc);
}
- (void)mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, obj, handle);
- (void)mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, vic, handle);
- EXIT;
-
out:
mdd_trans_stop(env, mdd, rc, handle);
mdd_write_unlock(env, obj);
lu_buf_free(buf);
lu_buf_free(buf_vic);
+ if (!rc)
+ (void) mdd_object_pfid_replace(env, obj);
+
return rc;
}
else
rc = mdo_xattr_del(env, snd_o, XATTR_NAME_LOV, handle);
}
+ if (rc != 0)
+ GOTO(out_restore, rc);
+
+ /* Issue one changelog record per file */
+ rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, fst_o, handle);
+ if (rc)
+ GOTO(stop, rc);
+
+ rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, snd_o, handle);
+ if (rc)
+ GOTO(stop, rc);
+ EXIT;
+out_restore:
if (rc != 0) {
int steps = 0;
*/
LBUG();
}
- GOTO(stop, rc);
}
- /* Issue one changelog record per file */
- rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, fst_o, handle);
- if (rc)
- GOTO(stop, rc);
-
- rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, snd_o, handle);
- if (rc)
- GOTO(stop, rc);
- EXIT;
-
stop:
rc = mdd_trans_stop(env, mdd, rc, handle);
lu_buf_free(snd_buf);
lu_buf_free(fst_hsm_buf);
lu_buf_free(snd_hsm_buf);
+
+ if (!rc) {
+ (void) mdd_object_pfid_replace(env, fst_o);
+ (void) mdd_object_pfid_replace(env, snd_o);
+ }
return rc;
}