X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Flmv%2Flmv_intent.c;h=fa0f194b4df9a6ec129f558a40cc20b519dc378f;hp=09ee3b2d58a1dffe92922163206ecd29b7562654;hb=cb85c0364fd8323f4bb03c481660805da66aaf85;hpb=001b8dbfacb747f1649a2eb047a5f118ce32fdc7 diff --git a/lustre/lmv/lmv_intent.c b/lustre/lmv/lmv_intent.c index 09ee3b2..fa0f194 100644 --- a/lustre/lmv/lmv_intent.c +++ b/lustre/lmv/lmv_intent.c @@ -59,9 +59,8 @@ #include #include "lmv_internal.h" -static int lmv_intent_remote(struct obd_export *exp, void *lmm, - int lmmsize, struct lookup_intent *it, - const struct lu_fid *parent_fid, int flags, +static int lmv_intent_remote(struct obd_export *exp, struct lookup_intent *it, + const struct lu_fid *parent_fid, struct ptlrpc_request **reqp, ldlm_blocking_callback cb_blocking, __u64 extra_lock_flags) @@ -81,7 +80,7 @@ static int lmv_intent_remote(struct obd_export *exp, void *lmm, 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 @@ -100,9 +99,9 @@ static int lmv_intent_remote(struct obd_export *exp, void *lmm, 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)); @@ -110,7 +109,7 @@ static int lmv_intent_remote(struct obd_export *exp, void *lmm, 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 @@ -118,17 +117,14 @@ static int lmv_intent_remote(struct obd_export *exp, void *lmm, * 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, lmm, lmmsize, it, - flags, &req, cb_blocking, extra_lock_flags); + rc = md_intent_lock(tgt->ltd_exp, op_data, it, &req, cb_blocking, + extra_lock_flags); if (rc) GOTO(out_free_op_data, rc); @@ -184,9 +180,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); @@ -205,14 +198,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 @@ -230,8 +215,8 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody, CDEBUG(D_INODE, "Revalidate slave "DFID" -> mds #%d\n", PFID(&fid), tgt->ltd_idx); - rc = md_intent_lock(tgt->ltd_exp, op_data, NULL, 0, &it, 0, - &req, cb_blocking, extra_lock_flags); + rc = md_intent_lock(tgt->ltd_exp, op_data, &it, &req, + cb_blocking, extra_lock_flags); if (rc < 0) GOTO(cleanup, rc); @@ -246,11 +231,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) @@ -265,20 +250,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) @@ -313,9 +297,9 @@ 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); @@ -339,10 +323,8 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody, * may be split dir. */ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data, - void *lmm, int lmmsize, struct lookup_intent *it, - int flags, struct ptlrpc_request **reqp, - ldlm_blocking_callback cb_blocking, - __u64 extra_lock_flags) + struct lookup_intent *it, struct ptlrpc_request **reqp, + ldlm_blocking_callback cb_blocking, __u64 extra_lock_flags) { struct obd_device *obd = exp->exp_obd; struct lmv_obd *lmv = &obd->u.lmv; @@ -351,19 +333,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)) @@ -371,6 +348,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)); @@ -378,14 +359,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); } @@ -394,8 +373,8 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data, " name='%s' -> mds #%d\n", PFID(&op_data->op_fid1), PFID(&op_data->op_fid2), op_data->op_name, tgt->ltd_idx); - rc = md_intent_lock(tgt->ltd_exp, op_data, lmm, lmmsize, it, flags, - reqp, cb_blocking, extra_lock_flags); + rc = md_intent_lock(tgt->ltd_exp, op_data, it, reqp, cb_blocking, + extra_lock_flags); if (rc != 0) RETURN(rc); /* @@ -412,10 +391,9 @@ 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))) { - rc = lmv_intent_remote(exp, lmm, lmmsize, it, &op_data->op_fid1, - flags, reqp, cb_blocking, - extra_lock_flags); + 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) RETURN(rc); @@ -430,11 +408,11 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data, /* * Handler for: getattr, lookup and revalidate cases. */ -int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data, - void *lmm, int lmmsize, struct lookup_intent *it, - int flags, struct ptlrpc_request **reqp, - ldlm_blocking_callback cb_blocking, - __u64 extra_lock_flags) +static int +lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data, + struct lookup_intent *it, struct ptlrpc_request **reqp, + ldlm_blocking_callback cb_blocking, + __u64 extra_lock_flags) { struct obd_device *obd = exp->exp_obd; struct lmv_obd *lmv = &obd->u.lmv; @@ -459,8 +437,8 @@ int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data, op_data->op_bias &= ~MDS_CROSS_REF; - rc = md_intent_lock(tgt->ltd_exp, op_data, lmm, lmmsize, it, - flags, reqp, cb_blocking, extra_lock_flags); + rc = md_intent_lock(tgt->ltd_exp, op_data, it, reqp, cb_blocking, + extra_lock_flags); if (rc < 0) RETURN(rc); @@ -475,8 +453,8 @@ int 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) { + } else if (it_disposition(it, DISP_LOOKUP_NEG) && lsm != NULL && + lsm->lsm_md_hash_type & LMV_HASH_FLAG_MIGRATION) { /* For migrating directory, if it can not find the child in * the source directory(master stripe), try the targeting * directory(stripe 1) */ @@ -493,8 +471,8 @@ int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data, 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, lmm, lmmsize, it, - flags, reqp, cb_blocking, extra_lock_flags); + rc = md_intent_lock(tgt->ltd_exp, op_data, it, reqp, + cb_blocking, extra_lock_flags); } /* * MDS has returned success. Probably name has been resolved in @@ -505,9 +483,9 @@ int 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))) { - rc = lmv_intent_remote(exp, lmm, lmmsize, it, NULL, flags, - reqp, cb_blocking, extra_lock_flags); + if (unlikely((body->mbo_valid & OBD_MD_MDS))) { + rc = lmv_intent_remote(exp, it, NULL, reqp, cb_blocking, + extra_lock_flags); if (rc != 0) RETURN(rc); body = req_capsule_server_get(&(*reqp)->rq_pill, &RMF_MDT_BODY); @@ -519,35 +497,33 @@ int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data, } int lmv_intent_lock(struct obd_export *exp, struct md_op_data *op_data, - void *lmm, int lmmsize, struct lookup_intent *it, - int flags, struct ptlrpc_request **reqp, - ldlm_blocking_callback cb_blocking, + struct lookup_intent *it, struct ptlrpc_request **reqp, + 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); - - if (it->it_op & (IT_LOOKUP | IT_GETATTR | IT_LAYOUT)) - rc = lmv_intent_lookup(exp, op_data, lmm, lmmsize, it, - flags, reqp, cb_blocking, - extra_lock_flags); - else if (it->it_op & IT_OPEN) - rc = lmv_intent_open(exp, op_data, lmm, lmmsize, it, - flags, reqp, cb_blocking, - extra_lock_flags); - else - LBUG(); - 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, + extra_lock_flags); + else if (it->it_op & IT_OPEN) + rc = lmv_intent_open(exp, op_data, it, reqp, cb_blocking, + extra_lock_flags); + else + LBUG(); + + RETURN(rc); }