X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_handler.c;h=55ab803e1328323e8a1c6a60c5c7350bc376f6bc;hb=c65b502fe9feda61c7ad7137f5022c654c6ba501;hp=6e4705e8a88d61f0b6874538ab43b66073cf6589;hpb=34cf5628b02ba7f68ce539bcaa7f8bba46fe047c;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 6e4705e..55ab803 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -28,9 +28,8 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. - */ -/* - * Copyright (c) 2011 Whamcloud, Inc. + * + * Copyright (c) 2011, 2012, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -325,8 +324,7 @@ static int mdt_getstatus(struct mdt_thread_info *info) struct mdt_object *root; struct lustre_capa *capa; - root = mdt_object_find(info->mti_env, mdt, &repbody->fid1, - MDT_OBJ_MUST_EXIST); + root = mdt_object_find(info->mti_env, mdt, &repbody->fid1); if (IS_ERR(root)) RETURN(PTR_ERR(root)); @@ -817,6 +815,7 @@ static int mdt_raw_lookup(struct mdt_thread_info *info, LASSERT(!info->mti_cross_ref); /* Only got the fid of this obj by name */ + fid_zero(child_fid); rc = mdo_lookup(info->mti_env, next, lname, child_fid, &info->mti_spec); #if 0 @@ -981,6 +980,7 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, } /* step 2: lookup child's fid by name */ + fid_zero(child_fid); rc = mdo_lookup(info->mti_env, next, lname, child_fid, &info->mti_spec); @@ -1000,8 +1000,7 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, *step 3: find the child object by fid & lock it. * regardless if it is local or remote. */ - child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid, - MDT_OBJ_MUST_EXIST); + child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid); if (unlikely(IS_ERR(child))) GOTO(out_parent, rc = PTR_ERR(child)); @@ -1040,6 +1039,13 @@ relock: else mdt_lock_reg_init(lhc, LCK_PR); + if (mdt_object_exists(child) == 0) { + LU_OBJECT_DEBUG(D_INODE, info->mti_env, + &child->mot_obj.mo_lu, + "Object doesn't exist!\n"); + GOTO(out_child, rc = -ENOENT); + } + if (!(child_bits & MDS_INODELOCK_UPDATE)) { struct md_attr *ma = &info->mti_attr; @@ -2074,8 +2080,7 @@ static struct mdt_object *mdt_obj(struct lu_object *o) struct mdt_object *mdt_object_find(const struct lu_env *env, struct mdt_device *d, - const struct lu_fid *f, - enum mdt_obj_exist check_exist) + const struct lu_fid *f) { struct lu_object *o; struct mdt_object *m; @@ -2084,16 +2089,9 @@ struct mdt_object *mdt_object_find(const struct lu_env *env, CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f)); o = lu_object_find(env, &d->mdt_md_dev.md_lu_dev, f, NULL); if (unlikely(IS_ERR(o))) - RETURN((struct mdt_object *)o); + m = (struct mdt_object *)o; else m = mdt_obj(o); - - if (check_exist == MDT_OBJ_MUST_EXIST && mdt_object_exists(m) == 0) { - mdt_object_put(env, m); - CERROR("%s: object "DFID" not found: rc = -2\n", - mdt_obj_dev_name(m), PFID(f)); - RETURN(ERR_PTR(-ENOENT)); - } RETURN(m); } @@ -2370,12 +2368,11 @@ void mdt_object_unlock(struct mdt_thread_info *info, struct mdt_object *o, struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *info, const struct lu_fid *f, struct mdt_lock_handle *lh, - __u64 ibits, - enum mdt_obj_exist check_exist) + __u64 ibits) { struct mdt_object *o; - o = mdt_object_find(info->mti_env, info->mti_mdt, f, check_exist); + o = mdt_object_find(info->mti_env, info->mti_mdt, f); if (!IS_ERR(o)) { int rc; @@ -2479,11 +2476,10 @@ static int mdt_body_unpack(struct mdt_thread_info *info, __u32 flags) mdt_set_capainfo(info, 0, &body->fid1, req_capsule_client_get(pill, &RMF_CAPA1)); - obj = mdt_object_find(env, info->mti_mdt, &body->fid1, - MDT_OBJ_MAY_NOT_EXIST); + obj = mdt_object_find(env, info->mti_mdt, &body->fid1); if (!IS_ERR(obj)) { if ((flags & HABEO_CORPUS) && - mdt_object_exists(obj) == 0) { + !mdt_object_exists(obj)) { mdt_object_put(env, obj); /* for capability renew ENOENT will be handled in * mdt_renew_capa */ @@ -4827,8 +4823,8 @@ static struct lu_object *mdt_object_alloc(const struct lu_env *env, lu_object_init(o, h, d); lu_object_add_top(h, o); o->lo_ops = &mdt_obj_ops; - cfs_sema_init(&mo->mot_ioepoch_sem, 1); - cfs_sema_init(&mo->mot_lov_sem, 1); + cfs_mutex_init(&mo->mot_ioepoch_mutex); + cfs_mutex_init(&mo->mot_lov_mutex); RETURN(o); } else RETURN(NULL); @@ -5233,7 +5229,7 @@ static int mdt_init_export(struct obd_export *exp) CFS_INIT_LIST_HEAD(&med->med_open_head); cfs_spin_lock_init(&med->med_open_lock); - cfs_sema_init(&med->med_idmap_sem, 1); + cfs_mutex_init(&med->med_idmap_mutex); med->med_idmap = NULL; cfs_spin_lock(&exp->exp_lock); exp->exp_connecting = 1; @@ -5403,16 +5399,19 @@ static int mdt_fid2path(const struct lu_env *env, struct mdt_device *mdt, if (!fid_is_sane(&fp->gf_fid)) RETURN(-EINVAL); - obj = mdt_object_find(env, mdt, &fp->gf_fid, MDT_OBJ_MUST_EXIST); + obj = mdt_object_find(env, mdt, &fp->gf_fid); if (obj == NULL || IS_ERR(obj)) { - CDEBUG(D_IOCTL, "%s: no object "DFID": %ld\n", - mdt2obd_dev(mdt)->obd_name, PFID(&fp->gf_fid), + CDEBUG(D_IOCTL, "no object "DFID": %ld\n", PFID(&fp->gf_fid), PTR_ERR(obj)); - RETURN(obj == NULL ? -EINVAL : PTR_ERR(obj)); + RETURN(-EINVAL); } - if (lu_object_exists(&obj->mot_obj.mo_lu) < 0) { - rc = -EREMOTE; + rc = lu_object_exists(&obj->mot_obj.mo_lu); + if (rc <= 0) { + if (rc == -1) + rc = -EREMOTE; + else + rc = -ENOENT; mdt_object_put(env, obj); CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n", PFID(&fp->gf_fid), rc); @@ -5510,13 +5509,9 @@ static int mdt_ioc_version_get(struct mdt_thread_info *mti, void *karg) lh = &mti->mti_lh[MDT_LH_PARENT]; mdt_lock_reg_init(lh, LCK_CR); - obj = mdt_object_find_lock(mti, fid, lh, MDS_INODELOCK_UPDATE, - MDT_OBJ_MUST_EXIST); - if (IS_ERR(obj)) { - if (PTR_ERR(obj) == -ENOENT) - *(__u64 *)data->ioc_inlbuf2 = ENOENT_VERSION; + obj = mdt_object_find_lock(mti, fid, lh, MDS_INODELOCK_UPDATE); + if (IS_ERR(obj)) RETURN(PTR_ERR(obj)); - } rc = mdt_object_exists(obj); if (rc < 0) { @@ -5526,13 +5521,15 @@ static int mdt_ioc_version_get(struct mdt_thread_info *mti, void *karg) * fid, this is error to find remote object here */ CERROR("nonlocal object "DFID"\n", PFID(fid)); - } else if (rc > 0) { + } else if (rc == 0) { + *(__u64 *)data->ioc_inlbuf2 = ENOENT_VERSION; + rc = -ENOENT; + } else { version = dt_version_get(mti->mti_env, mdt_obj2dt(obj)); *(__u64 *)data->ioc_inlbuf2 = version; rc = 0; } mdt_object_unlock_put(mti, obj, lh, 1); - RETURN(rc); } @@ -5557,7 +5554,7 @@ static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len, rc = mdt_device_sync(&env, mdt); break; case OBD_IOC_SET_READONLY: - dt->dd_ops->dt_ro(&env, dt); + rc = dt->dd_ops->dt_ro(&env, dt); break; case OBD_IOC_ABORT_RECOVERY: CERROR("Aborting recovery for device %s\n", obd->obd_name);