Commit a609c393 authored by wang di's avatar wang di Committed by Greg Kroah-Hartman

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: default avatarwang di <di.wang@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-4925
Reviewed-on: http://review.whamcloud.com/10026Reviewed-by: default avatarJohn L. Hammond <john.hammond@intel.com>
Reviewed-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Reviewed-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarJames Simmons <jsimmons@infradead.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ef21b1fb
...@@ -1103,6 +1103,11 @@ struct md_ops { ...@@ -1103,6 +1103,11 @@ struct md_ops {
ldlm_policy_data_t *, enum ldlm_mode, ldlm_policy_data_t *, enum ldlm_mode,
enum ldlm_cancel_flags flags, void *opaque); 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 *, int (*intent_getattr_async)(struct obd_export *,
struct md_enqueue_info *, struct md_enqueue_info *,
struct ldlm_enqueue_info *); struct ldlm_enqueue_info *);
......
...@@ -1699,6 +1699,19 @@ static inline int md_revalidate_lock(struct obd_export *exp, ...@@ -1699,6 +1699,19 @@ static inline int md_revalidate_lock(struct obd_export *exp,
return rc; 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 */ /* OBD Metadata Support */
int obd_init_caches(void); int obd_init_caches(void);
......
...@@ -487,9 +487,20 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request, ...@@ -487,9 +487,20 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request,
struct lookup_intent parent_it = { struct lookup_intent parent_it = {
.it_op = IT_GETATTR, .it_op = IT_GETATTR,
.it_lock_handle = 0 }; .it_lock_handle = 0 };
struct lu_fid fid = ll_i2info(parent)->lli_fid;
/* 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, if (md_revalidate_lock(ll_i2mdexp(parent), &parent_it, &fid,
&ll_i2info(parent)->lli_fid, NULL)) { NULL)) {
d_lustre_revalidate(*de); d_lustre_revalidate(*de);
ll_intent_release(&parent_it); ll_intent_release(&parent_it);
} }
......
...@@ -2991,6 +2991,22 @@ static int lmv_revalidate_lock(struct obd_export *exp, struct lookup_intent *it, ...@@ -2991,6 +2991,22 @@ static int lmv_revalidate_lock(struct obd_export *exp, struct lookup_intent *it,
return rc; 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 * 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 * process with other slave MDTs. The only exception is Q_GETOQUOTA for which
...@@ -3155,7 +3171,8 @@ static struct md_ops lmv_md_ops = { ...@@ -3155,7 +3171,8 @@ static struct md_ops lmv_md_ops = {
.set_open_replay_data = lmv_set_open_replay_data, .set_open_replay_data = lmv_set_open_replay_data,
.clear_open_replay_data = lmv_clear_open_replay_data, .clear_open_replay_data = lmv_clear_open_replay_data,
.intent_getattr_async = lmv_intent_getattr_async, .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) static int __init lmv_init(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment