int (*m_free_lustre_md)(struct obd_export *, struct lustre_md *);
- int (*m_merge_attr)(struct obd_export *, const struct lu_fid *fid,
+ int (*m_merge_attr)(struct obd_export *,
const struct lmv_stripe_md *lsm,
struct cl_attr *attr, ldlm_blocking_callback);
}
static inline int md_merge_attr(struct obd_export *exp,
- const struct lu_fid *fid,
const struct lmv_stripe_md *lsm,
struct cl_attr *attr,
ldlm_blocking_callback cb)
if (rc)
return rc;
- return MDP(exp->exp_obd, merge_attr)(exp, fid, lsm, attr, cb);
+ return MDP(exp->exp_obd, merge_attr)(exp, lsm, attr, cb);
}
static inline int md_setxattr(struct obd_export *exp, const struct lu_fid *fid,
enum mds_op_bias {
/* MDS_CHECK_SPLIT = 1 << 0, obsolete before 2.3.58 */
+ /* used for remote object getattr/open by name: in the original
+ * getattr/open request, MDT found the object against name is on another
+ * MDT, then packed FID and LOOKUP lock in reply and returned -EREMOTE,
+ * and client knew it's a remote object, then set this flag in
+ * getattr/open request and sent to the corresponding MDT to finish
+ * getattr/open, which fetched attributes and UPDATE lock/opened file.
+ */
MDS_CROSS_REF = 1 << 1,
/* MDS_VTX_BYPASS = 1 << 2, obsolete since 2.3.54 */
MDS_PERM_BYPASS = 1 << 3,
LASSERT(lli->lli_lsm_md != NULL);
down_read(&lli->lli_lsm_sem);
- rc = md_merge_attr(ll_i2mdexp(inode), &lli->lli_fid, lli->lli_lsm_md,
+ rc = md_merge_attr(ll_i2mdexp(inode), ll_i2info(inode)->lli_lsm_md,
&attr, ll_md_blocking_ast);
up_read(&lli->lli_lsm_sem);
if (rc != 0)
GOTO(unlock, rc = -ENOMEM);
/* validate the lsm */
- rc = md_merge_attr(ll_i2mdexp(inode), &lli->lli_fid, lli->lli_lsm_md,
- attr, ll_md_blocking_ast);
+ rc = md_merge_attr(ll_i2mdexp(inode), lli->lli_lsm_md, attr,
+ ll_md_blocking_ast);
if (!rc) {
if (md->body->mbo_valid & OBD_MD_FLNLINK)
md->body->mbo_nlink = attr->cat_nlink;
}
int lmv_revalidate_slaves(struct obd_export *exp,
- const struct lu_fid *pfid,
const struct lmv_stripe_md *lsm,
ldlm_blocking_callback cb_blocking,
int extra_lock_flags)
* which is not needed here.
*/
memset(op_data, 0, sizeof(*op_data));
- if (exp_connect_flags2(exp) & OBD_CONNECT2_GETATTR_PFID)
- op_data->op_fid1 = *pfid;
- else
- op_data->op_fid1 = fid;
+ op_data->op_fid1 = fid;
op_data->op_fid2 = fid;
+ /* shard revalidate only needs to fetch attributes and UPDATE
+ * lock, which is similar to the bottom half of remote object
+ * getattr, set this flag so that MDT skips checking whether
+ * it's remote object.
+ */
+ op_data->op_bias = MDS_CROSS_REF;
tgt = lmv_get_target(lmv, lsm->lsm_md_oinfo[i].lmo_mds, NULL);
if (IS_ERR(tgt))
/* If RPC happens, lsm information will be revalidated
* during update_inode process (see ll_update_lsm_md) */
if (op_data->op_mea2 != NULL) {
- rc = lmv_revalidate_slaves(exp, &op_data->op_fid2,
- op_data->op_mea2,
+ rc = lmv_revalidate_slaves(exp, op_data->op_mea2,
cb_blocking,
extra_lock_flags);
if (rc != 0)
struct lu_fid *fid, struct md_op_data *op_data);
int lmv_revalidate_slaves(struct obd_export *exp,
- const struct lu_fid *pfid,
const struct lmv_stripe_md *lsm,
ldlm_blocking_callback cb_blocking,
int extra_lock_flags);
}
static int lmv_merge_attr(struct obd_export *exp,
- const struct lu_fid *fid,
const struct lmv_stripe_md *lsm,
struct cl_attr *attr,
ldlm_blocking_callback cb_blocking)
int rc;
int i;
- rc = lmv_revalidate_slaves(exp, fid, lsm, cb_blocking, 0);
+ rc = lmv_revalidate_slaves(exp, lsm, cb_blocking, 0);
if (rc < 0)
return rc;
return index1 != index2;
}
-static bool mdt_object_is_shard(struct mdt_thread_info *info,
- struct mdt_object *obj)
-{
- struct lmv_mds_md_v1 *lmv = (struct lmv_mds_md_v1 *)info->mti_xattr_buf;
- struct lu_buf buf;
- int rc;
-
- if (!mdt_object_exists(obj))
- return false;
-
- if (!S_ISDIR(lu_object_attr(&obj->mot_obj)))
- return false;
-
- buf.lb_buf = lmv;
- buf.lb_len = sizeof(*lmv);
- rc = mo_xattr_get(info->mti_env, mdt_object_child(obj), &buf,
- XATTR_NAME_LMV);
- if (rc < 0)
- return false;
-
- return lmv->lmv_magic == cpu_to_le32(LMV_MAGIC_STRIPE);
-}
-
/**
* Check whether \a child is remote object on \a parent.
*
RETURN(0);
if (likely(parent != child)) {
- if (mdt_object_remote(parent) ^ mdt_object_remote(child)) {
- /* don't treat shard as remote object, otherwise client
- * need to revalidate shards all the time.
- */
- if (mdt_object_is_shard(info, child))
- RETURN(0);
+ if (mdt_object_remote(parent) ^ mdt_object_remote(child))
RETURN(1);
- }
if (!mdt_object_remote(parent) && !mdt_object_remote(child))
RETURN(0);