From 11bfa5917f1a3a8ebef6983cd92d3584e5997f99 Mon Sep 17 00:00:00 2001 From: tappro Date: Thu, 2 Nov 2006 01:13:38 +0000 Subject: [PATCH] - simplify handling of same fids issue during link. mdt_reint_link() returns error immediately, mdd_link_sanity_check() check the source is dir at first, therefore src cannot be the same as tgt. --- lustre/mdd/mdd_dir.c | 34 ++++++++++++---------------------- lustre/mdt/mdt_reint.c | 30 +++++++++++++++--------------- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index f8b34a4..8621f69 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -185,7 +185,7 @@ static int mdd_is_subdir(const struct lu_env *env, /* Check whether it may create the cobj under the pobj */ static int mdd_may_create(const struct lu_env *env, struct mdd_object *pobj, - struct mdd_object *cobj, int need_check, int lock) + struct mdd_object *cobj, int need_check) { int rc = 0; ENTRY; @@ -197,14 +197,8 @@ static int mdd_may_create(const struct lu_env *env, struct mdd_object *pobj, RETURN(-ENOENT); if (need_check) { - if (lock) { - rc = mdd_permission_internal_locked(env, pobj, - (MAY_WRITE | - MAY_EXEC)); - } else { - rc = mdd_permission_internal(env, pobj, (MAY_WRITE | - MAY_EXEC)); - } + rc = mdd_permission_internal_locked(env, pobj, + (MAY_WRITE | MAY_EXEC)); } RETURN(rc); } @@ -291,23 +285,19 @@ int mdd_link_sanity_check(const struct lu_env *env, struct mdd_object *tgt_obj, int rc = 0; ENTRY; - if (tgt_obj) { - /* - * Lock only if tgt and src not same object. This is because - * mdd_link() already locked src and we try to lock it again we - * have a problem. - */ - rc = mdd_may_create(env, tgt_obj, NULL, 1, (src_obj != tgt_obj)); - if (rc) - RETURN(rc); - } - if (mdd_is_immutable(src_obj) || mdd_is_append(src_obj)) RETURN(-EPERM); if (S_ISDIR(mdd_object_type(src_obj))) RETURN(-EPERM); + LASSERT(src_obj != tgt_obj); + if (tgt_obj) { + rc = mdd_may_create(env, tgt_obj, NULL, 1); + if (rc) + RETURN(rc); + } + RETURN(rc); } @@ -774,7 +764,7 @@ static int mdd_rt_sanity_check(const struct lu_env *env, mdd_dir_is_empty(env, tobj)) RETURN(-ENOTEMPTY); } else { - rc = mdd_may_create(env, tgt_pobj, NULL, 1, 1); + rc = mdd_may_create(env, tgt_pobj, NULL, 1); } RETURN(rc); @@ -1315,7 +1305,7 @@ static int mdd_rename_sanity_check(const struct lu_env *env, if (!tobj) { rc = mdd_may_create(env, tgt_pobj, NULL, - (src_pobj != tgt_pobj), 1); + (src_pobj != tgt_pobj)); } else { mdd_read_lock(env, tobj); rc = mdd_may_delete(env, tgt_pobj, tobj, src_is_dir, diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 56baa84..4c7799a 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -477,6 +477,11 @@ static int mdt_reint_link(struct mdt_thread_info *info, RETURN(rc); } + /* Invalid case so return error immediately instead of + * processing it */ + if (lu_fid_eq(rr->rr_fid1, rr->rr_fid2)) + RETURN(-EPERM); + /* step 1: find & lock the target parent dir */ lhp = &info->mti_lh[MDT_LH_PARENT]; mdt_lock_pdo_init(lhp, LCK_EX, rr->rr_name, @@ -489,21 +494,16 @@ static int mdt_reint_link(struct mdt_thread_info *info, /* step 2: find & lock the source */ lhs = &info->mti_lh[MDT_LH_CHILD]; mdt_lock_reg_init(lhs, LCK_EX); - - if (lu_fid_eq(rr->rr_fid1, rr->rr_fid2)) { - mdt_object_get(info->mti_env, mp); - ms = mp; - } else { - ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1); - if (IS_ERR(ms)) - GOTO(out_unlock_parent, rc = PTR_ERR(ms)); - - rc = mdt_object_lock(info, ms, lhs, MDS_INODELOCK_UPDATE, - MDT_CROSS_LOCK); - if (rc != 0) { - mdt_object_put(info->mti_env, ms); - GOTO(out_unlock_parent, rc); - } + + ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1); + if (IS_ERR(ms)) + GOTO(out_unlock_parent, rc = PTR_ERR(ms)); + + rc = mdt_object_lock(info, ms, lhs, MDS_INODELOCK_UPDATE, + MDT_CROSS_LOCK); + if (rc != 0) { + mdt_object_put(info->mti_env, ms); + GOTO(out_unlock_parent, rc); } /* step 3: link it */ -- 1.8.3.1