repbody->oa.o_layout_version =
fo->ofo_ff.ff_layout_version + fo->ofo_ff.ff_range;
- CDEBUG(D_INODE, DFID": get layout version: %u\n",
+ CDEBUG(D_INODE, "%s:"DFID": get layout version: %#x\n",
+ tsi->tsi_tgt->lut_obd->obd_name,
PFID(&tsi->tsi_fid),
repbody->oa.o_layout_version);
}
struct ofd_object *ofd_object_find(const struct lu_env *env,
struct ofd_device *ofd,
const struct lu_fid *fid);
-int ofd_object_ff_load(const struct lu_env *env, struct ofd_object *fo);
+int ofd_object_ff_load(const struct lu_env *env, struct ofd_object *fo,
+ bool force);
int ofd_object_ff_update(const struct lu_env *env, struct ofd_object *fo,
const struct obdo *oa, struct filter_fid *ff);
int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
if (fo->ofo_pfid_checking)
RETURN(-EINPROGRESS);
- rc = ofd_object_ff_load(env, fo);
+ rc = ofd_object_ff_load(env, fo, false);
if (rc == -ENODATA)
RETURN(0);
struct ofd_object *fo, const struct obdo *oa)
{
int rc;
+ bool force = false;
+
ENTRY;
if (unlikely(CFS_FAIL_CHECK(OBD_FAIL_OST_SKIP_LV_CHECK)))
GOTO(out, rc = 0);
- rc = ofd_object_ff_load(env, fo);
+again:
+ rc = ofd_object_ff_load(env, fo, force);
if (rc < 0) {
if (rc == -ENODATA)
rc = 0;
* that on the disk.
*/
if (ofd_layout_version_less(oa->o_layout_version,
- fo->ofo_ff.ff_layout_version))
+ fo->ofo_ff.ff_layout_version)) {
+ /* the object's filter_fid could be changed via
+ * out_xattr_set(), and the ofd_object::ofo_ff is out of date.
+ */
+ if (!force) {
+ force = true;
+ GOTO(again, rc);
+ }
GOTO(out, rc = -ESTALE);
+ }
out:
- CDEBUG(D_INODE, DFID " verify layout version: %u vs. %u/%u: rc = %d\n",
+ CDEBUG(D_INODE,
+ "%s:"DFID" verify layout version: %#x/%#x -> %#x, rc: %d\n",
+ ofd_name(ofd_obj2dev(fo)),
PFID(lu_object_fid(&fo->ofo_obj.do_lu)),
- oa->o_layout_version, fo->ofo_ff.ff_layout_version,
- fo->ofo_ff.ff_range, rc);
+ fo->ofo_ff.ff_layout_version, fo->ofo_ff.ff_range,
+ oa->o_layout_version, rc);
RETURN(rc);
}
/* no attributes to set */
GOTO(out_unlock, rc = 0);
-
-
/* set uid/gid/projid */
if (la->la_valid) {
rc = dt_attr_set(env, dt_obj, la, th);
*
* \param[in] env execution environment
* \param[in] fo OFD object
+ * \param[in] force force to read EA XATTR_NAME_FID
*
* \retval 0 if successful
* \retval -ENODATA if there is no such xattr
* \retval negative value on error
*/
-int ofd_object_ff_load(const struct lu_env *env, struct ofd_object *fo)
+int ofd_object_ff_load(const struct lu_env *env, struct ofd_object *fo,
+ bool force)
{
struct ofd_thread_info *info = ofd_info(env);
struct filter_fid *ff = &fo->ofo_ff;
struct lu_buf *buf = &info->fti_buf;
int rc = 0;
- if (fid_is_sane(&ff->ff_parent))
+ if (fid_is_sane(&ff->ff_parent) && !force)
return 0;
buf->lb_buf = ff;
const struct obdo *oa, struct filter_fid *ff)
{
int rc = 0;
+
ENTRY;
if (!(oa->o_valid &
(OBD_MD_FLFID | OBD_MD_FLOSTLAYOUT | OBD_MD_LAYOUT_VERSION)))
RETURN(0);
- rc = ofd_object_ff_load(env, fo);
+ rc = ofd_object_ff_load(env, fo, true);
if (rc < 0 && rc != -ENODATA)
RETURN(rc);
ff->ff_layout = oa->o_layout;
if (oa->o_valid & OBD_MD_LAYOUT_VERSION) {
- CDEBUG(D_INODE, DFID": OST("DFID") layout version %u -> %u\n",
+ CDEBUG(D_INODE,
+ "%s:"DFID":"DFID" layout version %#x -> %#x, oa_valid %#llx\n",
+ ofd_name(ofd_obj2dev(fo)),
PFID(&fo->ofo_ff.ff_parent),
PFID(lu_object_fid(&fo->ofo_obj.do_lu)),
- ff->ff_layout_version, oa->o_layout_version);
-
- /**
+ ff->ff_layout_version, oa->o_layout_version,
+ oa->o_valid);
+ /*
* resync write from client on non-primary objects and
* resync start from MDS on primary objects will contain
* LU_LAYOUT_RESYNC flag in the @oa.
RETURN(rc);
if (ff != NULL) {
- rc = ofd_object_ff_load(env, fo);
+ rc = ofd_object_ff_load(env, fo, false);
if (rc == -ENODATA)
ff_needed = true;
else if (rc < 0)
error "setstripe $tf failed"
FSXNUM=${FSXNUM:-1000}
- $FSX -p 1 -N $FSXNUM -S 0 -M $tf || error "fsx FLR file $tf failed"
+ FSXSEED=${FSXSEED:-0}
+ $FSX -p 1 -N $FSXNUM -S $FSXSEED -M $tf ||
+ error "fsx FLR file $tf failed"
}
run_test 70a "flr mode fsx test"