X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=inline;f=lustre%2Fmdt%2Fmdt_lvb.c;h=31c2438186c33ed79edb9789445a99e950559612;hb=refs%2Fchanges%2F16%2F28016%2F19;hp=40a525e4371dae293e1bf88921f1a3d8953a93c5;hpb=5517eab06eb99e4ecb66be251a10e70c37547610;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_lvb.c b/lustre/mdt/mdt_lvb.c index 40a525e4..31c2438 100644 --- a/lustre/mdt/mdt_lvb.c +++ b/lustre/mdt/mdt_lvb.c @@ -21,7 +21,7 @@ * GPL HEADER END */ /* - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2015, Intel Corporation. * Use is subject to license terms. * * lustre/mdt/mdt_lvb.c @@ -51,6 +51,7 @@ static int mdt_lvbo_init(struct ldlm_resource *res) } static int mdt_lvbo_update(struct ldlm_resource *res, + struct ldlm_lock *lock, struct ptlrpc_request *req, int increase_only) { @@ -114,8 +115,8 @@ static int mdt_lvbo_fill(struct ldlm_lock *lock, void *lvb, int lvblen) RETURN(rc); } - if (lock->l_resource->lr_type != LDLM_IBITS || - !(lock->l_policy_data.l_inodebits.bits & MDS_INODELOCK_LAYOUT)) + /* Only fill layout if layout lock is granted */ + if (!ldlm_has_layout(lock) || lock->l_granted_mode != lock->l_req_mode) RETURN(0); /* layout lock will be granted to client, fill in lvb with layout */ @@ -123,10 +124,15 @@ static int mdt_lvbo_fill(struct ldlm_lock *lock, void *lvb, int lvblen) /* XXX create an env to talk to mdt stack. We should get this env from * ptlrpc_thread->t_env. */ rc = lu_env_init(&env, LCT_MD_THREAD); - LASSERT(rc == 0); + /* Likely ENOMEM */ + if (rc) + RETURN(rc); info = lu_context_key_get(&env.le_ctx, &mdt_thread_key); - LASSERT(info != NULL); + /* Likely ENOMEM */ + if (info == NULL) + GOTO(out, rc = -ENOMEM); + memset(info, 0, sizeof *info); info->mti_env = &env; info->mti_exp = lock->l_export; @@ -134,13 +140,13 @@ static int mdt_lvbo_fill(struct ldlm_lock *lock, void *lvb, int lvblen) /* XXX get fid by resource id. why don't include fid in ldlm_resource */ fid = &info->mti_tmp_fid2; - fid_build_from_res_name(fid, &lock->l_resource->lr_name); + fid_extract_from_res_name(fid, &lock->l_resource->lr_name); obj = mdt_object_find(&env, info->mti_mdt, fid); if (IS_ERR(obj)) GOTO(out, rc = PTR_ERR(obj)); - if (mdt_object_exists(obj) <= 0) + if (!mdt_object_exists(obj) || mdt_object_remote(obj)) GOTO(out, rc = -ENOENT); child = mdt_object_child(obj); @@ -155,7 +161,7 @@ static int mdt_lvbo_fill(struct ldlm_lock *lock, void *lvb, int lvblen) if (lvblen < rc) { CERROR("%s: expected %d actual %d.\n", - info->mti_exp->exp_obd->obd_name, rc, lvblen); + mdt_obd_name(mdt), rc, lvblen); GOTO(out, rc = -ERANGE); } @@ -192,9 +198,9 @@ static int mdt_lvbo_free(struct ldlm_resource *res) } struct ldlm_valblock_ops mdt_lvbo = { - lvbo_init: mdt_lvbo_init, - lvbo_update: mdt_lvbo_update, - lvbo_size: mdt_lvbo_size, - lvbo_fill: mdt_lvbo_fill, - lvbo_free: mdt_lvbo_free + .lvbo_init = mdt_lvbo_init, + .lvbo_update = mdt_lvbo_update, + .lvbo_size = mdt_lvbo_size, + .lvbo_fill = mdt_lvbo_fill, + .lvbo_free = mdt_lvbo_free };