Check parent existence and type in rename and migrate to avoid
potential race.
Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: I583e2f5a6f47073601e36c06890a6b22dfc734ad
Reviewed-on: https://review.whamcloud.com/33709
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Jenkins
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Tested-by: Maloo <maloo@whamcloud.com>
-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)
{
const struct lu_fid *fid,
int idx)
{
if (rc)
GOTO(out_put, rc);
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(dir);
out_put:
mdt_object_put(info->mti_env, dir);
RETURN(-EPERM);
/* pobj is master object of parent */
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));
if (IS_ERR(pobj))
RETURN(PTR_ERR(pobj));
PFID(rr->rr_fid2), PNAME(&rr->rr_tgt_name));
/* find both parents. */
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));
if (IS_ERR(msrcdir))
RETURN(PTR_ERR(msrcdir));
mtgtdir = msrcdir;
mdt_object_get(info->mti_env, mtgtdir);
} else {
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));
}
if (IS_ERR(mtgtdir))
GOTO(out_put_srcdir, rc = PTR_ERR(mtgtdir));
}