X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Flmv%2Flmv_intent.c;h=096f83ae7de9b328d814c373d8dd4c95bcf6f272;hb=f2e4d30a95f4fdb55d18da097c24d441e564c579;hp=855a23d911782dfda00ceaf1ca6ffa29e57efdcc;hpb=a2877f1f6c0fd0ec5ece836a216f42af3ef913da;p=fs%2Flustre-release.git diff --git a/lustre/lmv/lmv_intent.c b/lustre/lmv/lmv_intent.c index 855a23d..096f83a 100644 --- a/lustre/lmv/lmv_intent.c +++ b/lustre/lmv/lmv_intent.c @@ -35,7 +35,6 @@ */ #define DEBUG_SUBSYSTEM S_LMV -#ifdef __KERNEL__ #include #include #include @@ -45,9 +44,6 @@ #include #include #include -#else -#include -#endif #include #include @@ -80,7 +76,7 @@ static int lmv_intent_remote(struct obd_export *exp, struct lookup_intent *it, if (body == NULL) RETURN(-EPROTO); - LASSERT((body->valid & OBD_MD_MDS)); + LASSERT((body->mbo_valid & OBD_MD_MDS)); /* * Unfortunately, we have to lie to MDC/MDS to retrieve @@ -99,9 +95,9 @@ static int lmv_intent_remote(struct obd_export *exp, struct lookup_intent *it, it->d.lustre.it_data = NULL; } - LASSERT(fid_is_sane(&body->fid1)); + LASSERT(fid_is_sane(&body->mbo_fid1)); - tgt = lmv_find_target(lmv, &body->fid1); + tgt = lmv_find_target(lmv, &body->mbo_fid1); if (IS_ERR(tgt)) GOTO(out, rc = PTR_ERR(tgt)); @@ -109,7 +105,7 @@ static int lmv_intent_remote(struct obd_export *exp, struct lookup_intent *it, if (op_data == NULL) GOTO(out, rc = -ENOMEM); - op_data->op_fid1 = body->fid1; + op_data->op_fid1 = body->mbo_fid1; /* Sent the parent FID to the remote MDT */ if (parent_fid != NULL) { /* The parent fid is only for remote open to @@ -117,14 +113,11 @@ static int lmv_intent_remote(struct obd_export *exp, struct lookup_intent *it, * see mdt_cross_open */ LASSERT(it->it_op & IT_OPEN); op_data->op_fid2 = *parent_fid; - /* Add object FID to op_fid3, in case it needs to check stale - * (M_CHECK_STALE), see mdc_finish_intent_lock */ - op_data->op_fid3 = body->fid1; } op_data->op_bias = MDS_CROSS_REF; CDEBUG(D_INODE, "REMOTE_INTENT with fid="DFID" -> mds #%d\n", - PFID(&body->fid1), tgt->ltd_idx); + PFID(&body->mbo_fid1), tgt->ltd_idx); rc = md_intent_lock(tgt->ltd_exp, op_data, it, &req, cb_blocking, extra_lock_flags); @@ -159,7 +152,6 @@ out: return rc; } -#ifdef __KERNEL__ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody, struct lmv_stripe_md *lsm, ldlm_blocking_callback cb_blocking, @@ -183,9 +175,6 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody, * revalidate slaves has some problems, temporarily return, * we may not need that */ - if (lsm->lsm_md_stripe_count <= 1) - RETURN(0); - OBD_ALLOC_PTR(op_data); if (op_data == NULL) RETURN(-ENOMEM); @@ -204,14 +193,6 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody, fid = lsm->lsm_md_oinfo[i].lmo_fid; inode = lsm->lsm_md_oinfo[i].lmo_root; - if (i == 0) { - if (mbody != NULL) { - body = mbody; - goto update; - } else { - goto release_lock; - } - } /* * Prepare op_data for revalidating. Note that @fid2 shluld be @@ -245,11 +226,11 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody, body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY); LASSERT(body != NULL); -update: - if (unlikely(body->nlink < 2)) { + if (unlikely(body->mbo_nlink < 2)) { CERROR("%s: nlink %d < 2 corrupt stripe %d "DFID - ":" DFID"\n", obd->obd_name, body->nlink, - i, PFID(&lsm->lsm_md_oinfo[i].lmo_fid), + ":" DFID"\n", + obd->obd_name, body->mbo_nlink, i, + PFID(&lsm->lsm_md_oinfo[i].lmo_fid), PFID(&lsm->lsm_md_oinfo[0].lmo_fid)); if (req != NULL) @@ -264,20 +245,19 @@ update: GOTO(cleanup, rc = -EIO); } - if (i != 0) - md_set_lock_data(tgt->ltd_exp, &lockh->cookie, - inode, NULL); - i_size_write(inode, body->size); - set_nlink(inode, body->nlink); - LTIME_S(inode->i_atime) = body->atime; - LTIME_S(inode->i_ctime) = body->ctime; - LTIME_S(inode->i_mtime) = body->mtime; + i_size_write(inode, body->mbo_size); + set_nlink(inode, body->mbo_nlink); + LTIME_S(inode->i_atime) = body->mbo_atime; + LTIME_S(inode->i_ctime) = body->mbo_ctime; + LTIME_S(inode->i_mtime) = body->mbo_mtime; if (req != NULL) ptlrpc_req_finished(req); } -release_lock: + + md_set_lock_data(tgt->ltd_exp, &lockh->cookie, inode, NULL); + size += i_size_read(inode); if (i != 0) @@ -312,26 +292,15 @@ release_lock: atime, ctime, mtime, PFID(&lsm->lsm_md_oinfo[0].lmo_fid)); if (mbody != NULL) { - mbody->atime = atime; - mbody->ctime = ctime; - mbody->mtime = mtime; + mbody->mbo_atime = atime; + mbody->mbo_ctime = ctime; + mbody->mbo_mtime = mtime; } cleanup: OBD_FREE_PTR(op_data); RETURN(rc); } -#else - -int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody, - struct lmv_stripe_md *lsm, - ldlm_blocking_callback cb_blocking, - int extra_lock_flags) -{ - return 0; -} - -#endif /* * IT_OPEN is intended to open (and create, possible) an object. Parent (pid) @@ -348,19 +317,14 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data, int rc; ENTRY; - /* Note: client might open with some random flags(sanity 33b), so we can - * not make sure op_fid2 is being initialized with BY_FID flag */ - if (it->it_flags & MDS_OPEN_BY_FID && fid_is_sane(&op_data->op_fid2)) { - if (op_data->op_mea1 != NULL) { - struct lmv_stripe_md *lsm = op_data->op_mea1; - const struct lmv_oinfo *oinfo; - - oinfo = lsm_name_to_stripe_info(lsm, op_data->op_name, - op_data->op_namelen); - if (IS_ERR(oinfo)) - RETURN(PTR_ERR(oinfo)); - op_data->op_fid1 = oinfo->lmo_fid; - } + if (it->it_flags & MDS_OPEN_BY_FID) { + LASSERT(fid_is_sane(&op_data->op_fid2)); + + /* for striped directory, we can't know parent stripe fid + * without name, but we can set it to child fid, and MDT + * will obtain it from linkea in open in such case. */ + if (op_data->op_mea1 != NULL) + op_data->op_fid1 = op_data->op_fid2; tgt = lmv_find_target(lmv, &op_data->op_fid2); if (IS_ERR(tgt)) @@ -368,6 +332,10 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data, op_data->op_mds = tgt->ltd_idx; } else { + LASSERT(fid_is_sane(&op_data->op_fid1)); + LASSERT(fid_is_zero(&op_data->op_fid2)); + LASSERT(op_data->op_name != NULL); + tgt = lmv_locate_mds(lmv, op_data, &op_data->op_fid1); if (IS_ERR(tgt)) RETURN(PTR_ERR(tgt)); @@ -375,14 +343,12 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data, /* If it is ready to open the file by FID, do not need * allocate FID at all, otherwise it will confuse MDT */ - if ((it->it_op & IT_CREAT) && - !(it->it_flags & MDS_OPEN_BY_FID)) { + if ((it->it_op & IT_CREAT) && !(it->it_flags & MDS_OPEN_BY_FID)) { /* - * For open with IT_CREATE and for IT_CREATE cases allocate new - * fid and setup FLD for it. + * For lookup(IT_CREATE) cases allocate new fid and setup FLD + * for it. */ - op_data->op_fid3 = op_data->op_fid2; - rc = lmv_fid_alloc(exp, &op_data->op_fid2, op_data); + rc = lmv_fid_alloc(NULL, exp, &op_data->op_fid2, op_data); if (rc != 0) RETURN(rc); } @@ -409,7 +375,7 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data, RETURN(-EPROTO); /* Not cross-ref case, just get out of here. */ - if (unlikely((body->valid & OBD_MD_MDS))) { + if (unlikely((body->mbo_valid & OBD_MD_MDS))) { rc = lmv_intent_remote(exp, it, &op_data->op_fid1, reqp, cb_blocking, extra_lock_flags); if (rc != 0) @@ -440,10 +406,26 @@ lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data, int rc = 0; ENTRY; + /* If it returns ERR_PTR(-EBADFD) then it is an unknown hash type + * it will try all stripes to locate the object */ tgt = lmv_locate_mds(lmv, op_data, &op_data->op_fid1); - if (IS_ERR(tgt)) + if (IS_ERR(tgt) && (PTR_ERR(tgt) != -EBADFD)) RETURN(PTR_ERR(tgt)); + /* Both migrating dir and unknown hash dir need to try + * all of sub-stripes */ + if (lsm != NULL && !lmv_is_known_hash_type(lsm)) { + struct lmv_oinfo *oinfo; + + oinfo = &lsm->lsm_md_oinfo[0]; + + op_data->op_fid1 = oinfo->lmo_fid; + op_data->op_mds = oinfo->lmo_mds; + tgt = lmv_get_target(lmv, oinfo->lmo_mds, NULL); + if (IS_ERR(tgt)) + RETURN(PTR_ERR(tgt)); + } + if (!fid_is_sane(&op_data->op_fid2)) fid_zero(&op_data->op_fid2); @@ -471,28 +453,39 @@ lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data, RETURN(rc); } RETURN(rc); - } else if (it_disposition(it, DISP_LOOKUP_NEG) && - lsm != NULL && lsm->lsm_md_magic == LMV_MAGIC_MIGRATE) { - /* For migrating directory, if it can not find the child in - * the source directory(master stripe), try the targeting - * directory(stripe 1) */ - tgt = lmv_find_target(lmv, &lsm->lsm_md_oinfo[1].lmo_fid); - if (IS_ERR(tgt)) - RETURN(PTR_ERR(tgt)); - - ptlrpc_req_finished(*reqp); - it->d.lustre.it_data = NULL; - *reqp = NULL; - - CDEBUG(D_INODE, "For migrating dir, try target dir "DFID"\n", - PFID(&lsm->lsm_md_oinfo[1].lmo_fid)); + } else if (it_disposition(it, DISP_LOOKUP_NEG) && lsm != NULL && + lmv_need_try_all_stripes(lsm)) { + /* For migrating and unknown hash type directory, it will + * try to target the entry on other stripes */ + int stripe_index; + + for (stripe_index = 1; + stripe_index < lsm->lsm_md_stripe_count && + it_disposition(it, DISP_LOOKUP_NEG); stripe_index++) { + struct lmv_oinfo *oinfo; + + /* release the previous request */ + ptlrpc_req_finished(*reqp); + it->d.lustre.it_data = NULL; + *reqp = NULL; + + oinfo = &lsm->lsm_md_oinfo[stripe_index]; + tgt = lmv_find_target(lmv, &oinfo->lmo_fid); + if (IS_ERR(tgt)) + RETURN(PTR_ERR(tgt)); + + CDEBUG(D_INODE, "Try other stripes " DFID"\n", + PFID(&oinfo->lmo_fid)); - op_data->op_fid1 = lsm->lsm_md_oinfo[1].lmo_fid; - it->d.lustre.it_disposition &= ~DISP_ENQ_COMPLETE; - rc = md_intent_lock(tgt->ltd_exp, op_data, it, reqp, - cb_blocking, extra_lock_flags); - RETURN(rc); + op_data->op_fid1 = oinfo->lmo_fid; + it->d.lustre.it_disposition &= ~DISP_ENQ_COMPLETE; + rc = md_intent_lock(tgt->ltd_exp, op_data, it, reqp, + cb_blocking, extra_lock_flags); + if (rc != 0) + RETURN(rc); + } } + /* * MDS has returned success. Probably name has been resolved in * remote inode. Let's check this. @@ -502,7 +495,7 @@ lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data, RETURN(-EPROTO); /* Not cross-ref case, just get out of here. */ - if (unlikely((body->valid & OBD_MD_MDS))) { + if (unlikely((body->mbo_valid & OBD_MD_MDS))) { rc = lmv_intent_remote(exp, it, NULL, reqp, cb_blocking, extra_lock_flags); if (rc != 0) @@ -520,20 +513,20 @@ int lmv_intent_lock(struct obd_export *exp, struct md_op_data *op_data, ldlm_blocking_callback cb_blocking, __u64 extra_lock_flags) { - struct obd_device *obd = exp->exp_obd; - int rc; - ENTRY; + struct obd_device *obd = exp->exp_obd; + int rc; + ENTRY; - LASSERT(it != NULL); - LASSERT(fid_is_sane(&op_data->op_fid1)); + LASSERT(it != NULL); + LASSERT(fid_is_sane(&op_data->op_fid1)); - CDEBUG(D_INODE, "INTENT LOCK '%s' for '%*s' on "DFID"\n", - LL_IT2STR(it), op_data->op_namelen, op_data->op_name, - PFID(&op_data->op_fid1)); + CDEBUG(D_INODE, "INTENT LOCK '%s' for "DFID" '%.*s' on "DFID"\n", + LL_IT2STR(it), PFID(&op_data->op_fid2), op_data->op_namelen, + op_data->op_name, PFID(&op_data->op_fid1)); - rc = lmv_check_connect(obd); - if (rc) - RETURN(rc); + rc = lmv_check_connect(obd); + if (rc) + RETURN(rc); if (it->it_op & (IT_LOOKUP | IT_GETATTR | IT_LAYOUT)) rc = lmv_intent_lookup(exp, op_data, it, reqp, cb_blocking, @@ -544,5 +537,27 @@ int lmv_intent_lock(struct obd_export *exp, struct md_op_data *op_data, else LBUG(); + if (rc < 0) { + struct lustre_handle lock_handle; + + if (it->d.lustre.it_lock_mode != 0) { + lock_handle.cookie = it->d.lustre.it_lock_handle; + ldlm_lock_decref(&lock_handle, + it->d.lustre.it_lock_mode); + } + + it->d.lustre.it_lock_handle = 0; + it->d.lustre.it_lock_mode = 0; + + if (it->d.lustre.it_remote_lock_mode != 0) { + lock_handle.cookie = it->d.lustre.it_remote_lock_handle; + ldlm_lock_decref(&lock_handle, + it->d.lustre.it_remote_lock_mode); + } + + it->d.lustre.it_remote_lock_handle = 0; + it->d.lustre.it_remote_lock_mode = 0; + } + RETURN(rc); }