/*
* 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/
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));
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
}
/* 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);
*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));
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;
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;
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);
}
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;
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 */
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);
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;
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);
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) {
* 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);
}
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);