EXIT;
}
-static struct mdt_object *mdt_object_find_check(struct mdt_thread_info *info,
+static struct mdt_object *mdt_parent_find_check(struct mdt_thread_info *info,
const struct lu_fid *fid,
int idx)
{
if (rc)
GOTO(out_put, rc);
+ if (!mdt_object_exists(dir))
+ GOTO(out_put, rc = -ENOENT);
+
+ if (!S_ISDIR(lu_object_attr(&dir->mot_obj)))
+ GOTO(out_put, rc = -ENOTDIR);
+
RETURN(dir);
out_put:
mdt_object_put(info->mti_env, dir);
RETURN(-EPERM);
/* pobj is master object of parent */
- pobj = mdt_object_find_check(info, rr->rr_fid1, 0);
+ pobj = mdt_parent_find_check(info, rr->rr_fid1, 0);
if (IS_ERR(pobj))
RETURN(PTR_ERR(pobj));
PFID(rr->rr_fid2), PNAME(&rr->rr_tgt_name));
/* find both parents. */
- msrcdir = mdt_object_find_check(info, rr->rr_fid1, 0);
+ msrcdir = mdt_parent_find_check(info, rr->rr_fid1, 0);
if (IS_ERR(msrcdir))
RETURN(PTR_ERR(msrcdir));
mtgtdir = msrcdir;
mdt_object_get(info->mti_env, mtgtdir);
} else {
- mtgtdir = mdt_object_find_check(info, rr->rr_fid2, 1);
+ mtgtdir = mdt_parent_find_check(info, rr->rr_fid2, 1);
if (IS_ERR(mtgtdir))
GOTO(out_put_srcdir, rc = PTR_ERR(mtgtdir));
}