From: Lai Siyao Date: Thu, 15 Jun 2017 17:09:12 +0000 (+0800) Subject: LU-5106 statahead: support striped directory X-Git-Tag: 2.10.51~98 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=9e7952c045a3ce2041a2fa325cc4a147be6549bb LU-5106 statahead: support striped directory 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 Change-Id: I275d866cb1ea157ef2b594ded0cc342264f0382c Reviewed-on: https://review.whamcloud.com/27683 Tested-by: Jenkins Reviewed-by: Andreas Dilger Reviewed-by: Fan Yong Tested-by: Maloo Reviewed-by: wangdi --- diff --git a/lustre/llite/statahead.c b/lustre/llite/statahead.c index c11c682..3430f81 100644 --- a/lustre/llite/statahead.c +++ b/lustre/llite/statahead.c @@ -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); diff --git a/lustre/lmv/lmv_obd.c b/lustre/lmv/lmv_obd.c index 78160ad..f5ff5c7 100644 --- a/lustre/lmv/lmv_obd.c +++ b/lustre/lmv/lmv_obd.c @@ -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); }