Whamcloud - gitweb
LU-5106 statahead: support striped directory 83/27683/3
authorLai Siyao <lai.siyao@intel.com>
Thu, 15 Jun 2017 17:09:12 +0000 (01:09 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 19 Jul 2017 03:28:56 +0000 (03:28 +0000)
Current statahead will getattr by fid, but for striped directory,
it needs to fix its parent fid to stripe fid, which needs file
name, so pack file name in md_op_data.

Remove check for remote dir check in lmv_intent_getattr_async(),
which is not necessary, and not checking it won't cause anything
wrong, while the code is simpler.

Signed-off-by: Lai Siyao <lai.siyao@intel.com>
Change-Id: I275d866cb1ea157ef2b594ded0cc342264f0382c
Reviewed-on: https://review.whamcloud.com/27683
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: wangdi <di.wang@intel.com>
lustre/llite/statahead.c
lustre/lmv/lmv_obd.c

index c11c682..3430f81 100644 (file)
@@ -743,7 +743,8 @@ sa_prep_data(struct inode *dir, struct inode *child, struct sa_entry *entry)
        if (minfo == NULL)
                return ERR_PTR(-ENOMEM);
 
-       op_data = ll_prep_md_op_data(&minfo->mi_data, dir, child, NULL, 0, 0,
+       op_data = ll_prep_md_op_data(&minfo->mi_data, dir, child,
+                                    entry->se_qstr.name, entry->se_qstr.len, 0,
                                     LUSTRE_OPC_ANY, NULL);
        if (IS_ERR(op_data)) {
                OBD_FREE_PTR(minfo);
index 78160ad..f5ff5c7 100644 (file)
@@ -2956,35 +2956,30 @@ int lmv_clear_open_replay_data(struct obd_export *exp,
 int lmv_intent_getattr_async(struct obd_export *exp,
                             struct md_enqueue_info *minfo)
 {
-       struct md_op_data       *op_data = &minfo->mi_data;
-       struct obd_device       *obd = exp->exp_obd;
-       struct lmv_obd          *lmv = &obd->u.lmv;
-       struct lmv_tgt_desc     *ptgt = NULL;
-       struct lmv_tgt_desc     *ctgt = NULL;
-       int                      rc;
+       struct md_op_data *op_data = &minfo->mi_data;
+       struct obd_device *obd = exp->exp_obd;
+       struct lmv_obd *lmv = &obd->u.lmv;
+       struct lmv_tgt_desc *tgt = NULL;
+       int rc;
        ENTRY;
 
        if (!fid_is_sane(&op_data->op_fid2))
                RETURN(-EINVAL);
 
-       ptgt = lmv_locate_mds(lmv, op_data, &op_data->op_fid1);
-       if (IS_ERR(ptgt))
-               RETURN(PTR_ERR(ptgt));
-
-       ctgt = lmv_locate_mds(lmv, op_data, &op_data->op_fid2);
-       if (IS_ERR(ctgt))
-               RETURN(PTR_ERR(ctgt));
+       tgt = lmv_locate_mds(lmv, op_data, &op_data->op_fid1);
+       if (IS_ERR(tgt))
+               RETURN(PTR_ERR(tgt));
 
        /*
-        * if child is on remote MDT, we need 2 async RPCs to fetch both LOOKUP
-        * lock on parent, and UPDATE lock on child MDT, which makes all
-        * complicated. Considering remote dir is rare case, and not supporting
-        * it in statahead won't cause any issue, drop its support for now.
+        * no special handle for remote dir, which needs to fetch both LOOKUP
+        * lock on parent, and then UPDATE lock on child MDT, which makes all
+        * complicated because this is done async. So only LOOKUP lock is
+        * fetched for remote dir, but considering remote dir is rare case,
+        * and not supporting it in statahead won't cause any issue, just leave
+        * it as is.
         */
-       if (ptgt != ctgt)
-               RETURN(-ENOTSUPP);
 
-       rc = md_intent_getattr_async(ptgt->ltd_exp, minfo);
+       rc = md_intent_getattr_async(tgt->ltd_exp, minfo);
        RETURN(rc);
 }