staging: lustre: lmv: validate lock with correct stripe FID
authorwang di <di.wang@intel.com>
Tue, 16 Aug 2016 20:19:02 +0000 (16:19 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 21 Aug 2016 13:57:37 +0000 (15:57 +0200)
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>
drivers/staging/lustre/lustre/include/obd.h
drivers/staging/lustre/lustre/include/obd_class.h
drivers/staging/lustre/lustre/llite/namei.c
drivers/staging/lustre/lustre/lmv/lmv_obd.c

index 52020a9116cc081b048652b230b948305b75e8b7..b7bdd079755196cbc3a872357d1285efe6ddb9e7 100644 (file)
@@ -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 *);
index e86961c40928cab83bacbb2aaca12ab0a90f6232..69b628b4b6b38437d27806502b0eba42f67ca588 100644 (file)
@@ -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);
index 6e11b9961aa0cbaad8d31055ecf9426226c9d9be..581b083d8ba003539f1068e20336f3b650af45a2 100644 (file)
@@ -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 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,
-                                      &ll_i2info(parent)->lli_fid, NULL)) {
+               if (md_revalidate_lock(ll_i2mdexp(parent), &parent_it, &fid,
+                                      NULL)) {
                        d_lustre_revalidate(*de);
                        ll_intent_release(&parent_it);
                }
index 03594f0db4da06032cf20b832a0087856ef5f5d3..9821f69bc03efe4b25c5e50821429119863457e2 100644 (file)
@@ -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)