/* 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;
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);
}
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);
}
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);
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,
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,
/* 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 */