mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-07 10:03:24 +00:00
staging: lustre: lmv: validate lock with correct stripe FID
In ll_lookup_it_finish, we need use the real parent(stripe) FID to validate the parent UPDATE lock. Signed-off-by: wang di <di.wang@intel.com> Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-4925 Reviewed-on: http://review.whamcloud.com/10026 Reviewed-by: John L. Hammond <john.hammond@intel.com> Reviewed-by: Andreas Dilger <andreas.dilger@intel.com> Reviewed-by: Oleg Drokin <oleg.drokin@intel.com> Signed-off-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
ef21b1fb83
commit
a609c39370
@ -1103,6 +1103,11 @@ struct md_ops {
|
||||
ldlm_policy_data_t *, enum ldlm_mode,
|
||||
enum ldlm_cancel_flags flags, void *opaque);
|
||||
|
||||
int (*get_fid_from_lsm)(struct obd_export *,
|
||||
const struct lmv_stripe_md *,
|
||||
const char *name, int namelen,
|
||||
struct lu_fid *fid);
|
||||
|
||||
int (*intent_getattr_async)(struct obd_export *,
|
||||
struct md_enqueue_info *,
|
||||
struct ldlm_enqueue_info *);
|
||||
|
@ -1699,6 +1699,19 @@ static inline int md_revalidate_lock(struct obd_export *exp,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static inline int md_get_fid_from_lsm(struct obd_export *exp,
|
||||
const struct lmv_stripe_md *lsm,
|
||||
const char *name, int namelen,
|
||||
struct lu_fid *fid)
|
||||
{
|
||||
int rc;
|
||||
|
||||
EXP_CHECK_MD_OP(exp, get_fid_from_lsm);
|
||||
EXP_MD_COUNTER_INCREMENT(exp, get_fid_from_lsm);
|
||||
rc = MDP(exp->exp_obd, get_fid_from_lsm)(exp, lsm, name, namelen, fid);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* OBD Metadata Support */
|
||||
|
||||
int obd_init_caches(void);
|
||||
|
@ -487,9 +487,20 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request,
|
||||
struct lookup_intent parent_it = {
|
||||
.it_op = IT_GETATTR,
|
||||
.it_lock_handle = 0 };
|
||||
struct lu_fid fid = ll_i2info(parent)->lli_fid;
|
||||
|
||||
if (md_revalidate_lock(ll_i2mdexp(parent), &parent_it,
|
||||
&ll_i2info(parent)->lli_fid, NULL)) {
|
||||
/* If it is striped directory, get the real stripe parent */
|
||||
if (unlikely(ll_i2info(parent)->lli_lsm_md)) {
|
||||
rc = md_get_fid_from_lsm(ll_i2mdexp(parent),
|
||||
ll_i2info(parent)->lli_lsm_md,
|
||||
(*de)->d_name.name,
|
||||
(*de)->d_name.len, &fid);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (md_revalidate_lock(ll_i2mdexp(parent), &parent_it, &fid,
|
||||
NULL)) {
|
||||
d_lustre_revalidate(*de);
|
||||
ll_intent_release(&parent_it);
|
||||
}
|
||||
|
@ -2991,6 +2991,22 @@ static int lmv_revalidate_lock(struct obd_export *exp, struct lookup_intent *it,
|
||||
return rc;
|
||||
}
|
||||
|
||||
int lmv_get_fid_from_lsm(struct obd_export *exp,
|
||||
const struct lmv_stripe_md *lsm,
|
||||
const char *name, int namelen, struct lu_fid *fid)
|
||||
{
|
||||
const struct lmv_oinfo *oinfo;
|
||||
|
||||
LASSERT(lsm);
|
||||
oinfo = lsm_name_to_stripe_info(lsm, name, namelen);
|
||||
if (IS_ERR(oinfo))
|
||||
return PTR_ERR(oinfo);
|
||||
|
||||
*fid = oinfo->lmo_fid;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* For lmv, only need to send request to master MDT, and the master MDT will
|
||||
* process with other slave MDTs. The only exception is Q_GETOQUOTA for which
|
||||
@ -3155,7 +3171,8 @@ static struct md_ops lmv_md_ops = {
|
||||
.set_open_replay_data = lmv_set_open_replay_data,
|
||||
.clear_open_replay_data = lmv_clear_open_replay_data,
|
||||
.intent_getattr_async = lmv_intent_getattr_async,
|
||||
.revalidate_lock = lmv_revalidate_lock
|
||||
.revalidate_lock = lmv_revalidate_lock,
|
||||
.get_fid_from_lsm = lmv_get_fid_from_lsm,
|
||||
};
|
||||
|
||||
static int __init lmv_init(void)
|
||||
|
Loading…
Reference in New Issue
Block a user