RETURN(err_serious(-EFAULT));
CDEBUG(D_INODE, "getattr with lock for "DFID"/%s, ldlm_rep = %p\n",
- PFID(mdt_object_fid(parent)), name, ldlm_rep);
+ PFID(mdt_object_fid(parent)), name, ldlm_rep);
mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_EXECD);
/* Only getattr on the child. Parent is on another node. */
mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS);
child = parent;
- CDEBUG(D_INODE, "partial getattr_name child_fid = "DFID
- ", ldlm_rep=%p\n", PFID(mdt_object_fid(child)), ldlm_rep);
+ CDEBUG(D_INODE, "partial getattr_name child_fid = "DFID", "
+ "ldlm_rep=%p\n", PFID(mdt_object_fid(child)), ldlm_rep);
if (is_resent) {
/* Do not take lock for resent case. */
int rc;
ENTRY;
+ DEBUG_REQ(D_INODE, mdt_info_req(info), "create (%s->"DFID") in "DFID,
+ rr->rr_name, PFID(rr->rr_fid2), PFID(rr->rr_fid1));
+
repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
lh = &info->mti_lh[MDT_LH_PARENT];
int rc;
ENTRY;
+ DEBUG_REQ(D_INODE, mdt_info_req(info), "partial create "DFID"\n",
+ PFID(info->mti_rr.rr_fid2));
+
repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
o = mdt_object_find(info->mti_env, mdt, info->mti_rr.rr_fid2);
int rc;
ENTRY;
- DEBUG_REQ(D_INODE, req, "link original "DFID" to "DFID" %s",
+ DEBUG_REQ(D_INODE, req, "link "DFID" to "DFID"/%s",
PFID(rr->rr_fid1), PFID(rr->rr_fid2), rr->rr_name);
if (MDT_FAIL_CHECK(OBD_FAIL_MDS_REINT_LINK))
/* MDT holding name ask us to add ref. */
lhs = &info->mti_lh[MDT_LH_CHILD];
lhs->mlh_reg_mode = LCK_EX;
- ms = mdt_object_find_lock(info, rr->rr_fid2, lhs,
+ ms = mdt_object_find_lock(info, rr->rr_fid1, lhs,
MDS_INODELOCK_UPDATE);
if (IS_ERR(ms))
RETURN(PTR_ERR(ms));
struct mdt_lock_handle *lh_tgt;
struct lu_fid *tgt_fid = &info->mti_tmp_fid1;
int rc;
-
ENTRY;
- DEBUG_REQ(D_INODE, req, "rename_tgt "DFID" to "DFID" %s",
- PFID(rr->rr_fid2),
- PFID(rr->rr_fid1), rr->rr_tgt);
+ DEBUG_REQ(D_INODE, req, "rename_tgt: insert (%s->"DFID") in "DFID,
+ rr->rr_tgt, PFID(rr->rr_fid2), PFID(rr->rr_fid1));
/* step 1: lookup & lock the tgt dir */
- lh_tgt = &info->mti_lh[MDT_LH_CHILD];
lh_tgtdir = &info->mti_lh[MDT_LH_PARENT];
lh_tgtdir->mlh_reg_mode = LCK_EX;
mtgtdir = mdt_object_find_lock(info, rr->rr_fid1, lh_tgtdir,
if (lu_fid_eq(tgt_fid, rr->rr_fid2))
GOTO(out_unlock_tgtdir, rc);
+ lh_tgt = &info->mti_lh[MDT_LH_CHILD];
lh_tgt->mlh_reg_mode = LCK_EX;
mtgt = mdt_object_find_lock(info, tgt_fid, lh_tgt,
struct mdt_reint_record *rr = &info->mti_rr;
struct req_capsule *pill = &info->mti_pill;
struct md_attr *ma = &info->mti_attr;
+ struct ptlrpc_request *req = mdt_info_req(info);
struct mdt_object *msrcdir;
struct mdt_object *mtgtdir;
struct mdt_object *mold;
struct lu_fid *new_fid = &info->mti_tmp_fid2;
struct lustre_handle rename_lh = { 0 };
int rc;
-
ENTRY;
rc = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT);
RETURN(rc);
}
+ DEBUG_REQ(D_INODE, req, "rename "DFID"/%s to "DFID"/%s",
+ PFID(rr->rr_fid1), rr->rr_name,
+ PFID(rr->rr_fid2), rr->rr_tgt);
+
rc = mdt_rename_lock(info, &rename_lh);
if (rc) {
CERROR("can't lock FS for rename, rc %d\n", rc);
if (IS_ERR(mtgtdir))
GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir));
- rc = mdt_object_cr_lock(info, mtgtdir, lh_tgtdirp,
- MDS_INODELOCK_UPDATE);
- if (rc != 0) {
- mdt_object_put(info->mti_env, mtgtdir);
- GOTO(out_unlock_source, rc);
+ rc = mdt_object_exists(mtgtdir);
+ if (rc == 0)
+ GOTO(out_unlock_target, rc = -ESTALE);
+ else if (rc > 0) {
+ /* we lock the target dir iff it is local */
+ rc = mdt_object_lock(info, mtgtdir, lh_tgtdirp,
+ MDS_INODELOCK_UPDATE);
+ if (rc != 0)
+ GOTO(out_unlock_target, rc);
}
-
}
/*step 3: find & lock the old object*/
} else if (rc != -EREMOTE && rc != -ENOENT)
GOTO(out_unlock_old, rc);
- /* step 5: dome some checking ...*/
- /* step 6: rename it */
+ /* step 5: rename it */
ma->ma_lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill,
&RMF_MDT_MD, RCL_SERVER);
}
run_test 31f "remove of open directory with open-unlink file ==="
+test_31g() {
+ echo "-- cross directory link --"
+ mkdir $DIR/d31g{a,b}
+ touch $DIR/d31ga/f
+ ln $DIR/d31ga/f $DIR/d31gb/g
+ $CHECKSTAT -t file $DIR/d31ga/f || error "source"
+ $CHECKSTAT -t file $DIR/d31gb/g || error "target"
+}
+run_test 31g "cross directory link==============="
+
+test_31h() {
+ echo "-- cross directory link --"
+ mkdir $DIR/d31h
+ mkdir $DIR/d31h/dir
+ touch $DIR/d31h/f
+ ln $DIR/d31h/f $DIR/d31h/dir/g
+ $CHECKSTAT -t file $DIR/d31h/f || error "source"
+ $CHECKSTAT -t file $DIR/d31h/dir/g || error "target"
+}
+run_test 31h "cross directory link under child==============="
+
+test_31i() {
+ echo "-- cross directory link --"
+ mkdir $DIR/d31i
+ mkdir $DIR/d31i/dir
+ touch $DIR/d31i/dir/f
+ ln $DIR/d31i/dir/f $DIR/d31i/g
+ $CHECKSTAT -t file $DIR/d31i/dir/f || error "source"
+ $CHECKSTAT -t file $DIR/d31i/g || error "target"
+}
+run_test 31i "cross directory link under parent==============="
+
test_32a() {
echo "== more mountpoints and symlinks ================="
[ -e $DIR/d32a ] && rm -fr $DIR/d32a