struct mdt_object *root;
struct lustre_capa *capa;
- root = mdt_object_find(info->mti_env, mdt, &repbody->fid1);
+ root = mdt_object_find(info->mti_env, mdt, &repbody->fid1,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(root))
RETURN(PTR_ERR(root));
*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);
+ child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid,
+ MDT_OBJ_MUST_EXIST);
if (unlikely(IS_ERR(child)))
GOTO(out_parent, rc = PTR_ERR(child));
mdt_lock_handle_init(lhc);
mdt_lock_reg_init(lhc, LCK_PR);
- if (mdt_object_exists(child) == 0) {
- LU_OBJECT_DEBUG(D_WARNING, 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)
+ const struct lu_fid *f,
+ enum mdt_obj_exist check_exist)
{
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)))
- m = (struct mdt_object *)o;
+ RETURN((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)
+ __u64 ibits,
+ enum mdt_obj_exist check_exist)
{
struct mdt_object *o;
- o = mdt_object_find(info->mti_env, info->mti_mdt, f);
+ o = mdt_object_find(info->mti_env, info->mti_mdt, f, check_exist);
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);
+ obj = mdt_object_find(env, info->mti_mdt, &body->fid1,
+ MDT_OBJ_MAY_NOT_EXIST);
if (!IS_ERR(obj)) {
if ((flags & HABEO_CORPUS) &&
- !mdt_object_exists(obj)) {
+ mdt_object_exists(obj) == 0) {
mdt_object_put(env, obj);
/* for capability renew ENOENT will be handled in
* mdt_renew_capa */
if (!fid_is_sane(&fp->gf_fid))
RETURN(-EINVAL);
- obj = mdt_object_find(env, mdt, &fp->gf_fid);
+ obj = mdt_object_find(env, mdt, &fp->gf_fid, MDT_OBJ_MUST_EXIST);
if (obj == NULL || IS_ERR(obj)) {
- CDEBUG(D_IOCTL, "no object "DFID": %ld\n",PFID(&fp->gf_fid),
+ CDEBUG(D_IOCTL, "%s: no object "DFID": %ld\n",
+ mdt2obd_dev(mdt)->obd_name, PFID(&fp->gf_fid),
PTR_ERR(obj));
- RETURN(-EINVAL);
+ RETURN(obj == NULL ? -EINVAL : PTR_ERR(obj));
}
- rc = lu_object_exists(&obj->mot_obj.mo_lu);
- if (rc <= 0) {
- if (rc == -1)
- rc = -EREMOTE;
- else
- rc = -ENOENT;
+ if (lu_object_exists(&obj->mot_obj.mo_lu) < 0) {
+ rc = -EREMOTE;
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);
- if (IS_ERR(obj))
+ 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;
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 {
+ } else if (rc > 0) {
version = mo_version_get(mti->mti_env, mdt_object_child(obj));
*(__u64 *)data->ioc_inlbuf2 = version;
rc = 0;
}
mdt_object_unlock_put(mti, obj, lh, 1);
+
RETURN(rc);
}