X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flmv%2Flmv_obd.c;h=0b914d792bf16e3beda47f22cb2a0288d4096293;hb=8f27184b14a192848429e52ac234805c324e1f7a;hp=29550e6dded8ee97621153228b00f28bce283421;hpb=1738e70fe6aaf1e07b78a6b89eb11ea115135e69;p=fs%2Flustre-release.git diff --git a/lustre/lmv/lmv_obd.c b/lustre/lmv/lmv_obd.c index 29550e6..0b914d7 100644 --- a/lustre/lmv/lmv_obd.c +++ b/lustre/lmv/lmv_obd.c @@ -265,9 +265,8 @@ static int lmv_connect(const struct lu_env *env, RETURN(rc); } -static int lmv_init_ea_size(struct obd_export *exp, - __u32 easize, __u32 def_easize, - __u32 cookiesize, __u32 def_cookiesize) +static int lmv_init_ea_size(struct obd_export *exp, __u32 easize, + __u32 def_easize) { struct obd_device *obd = exp->exp_obd; struct lmv_obd *lmv = &obd->u.lmv; @@ -284,14 +283,7 @@ static int lmv_init_ea_size(struct obd_export *exp, lmv->max_def_easize = def_easize; change = 1; } - if (lmv->max_cookiesize < cookiesize) { - lmv->max_cookiesize = cookiesize; - change = 1; - } - if (lmv->max_def_cookiesize < def_cookiesize) { - lmv->max_def_cookiesize = def_cookiesize; - change = 1; - } + if (change == 0) RETURN(0); @@ -306,8 +298,7 @@ static int lmv_init_ea_size(struct obd_export *exp, continue; } - rc = md_init_ea_size(tgt->ltd_exp, easize, def_easize, - cookiesize, def_cookiesize); + rc = md_init_ea_size(tgt->ltd_exp, easize, def_easize); if (rc) { CERROR("%s: obd_init_ea_size() failed on MDT target %d:" " rc = %d\n", obd->obd_name, i, rc); @@ -392,8 +383,7 @@ int lmv_connect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt) tgt->ltd_exp = mdc_exp; lmv->desc.ld_active_tgt_count++; - md_init_ea_size(tgt->ltd_exp, lmv->max_easize, lmv->max_def_easize, - lmv->max_cookiesize, lmv->max_def_cookiesize); + md_init_ea_size(tgt->ltd_exp, lmv->max_easize, lmv->max_def_easize); CDEBUG(D_CONFIG, "Connected to %s(%s) successfully (%d)\n", mdc_obd->obd_name, mdc_obd->obd_uuid.uuid, @@ -522,7 +512,7 @@ static int lmv_add_target(struct obd_device *obd, struct obd_uuid *uuidp, } else { int easize = sizeof(struct lmv_stripe_md) + lmv->desc.ld_tgt_count * sizeof(struct lu_fid); - lmv_init_ea_size(obd->obd_self_export, easize, 0, 0, 0); + lmv_init_ea_size(obd->obd_self_export, easize, 0); } } @@ -578,7 +568,7 @@ int lmv_check_connect(struct obd_device *obd) class_export_put(lmv->exp); lmv->connected = 1; easize = lmv_mds_md_size(lmv->desc.ld_tgt_count, LMV_MAGIC); - lmv_init_ea_size(obd->obd_self_export, easize, 0, 0, 0); + lmv_init_ea_size(obd->obd_self_export, easize, 0); mutex_unlock(&lmv->lmv_init_mutex); RETURN(0); @@ -620,11 +610,11 @@ static int lmv_disconnect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt) mdc_obd->obd_force = obd->obd_force; mdc_obd->obd_fail = obd->obd_fail; mdc_obd->obd_no_recov = obd->obd_no_recov; - } - if (lmv->targets_proc_entry != NULL) - lprocfs_remove_proc_entry(mdc_obd->obd_name, - lmv->targets_proc_entry); + if (lmv->targets_proc_entry != NULL) + lprocfs_remove_proc_entry(mdc_obd->obd_name, + lmv->targets_proc_entry); + } rc = obd_fid_fini(tgt->ltd_exp->exp_obd); if (rc) @@ -1373,7 +1363,6 @@ static int lmv_setup(struct obd_device *obd, struct lustre_cfg *lcfg) obd_str2uuid(&lmv->desc.ld_uuid, desc->ld_uuid.uuid); lmv->desc.ld_tgt_count = 0; lmv->desc.ld_active_tgt_count = 0; - lmv->max_cookiesize = 0; lmv->max_def_easize = 0; lmv->max_easize = 0; lmv->lmv_placement = PLACEMENT_CHAR_POLICY; @@ -1510,9 +1499,7 @@ out_free_temp: return rc; } -static int lmv_getstatus(struct obd_export *exp, - struct lu_fid *fid, - struct obd_capa **pc) +static int lmv_getstatus(struct obd_export *exp, struct lu_fid *fid) { struct obd_device *obd = exp->exp_obd; struct lmv_obd *lmv = &obd->u.lmv; @@ -1523,12 +1510,12 @@ static int lmv_getstatus(struct obd_export *exp, if (rc) RETURN(rc); - rc = md_getstatus(lmv->tgts[0]->ltd_exp, fid, pc); + rc = md_getstatus(lmv->tgts[0]->ltd_exp, fid); RETURN(rc); } static int lmv_getxattr(struct obd_export *exp, const struct lu_fid *fid, - struct obd_capa *oc, u64 valid, const char *name, + u64 valid, const char *name, const char *input, int input_size, int output_size, int flags, struct ptlrpc_request **request) { @@ -1546,14 +1533,14 @@ static int lmv_getxattr(struct obd_export *exp, const struct lu_fid *fid, if (IS_ERR(tgt)) RETURN(PTR_ERR(tgt)); - rc = md_getxattr(tgt->ltd_exp, fid, oc, valid, name, input, - input_size, output_size, flags, request); + rc = md_getxattr(tgt->ltd_exp, fid, valid, name, input, + input_size, output_size, flags, request); - RETURN(rc); + RETURN(rc); } static int lmv_setxattr(struct obd_export *exp, const struct lu_fid *fid, - struct obd_capa *oc, u64 valid, const char *name, + u64 valid, const char *name, const char *input, int input_size, int output_size, int flags, __u32 suppgid, struct ptlrpc_request **request) @@ -1572,11 +1559,11 @@ static int lmv_setxattr(struct obd_export *exp, const struct lu_fid *fid, if (IS_ERR(tgt)) RETURN(PTR_ERR(tgt)); - rc = md_setxattr(tgt->ltd_exp, fid, oc, valid, name, input, - input_size, output_size, flags, suppgid, - request); + rc = md_setxattr(tgt->ltd_exp, fid, valid, name, input, + input_size, output_size, flags, suppgid, + request); - RETURN(rc); + RETURN(rc); } static int lmv_getattr(struct obd_export *exp, struct md_op_data *op_data, @@ -2051,6 +2038,9 @@ static int lmv_rename(struct obd_export *exp, struct md_op_data *op_data, struct obd_device *obd = exp->exp_obd; struct lmv_obd *lmv = &obd->u.lmv; struct lmv_tgt_desc *src_tgt; + struct lmv_tgt_desc *tgt_tgt; + struct obd_export *target_exp; + struct mdt_body *body; int rc; ENTRY; @@ -2091,6 +2081,10 @@ static int lmv_rename(struct obd_export *exp, struct md_op_data *op_data, RETURN(rc); src_tgt = lmv_find_target(lmv, &op_data->op_fid3); + if (IS_ERR(src_tgt)) + RETURN(PTR_ERR(src_tgt)); + + target_exp = src_tgt->ltd_exp; } else { if (op_data->op_mea1 != NULL) { struct lmv_stripe_md *lsm = op_data->op_mea1; @@ -2099,29 +2093,29 @@ static int lmv_rename(struct obd_export *exp, struct md_op_data *op_data, oldlen, &op_data->op_fid1, &op_data->op_mds); - if (IS_ERR(src_tgt)) - RETURN(PTR_ERR(src_tgt)); } else { src_tgt = lmv_find_target(lmv, &op_data->op_fid1); - if (IS_ERR(src_tgt)) - RETURN(PTR_ERR(src_tgt)); - - op_data->op_mds = src_tgt->ltd_idx; } + if (IS_ERR(src_tgt)) + RETURN(PTR_ERR(src_tgt)); - if (op_data->op_mea2) { + + if (op_data->op_mea2 != NULL) { struct lmv_stripe_md *lsm = op_data->op_mea2; - const struct lmv_oinfo *oinfo; - oinfo = lsm_name_to_stripe_info(lsm, new, newlen); - if (IS_ERR(oinfo)) - RETURN(PTR_ERR(oinfo)); + tgt_tgt = lmv_locate_target_for_name(lmv, lsm, new, + newlen, + &op_data->op_fid2, + &op_data->op_mds); + } else { + tgt_tgt = lmv_find_target(lmv, &op_data->op_fid2); - op_data->op_fid2 = oinfo->lmo_fid; } + if (IS_ERR(tgt_tgt)) + RETURN(PTR_ERR(tgt_tgt)); + + target_exp = tgt_tgt->ltd_exp; } - if (IS_ERR(src_tgt)) - RETURN(PTR_ERR(src_tgt)); /* * LOOKUP lock on src child (fid3) should also be cancelled for @@ -2163,21 +2157,52 @@ static int lmv_rename(struct obd_export *exp, struct md_op_data *op_data, RETURN(rc); } +retry_rename: /* * Cancel all the locks on tgt child (fid4). */ - if (fid_is_sane(&op_data->op_fid4)) + if (fid_is_sane(&op_data->op_fid4)) { + struct lmv_tgt_desc *tgt; + rc = lmv_early_cancel(exp, NULL, op_data, src_tgt->ltd_idx, LCK_EX, MDS_INODELOCK_FULL, MF_MDC_CANCEL_FID4); + if (rc != 0) + RETURN(rc); - CDEBUG(D_INODE, DFID":m%d to "DFID"\n", PFID(&op_data->op_fid1), - op_data->op_mds, PFID(&op_data->op_fid2)); + tgt = lmv_find_target(lmv, &op_data->op_fid4); + if (IS_ERR(tgt)) + RETURN(PTR_ERR(tgt)); - rc = md_rename(src_tgt->ltd_exp, op_data, old, oldlen, new, newlen, + /* Since the target child might be destroyed, and it might + * become orphan, and we can only check orphan on the local + * MDT right now, so we send rename request to the MDT where + * target child is located. If target child does not exist, + * then it will send the request to the target parent */ + target_exp = tgt->ltd_exp; + } + + rc = md_rename(target_exp, op_data, old, oldlen, new, newlen, request); - RETURN(rc); + if (rc != 0 && rc != -EREMOTE) + RETURN(rc); + + body = req_capsule_server_get(&(*request)->rq_pill, &RMF_MDT_BODY); + if (body == NULL) + RETURN(-EPROTO); + + /* Not cross-ref case, just get out of here. */ + if (likely(!(body->mbo_valid & OBD_MD_MDS))) + RETURN(rc); + + CDEBUG(D_INODE, "%s: try rename to another MDT for "DFID"\n", + exp->exp_obd->obd_name, PFID(&body->mbo_fid1)); + + op_data->op_fid4 = body->mbo_fid1; + ptlrpc_req_finished(*request); + *request = NULL; + goto retry_rename; } static int lmv_setattr(struct obd_export *exp, struct md_op_data *op_data, @@ -2207,7 +2232,7 @@ static int lmv_setattr(struct obd_export *exp, struct md_op_data *op_data, } static int lmv_fsync(struct obd_export *exp, const struct lu_fid *fid, - struct obd_capa *oc, struct ptlrpc_request **request) + struct ptlrpc_request **request) { struct obd_device *obd = exp->exp_obd; struct lmv_obd *lmv = &obd->u.lmv; @@ -2223,7 +2248,7 @@ static int lmv_fsync(struct obd_export *exp, const struct lu_fid *fid, if (IS_ERR(tgt)) RETURN(PTR_ERR(tgt)); - rc = md_fsync(tgt->ltd_exp, fid, oc, request); + rc = md_fsync(tgt->ltd_exp, fid, request); RETURN(rc); } @@ -2799,8 +2824,6 @@ static int lmv_get_info(const struct lu_env *env, struct obd_export *exp, RETURN(-EINVAL); } else if (KEY_IS(KEY_MAX_EASIZE) || KEY_IS(KEY_DEFAULT_EASIZE) || - KEY_IS(KEY_MAX_COOKIESIZE) || - KEY_IS(KEY_DEFAULT_COOKIESIZE) || KEY_IS(KEY_CONN_DATA)) { rc = lmv_check_connect(obd); if (rc) @@ -2880,89 +2903,6 @@ int lmv_set_info_async(const struct lu_env *env, struct obd_export *exp, RETURN(-EINVAL); } -static int lmv_pack_md_v1(const struct lmv_stripe_md *lsm, - struct lmv_mds_md_v1 *lmm1) -{ - int cplen; - int i; - - lmm1->lmv_magic = cpu_to_le32(lsm->lsm_md_magic); - lmm1->lmv_stripe_count = cpu_to_le32(lsm->lsm_md_stripe_count); - lmm1->lmv_master_mdt_index = cpu_to_le32(lsm->lsm_md_master_mdt_index); - lmm1->lmv_hash_type = cpu_to_le32(lsm->lsm_md_hash_type); - cplen = strlcpy(lmm1->lmv_pool_name, lsm->lsm_md_pool_name, - sizeof(lmm1->lmv_pool_name)); - if (cplen >= sizeof(lmm1->lmv_pool_name)) - return -E2BIG; - - for (i = 0; i < lsm->lsm_md_stripe_count; i++) - fid_cpu_to_le(&lmm1->lmv_stripe_fids[i], - &lsm->lsm_md_oinfo[i].lmo_fid); - return 0; -} - -int lmv_pack_md(union lmv_mds_md **lmmp, const struct lmv_stripe_md *lsm, - int stripe_count) -{ - int lmm_size = 0; - bool allocated = false; - int rc = 0; - ENTRY; - - LASSERT(lmmp != NULL); - /* Free lmm */ - if (*lmmp != NULL && lsm == NULL) { - int stripe_count; - - stripe_count = lmv_mds_md_stripe_count_get(*lmmp); - lmm_size = lmv_mds_md_size(stripe_count, - le32_to_cpu((*lmmp)->lmv_magic)); - if (lmm_size == 0) - RETURN(-EINVAL); - OBD_FREE(*lmmp, lmm_size); - *lmmp = NULL; - RETURN(0); - } - - /* Alloc lmm */ - if (*lmmp == NULL && lsm == NULL) { - lmm_size = lmv_mds_md_size(stripe_count, LMV_MAGIC); - LASSERT(lmm_size > 0); - OBD_ALLOC(*lmmp, lmm_size); - if (*lmmp == NULL) - RETURN(-ENOMEM); - lmv_mds_md_stripe_count_set(*lmmp, stripe_count); - (*lmmp)->lmv_magic = cpu_to_le32(LMV_MAGIC); - RETURN(lmm_size); - } - - /* pack lmm */ - LASSERT(lsm != NULL); - lmm_size = lmv_mds_md_size(lsm->lsm_md_stripe_count, lsm->lsm_md_magic); - if (*lmmp == NULL) { - OBD_ALLOC(*lmmp, lmm_size); - if (*lmmp == NULL) - RETURN(-ENOMEM); - allocated = true; - } - - switch (lsm->lsm_md_magic) { - case LMV_MAGIC_V1: - rc = lmv_pack_md_v1(lsm, &(*lmmp)->lmv_md_v1); - break; - default: - rc = -EINVAL; - break; - } - - if (rc != 0 && allocated) { - OBD_FREE(*lmmp, lmm_size); - *lmmp = NULL; - } - - RETURN(lmm_size); -} - static int lmv_unpack_md_v1(struct obd_export *exp, struct lmv_stripe_md *lsm, const struct lmv_mds_md_v1 *lmm1) { @@ -3007,8 +2947,8 @@ static int lmv_unpack_md_v1(struct obd_export *exp, struct lmv_stripe_md *lsm, RETURN(rc); } -int lmv_unpack_md(struct obd_export *exp, struct lmv_stripe_md **lsmp, - const union lmv_mds_md *lmm, int stripe_count) +static int lmv_unpackmd(struct obd_export *exp, struct lmv_stripe_md **lsmp, + const union lmv_mds_md *lmm, size_t lmm_size) { struct lmv_stripe_md *lsm; int lsm_size; @@ -3036,17 +2976,6 @@ int lmv_unpack_md(struct obd_export *exp, struct lmv_stripe_md **lsmp, RETURN(0); } - /* Alloc memmd */ - if (lsm == NULL && lmm == NULL) { - lsm_size = lmv_stripe_md_size(stripe_count); - OBD_ALLOC(lsm, lsm_size); - if (lsm == NULL) - RETURN(-ENOMEM); - lsm->lsm_md_stripe_count = stripe_count; - *lsmp = lsm; - RETURN(0); - } - if (le32_to_cpu(lmm->lmv_magic) == LMV_MAGIC_STRIPE) RETURN(-EPERM); @@ -3096,44 +3025,12 @@ int lmv_unpack_md(struct obd_export *exp, struct lmv_stripe_md **lsmp, RETURN(lsm_size); } -int lmv_alloc_memmd(struct lmv_stripe_md **lsmp, int stripes) -{ - return lmv_unpack_md(NULL, lsmp, NULL, stripes); -} - void lmv_free_memmd(struct lmv_stripe_md *lsm) { - lmv_unpack_md(NULL, &lsm, NULL, 0); + lmv_unpackmd(NULL, &lsm, NULL, 0); } EXPORT_SYMBOL(lmv_free_memmd); -int lmv_unpackmd(struct obd_export *exp, struct lov_stripe_md **lsmp, - struct lov_mds_md *lmm, int disk_len) -{ - return lmv_unpack_md(exp, (struct lmv_stripe_md **)lsmp, - (union lmv_mds_md *)lmm, disk_len); -} - -int lmv_packmd(struct obd_export *exp, struct lov_mds_md **lmmp, - struct lov_stripe_md *lsm) -{ - struct obd_device *obd = exp->exp_obd; - struct lmv_obd *lmv_obd = &obd->u.lmv; - const struct lmv_stripe_md *lmv = (struct lmv_stripe_md *)lsm; - int stripe_count; - - if (lmmp == NULL) { - if (lsm != NULL) - stripe_count = lmv->lsm_md_stripe_count; - else - stripe_count = lmv_obd->desc.ld_tgt_count; - - return lmv_mds_md_size(stripe_count, LMV_MAGIC_V1); - } - - return lmv_pack_md((union lmv_mds_md **)lmmp, lmv, 0); -} - static int lmv_cancel_unused(struct obd_export *exp, const struct lu_fid *fid, ldlm_policy_data_t *policy, ldlm_mode_t mode, ldlm_cancel_flags_t flags, void *opaque) @@ -3278,10 +3175,8 @@ int lmv_clear_open_replay_data(struct obd_export *exp, RETURN(md_clear_open_replay_data(tgt->ltd_exp, och)); } -static int lmv_get_remote_perm(struct obd_export *exp, - const struct lu_fid *fid, - struct obd_capa *oc, __u32 suppgid, - struct ptlrpc_request **request) +static int lmv_get_remote_perm(struct obd_export *exp, const struct lu_fid *fid, + u32 suppgid, struct ptlrpc_request **request) { struct obd_device *obd = exp->exp_obd; struct lmv_obd *lmv = &obd->u.lmv; @@ -3297,40 +3192,8 @@ static int lmv_get_remote_perm(struct obd_export *exp, if (IS_ERR(tgt)) RETURN(PTR_ERR(tgt)); - rc = md_get_remote_perm(tgt->ltd_exp, fid, oc, suppgid, request); - RETURN(rc); -} - -static int lmv_renew_capa(struct obd_export *exp, struct obd_capa *oc, - renew_capa_cb_t cb) -{ - struct obd_device *obd = exp->exp_obd; - struct lmv_obd *lmv = &obd->u.lmv; - struct lmv_tgt_desc *tgt; - int rc; - ENTRY; - - rc = lmv_check_connect(obd); - if (rc) - RETURN(rc); - - tgt = lmv_find_target(lmv, &oc->c_capa.lc_fid); - if (IS_ERR(tgt)) - RETURN(PTR_ERR(tgt)); - - rc = md_renew_capa(tgt->ltd_exp, oc, cb); - RETURN(rc); -} - -int lmv_unpack_capa(struct obd_export *exp, struct ptlrpc_request *req, - const struct req_msg_field *field, struct obd_capa **oc) -{ - struct lmv_obd *lmv = &exp->exp_obd->u.lmv; - struct lmv_tgt_desc *tgt = lmv->tgts[0]; - - if (tgt == NULL || tgt->ltd_exp == NULL) - RETURN(-EINVAL); - return md_unpack_capa(tgt->ltd_exp, req, field, oc); + rc = md_get_remote_perm(tgt->ltd_exp, fid, suppgid, request); + RETURN(rc); } int lmv_intent_getattr_async(struct obd_export *exp, @@ -3500,8 +3363,6 @@ struct obd_ops lmv_obd_ops = { .o_statfs = lmv_statfs, .o_get_info = lmv_get_info, .o_set_info_async = lmv_set_info_async, - .o_packmd = lmv_packmd, - .o_unpackmd = lmv_unpackmd, .o_notify = lmv_notify, .o_get_uuid = lmv_get_uuid, .o_iocontrol = lmv_iocontrol, @@ -3535,12 +3396,11 @@ struct md_ops lmv_md_ops = { .m_merge_attr = lmv_merge_attr, .m_set_open_replay_data = lmv_set_open_replay_data, .m_clear_open_replay_data = lmv_clear_open_replay_data, - .m_renew_capa = lmv_renew_capa, - .m_unpack_capa = lmv_unpack_capa, .m_get_remote_perm = lmv_get_remote_perm, .m_intent_getattr_async = lmv_intent_getattr_async, .m_revalidate_lock = lmv_revalidate_lock, .m_get_fid_from_lsm = lmv_get_fid_from_lsm, + .m_unpackmd = lmv_unpackmd, }; int __init lmv_init(void)