X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdc%2Fmdc_locks.c;h=8ab2f4bef5bf1d3aa7e1295b315ab8edbc69b92c;hp=da91c7e566e7a93161b97870af6a59aa05c18955;hb=32becabb43b6e8f21c030c23c01c3f02e351eaea;hpb=2a3503fa30a07fcba9314e4e0b4854f370eda8e4 diff --git a/lustre/mdc/mdc_locks.c b/lustre/mdc/mdc_locks.c index da91c7e..8ab2f4b 100644 --- a/lustre/mdc/mdc_locks.c +++ b/lustre/mdc/mdc_locks.c @@ -111,11 +111,15 @@ int it_open_error(int phase, struct lookup_intent *it) EXPORT_SYMBOL(it_open_error); /* this must be called on a lockh that is known to have a referenced lock */ -int mdc_set_lock_data(struct obd_export *exp, __u64 *lockh, void *data) +int mdc_set_lock_data(struct obd_export *exp, __u64 *lockh, void *data, + __u32 *bits) { struct ldlm_lock *lock; ENTRY; + if(bits) + *bits = 0; + if (!*lockh) { EXIT; RETURN(0); @@ -138,6 +142,9 @@ int mdc_set_lock_data(struct obd_export *exp, __u64 *lockh, void *data) } #endif lock->l_ast_data = data; + if (bits) + *bits = lock->l_policy_data.l_inodebits.bits; + unlock_res_and_lock(lock); LDLM_LOCK_PUT(lock); @@ -155,7 +162,7 @@ ldlm_mode_t mdc_lock_match(struct obd_export *exp, int flags, fid_build_reg_res_name(fid, &res_id); rc = ldlm_lock_match(class_exp2obd(exp)->obd_namespace, flags, - &res_id, type, policy, mode, lockh); + &res_id, type, policy, mode, lockh, 0); RETURN(rc); } @@ -241,8 +248,8 @@ static struct ptlrpc_request *mdc_intent_open_pack(struct obd_export *exp, struct ptlrpc_request *req; struct obd_device *obddev = class_exp2obd(exp); struct ldlm_intent *lit; - int joinfile = !!((it->it_flags & O_JOIN_FILE) && - op_data->op_data); + int joinfile = !!((it->it_create_mode & M_JOIN_FILE) && + op_data->op_data); CFS_LIST_HEAD(cancels); int count = 0; int mode; @@ -310,7 +317,7 @@ static struct ptlrpc_request *mdc_intent_open_pack(struct obd_export *exp, } spin_lock(&req->rq_lock); - req->rq_replay = 1; + req->rq_replay = req->rq_import->imp_replayable; spin_unlock(&req->rq_lock); /* pack the intent */ @@ -479,6 +486,7 @@ static int mdc_finish_enqueue(struct obd_export *exp, it->d.lustre.it_disposition = (int)lockrep->lock_policy_res1; it->d.lustre.it_status = (int)lockrep->lock_policy_res2; it->d.lustre.it_lock_mode = einfo->ei_mode; + it->d.lustre.it_lock_handle = lockh->cookie; it->d.lustre.it_data = req; if (it->d.lustre.it_status < 0 && req->rq_replay) @@ -531,25 +539,6 @@ static int mdc_finish_enqueue(struct obd_export *exp, if (eadata == NULL) RETURN(-EPROTO); - if (body->valid & OBD_MD_FLMODEASIZE) { - struct obd_device *obddev = class_exp2obd(exp); - - if (obddev->u.cli.cl_max_mds_easize < - body->max_mdsize) { - obddev->u.cli.cl_max_mds_easize = - body->max_mdsize; - CDEBUG(D_INFO, "maxeasize become %d\n", - body->max_mdsize); - } - if (obddev->u.cli.cl_max_mds_cookiesize < - body->max_cookiesize) { - obddev->u.cli.cl_max_mds_cookiesize = - body->max_cookiesize; - CDEBUG(D_INFO, "cookiesize become %d\n", - body->max_cookiesize); - } - } - /* * We save the reply LOV EA in case we have to replay a * create for recovery. If we didn't allocate a large @@ -648,7 +637,7 @@ int mdc_enqueue(struct obd_export *exp, struct ldlm_enqueue_info *einfo, policy = *(ldlm_policy_data_t *)lmm; res_id.name[3] = LDLM_FLOCK; } else if (it->it_op & IT_OPEN) { - int joinfile = !!((it->it_flags & O_JOIN_FILE) && + int joinfile = !!((it->it_create_mode & M_JOIN_FILE) && op_data->op_data); req = mdc_intent_open_pack(exp, it, op_data, lmm, lmmsize, @@ -658,7 +647,7 @@ int mdc_enqueue(struct obd_export *exp, struct ldlm_enqueue_info *einfo, einfo->ei_cbdata = NULL; lmm = NULL; } else - it->it_flags &= ~O_JOIN_FILE; + it->it_create_mode &= ~M_JOIN_FILE; } else if (it->it_op & IT_UNLINK) req = mdc_intent_unlink_pack(exp, it, op_data); else if (it->it_op & (IT_GETATTR | IT_LOOKUP)) @@ -741,7 +730,7 @@ static int mdc_finish_intent_lock(struct obd_export *exp, /* If we were revalidating a fid/name pair, mark the intent in * case we fail and get called again from lookup */ if (fid_is_sane(&op_data->op_fid2) && - it->it_flags & O_CHECK_STALE && + it->it_create_mode & M_CHECK_STALE && it->it_op != IT_GETATTR) { it_set_disposition(it, DISP_ENQ_COMPLETE); @@ -812,7 +801,7 @@ static int mdc_finish_intent_lock(struct obd_export *exp, memcpy(&old_lock, lockh, sizeof(*lockh)); if (ldlm_lock_match(NULL, LDLM_FL_BLOCK_GRANTED, NULL, - LDLM_IBITS, &policy, LCK_NL, &old_lock)) { + LDLM_IBITS, &policy, LCK_NL, &old_lock, 0)) { ldlm_lock_decref_and_cancel(lockh, it->d.lustre.it_lock_mode); memcpy(lockh, &old_lock, sizeof(old_lock)); @@ -928,9 +917,8 @@ int mdc_intent_lock(struct obd_export *exp, struct md_op_data *op_data, lmm, lmmsize, NULL, extra_lock_flags); if (rc < 0) RETURN(rc); - it->d.lustre.it_lock_handle = lockh.cookie; } else if (!fid_is_sane(&op_data->op_fid2) || - !(it->it_flags & O_CHECK_STALE)) { + !(it->it_create_mode & M_CHECK_STALE)) { /* DISP_ENQ_COMPLETE set means there is extra reference on * request referenced from this intent, saved for subsequent * lookup. This path is executed when we proceed to this @@ -976,8 +964,6 @@ static int mdc_intent_getattr_async_interpret(const struct lu_env *env, if (rc) GOTO(out, rc); - it->d.lustre.it_lock_handle = lockh->cookie; - rc = mdc_finish_intent_lock(exp, req, &minfo->mi_data, it, lockh); EXIT; @@ -1024,7 +1010,7 @@ int mdc_intent_getattr_async(struct obd_export *exp, req->rq_async_args.pointer_arg[1] = minfo; req->rq_async_args.pointer_arg[2] = einfo; req->rq_interpret_reply = mdc_intent_getattr_async_interpret; - ptlrpcd_add_req(req); + ptlrpcd_add_req(req, PSCOPE_OTHER); RETURN(0); } @@ -1043,8 +1029,8 @@ int mdc_revalidate_lock(struct obd_export *exp, ENTRY; fid_build_reg_res_name(fid, &res_id); - /* As not all attributes are kept under update lock, e.g. - owner/group/acls are under lookup lock, we need both + /* As not all attributes are kept under update lock, e.g. + owner/group/acls are under lookup lock, we need both ibits for GETATTR. */ policy.l_inodebits.bits = (it->it_op == IT_GETATTR) ? MDS_INODELOCK_UPDATE | MDS_INODELOCK_LOOKUP : @@ -1052,7 +1038,7 @@ int mdc_revalidate_lock(struct obd_export *exp, mode = ldlm_lock_match(exp->exp_obd->obd_namespace, LDLM_FL_BLOCK_GRANTED, &res_id, LDLM_IBITS, - &policy, LCK_CR|LCK_CW|LCK_PR|LCK_PW, &lockh); + &policy, LCK_CR|LCK_CW|LCK_PR|LCK_PW, &lockh, 0); if (mode) { it->d.lustre.it_lock_handle = lockh.cookie; it->d.lustre.it_lock_mode = mode;