X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_reint.c;h=1545724ca20dcad7f55e70e789dfa033c0cec292;hp=17935a9ab4ab4705041d33b23615ab382e0f4445;hb=a35113b690e39dcd39e126efc9085b3bc160b4ff;hpb=64af83190180a8f3e90aea270e2baaecb1ecdb93 diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 17935a9..1545724 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2012, Intel Corporation. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -318,8 +318,7 @@ static int mdt_md_create(struct mdt_thread_info *info) " permitted for administrator or" " set mdt_enable_remote_dir_gid:" " rc = %d\n", - mdt2obd_dev(mdt)->obd_name, - -EPERM); + mdt_obd_name(mdt), -EPERM); GOTO(out_put_child, rc = -EPERM); } } @@ -330,7 +329,7 @@ static int mdt_md_create(struct mdt_thread_info *info) CERROR("%s: remote dir is only permitted on" " MDT0 or set_param" " mdt.*.enable_remote_dir=1\n", - mdt2obd_dev(mdt)->obd_name); + mdt_obd_name(mdt)); GOTO(out_put_child, rc = -EPERM); } if (!mdt_is_dne_client(mdt_info_req(info)->rq_export)) { @@ -502,10 +501,6 @@ static int mdt_reint_setattr(struct mdt_thread_info *info, if (info->mti_dlm_req) ldlm_request_cancel(req, info->mti_dlm_req, 0); - if ((fid_is_obf(rr->rr_fid1) || fid_is_dot_lustre(rr->rr_fid1)) && - !OBD_FAIL_CHECK(OBD_FAIL_OSD_FID_MAPPING)) - RETURN(-EPERM); - repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); mo = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1); if (IS_ERR(mo)) @@ -658,7 +653,7 @@ static int mdt_reint_create(struct mdt_thread_info *info, break; default: CERROR("%s: Unsupported mode %o\n", - mdt2obd_dev(info->mti_mdt)->obd_name, + mdt_obd_name(info->mti_mdt), info->mti_attr.ma_attr.la_mode); RETURN(err_serious(-EOPNOTSUPP)); } @@ -776,12 +771,12 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, if (!fid_is_zero(rr->rr_fid2)) { CDEBUG(D_INFO, "%s: name %s can not find "DFID"\n", - mdt2obd_dev(info->mti_mdt)->obd_name, + mdt_obd_name(info->mti_mdt), (char *)rr->rr_name, PFID(mdt_object_fid(mc))); GOTO(put_child, rc = -ENOENT); } CDEBUG(D_INFO, "%s: name %s: "DFID" is another MDT\n", - mdt2obd_dev(info->mti_mdt)->obd_name, + mdt_obd_name(info->mti_mdt), (char *)rr->rr_name, PFID(mdt_object_fid(mc))); if (!mdt_is_dne_client(req->rq_export)) @@ -794,7 +789,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, if (!md_capable(uc, CFS_CAP_SYS_ADMIN)) { CERROR("%s: unlink remote entry is only " "permitted for administrator: rc = %d\n", - mdt2obd_dev(info->mti_mdt)->obd_name, + mdt_obd_name(info->mti_mdt), -EPERM); GOTO(put_child, rc = -EPERM); } @@ -819,10 +814,10 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, repbody->valid |= (OBD_MD_FLID | OBD_MD_MDS); GOTO(unlock_child, rc = -EREMOTE); } else if (info->mti_spec.sp_rm_entry) { - CERROR("%s: lfs rmdir should not be used on local dir %s\n", - mdt2obd_dev(info->mti_mdt)->obd_name, - (char *)rr->rr_name); - GOTO(put_child, rc = -EPERM); + rc = -EPERM; + CDEBUG(D_INFO, "%s: no rm_entry on local dir '%s': rc = %d\n", + mdt_obd_name(info->mti_mdt), (char *)rr->rr_name, rc); + GOTO(put_child, rc); } rc = mdt_object_lock(info, mc, child_lh, MDS_INODELOCK_FULL, @@ -941,8 +936,9 @@ static int mdt_reint_link(struct mdt_thread_info *info, if (mdt_object_remote(ms)) { mdt_object_put(info->mti_env, ms); - CERROR("Target directory "DFID" is on another MDT\n", - PFID(rr->rr_fid1)); + CERROR("%s: source inode "DFID" on remote MDT from "DFID"\n", + mdt_obd_name(info->mti_mdt), PFID(rr->rr_fid1), + PFID(rr->rr_fid2)); GOTO(out_unlock_parent, rc = -EXDEV); } @@ -969,6 +965,11 @@ static int mdt_reint_link(struct mdt_thread_info *info, GOTO(out_unlock_child, rc); /* save version of file name for replay, it must be ENOENT here */ if (!req_is_replay(mdt_info_req(info))) { + if (rc != -ENOENT) { + CDEBUG(D_INFO, "link target %.*s existed!\n", + rr->rr_namelen, (char *)rr->rr_name); + GOTO(out_unlock_child, rc = -EEXIST); + } info->mti_ver[2] = ENOENT_VERSION; mdt_version_save(mdt_info_req(info), info->mti_ver[2], 2); } @@ -991,31 +992,31 @@ out_unlock_parent: * (lh->mlh_pdo_hash) in parallel directory lock. */ static int mdt_pdir_hash_lock(struct mdt_thread_info *info, - struct mdt_lock_handle *lh, - struct mdt_object *obj, __u64 ibits) + struct mdt_lock_handle *lh, + struct mdt_object *obj, __u64 ibits) { - struct ldlm_res_id *res_id = &info->mti_res_id; - struct ldlm_namespace *ns = info->mti_mdt->mdt_namespace; - ldlm_policy_data_t *policy = &info->mti_policy; - int rc; + struct ldlm_res_id *res = &info->mti_res_id; + struct ldlm_namespace *ns = info->mti_mdt->mdt_namespace; + ldlm_policy_data_t *policy = &info->mti_policy; + int rc; - /* - * Finish res_id initializing by name hash marking part of - * directory which is taking modification. - */ - LASSERT(lh->mlh_pdo_hash != 0); - fid_build_pdo_res_name(mdt_object_fid(obj), lh->mlh_pdo_hash, res_id); - memset(policy, 0, sizeof(*policy)); - policy->l_inodebits.bits = ibits; - /* - * Use LDLM_FL_LOCAL_ONLY for this lock. We do not know yet if it is - * going to be sent to client. If it is - mdt_intent_policy() path will - * fix it up and turn FL_LOCAL flag off. - */ - rc = mdt_fid_lock(ns, &lh->mlh_reg_lh, lh->mlh_reg_mode, policy, - res_id, LDLM_FL_LOCAL_ONLY | LDLM_FL_ATOMIC_CB, - &info->mti_exp->exp_handle.h_cookie); - return rc; + /* + * Finish res_id initializing by name hash marking part of + * directory which is taking modification. + */ + LASSERT(lh->mlh_pdo_hash != 0); + fid_build_pdo_res_name(mdt_object_fid(obj), lh->mlh_pdo_hash, res); + memset(policy, 0, sizeof(*policy)); + policy->l_inodebits.bits = ibits; + /* + * Use LDLM_FL_LOCAL_ONLY for this lock. We do not know yet if it is + * going to be sent to client. If it is - mdt_intent_policy() path will + * fix it up and turn FL_LOCAL flag off. + */ + rc = mdt_fid_lock(ns, &lh->mlh_reg_lh, lh->mlh_reg_mode, policy, + res, LDLM_FL_LOCAL_ONLY | LDLM_FL_ATOMIC_CB, + &info->mti_exp->exp_handle.h_cookie); + return rc; } static int mdt_rename_lock(struct mdt_thread_info *info, @@ -1102,6 +1103,17 @@ static int mdt_rename_sanity(struct mdt_thread_info *info, struct lu_fid *fid) * 2 - src child; 3 - tgt child. * Update on disk version of src child. */ +/** + * For DNE phase I, only these renames are allowed + * mv src_p/src_c tgt_p/tgt_c + * 1. src_p/src_c/tgt_p/tgt_c are in the same MDT. + * 2. src_p and tgt_p are same directory, and tgt_c does not + * exists. In this case, all of modification will happen + * in the MDT where ithesource parent is, only one remote + * update is needed, i.e. set c_time/m_time on the child. + * And tgt_c will be still in the same MDT as the original + * src_c. + */ static int mdt_reint_rename(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) { @@ -1219,12 +1231,6 @@ static int mdt_reint_rename(struct mdt_thread_info *info, mold = mdt_object_find(info->mti_env, info->mti_mdt, old_fid); if (IS_ERR(mold)) GOTO(out_unlock_target, rc = PTR_ERR(mold)); - if (mdt_object_remote(mold)) { - mdt_object_put(info->mti_env, mold); - CDEBUG(D_INFO, "Source child "DFID" is on another MDT\n", - PFID(old_fid)); - GOTO(out_unlock_target, rc = -EXDEV); - } lh_oldp = &info->mti_lh[MDT_LH_OLD]; mdt_lock_reg_init(lh_oldp, LCK_EX); @@ -1258,6 +1264,12 @@ static int mdt_reint_rename(struct mdt_thread_info *info, if (fid_is_obf(new_fid) || fid_is_dot_lustre(new_fid)) GOTO(out_unlock_old, rc = -EPERM); + if (mdt_object_remote(mold)) { + CDEBUG(D_INFO, "Src child "DFID" is on another MDT\n", + PFID(old_fid)); + GOTO(out_unlock_old, rc = -EXDEV); + } + mdt_lock_reg_init(lh_newp, LCK_EX); mnew = mdt_object_find(info->mti_env, info->mti_mdt, new_fid); if (IS_ERR(mnew))