Details
-
Bug
-
Resolution: Fixed
-
Blocker
-
Lustre 2.6.0
-
3
-
14371
Description
In mdt_open_by_fid_lock() parent may be leaked if the second call to mdt_object_find() fails.
int mdt_open_by_fid_lock(struct mdt_thread_info *info, struct ldlm_reply *rep,
struct mdt_lock_handle *lhc)
{
const struct lu_env *env = info->mti_env;
struct mdt_device *mdt = info->mti_mdt;
__u64 flags = info->mti_spec.sp_cr_flags;
struct mdt_reint_record *rr = &info->mti_rr;
struct md_attr *ma = &info->mti_attr;
struct mdt_object *parent= NULL;
struct mdt_object *o;
int rc;
__u64 ibits = 0;
ENTRY;
if (md_should_create(flags) && !(flags & MDS_OPEN_HAS_EA)) {
if (!lu_fid_eq(rr->rr_fid1, rr->rr_fid2)) {
parent = mdt_object_find(env, mdt, rr->rr_fid1);
if (IS_ERR(parent)) {
CDEBUG(D_INODE, "Fail to find parent "DFID
" for anonymous created %ld, try to"
" use server-side parent.\n",
PFID(rr->rr_fid1), PTR_ERR(parent));
parent = NULL;
}
}
if (parent == NULL)
ma->ma_need |= MA_PFID;
}
o = mdt_object_find(env, mdt, rr->rr_fid2);
if (IS_ERR(o))
RETURN(rc = PTR_ERR(o));