X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Flmv%2Flmv_obd.c;h=8afd6d77ac5f605d50b20f8deaddd679d4fcb156;hp=29550e6dded8ee97621153228b00f28bce283421;hb=bdd1272607a95482d6b5261de7fe8bec1d57e2a8;hpb=1738e70fe6aaf1e07b78a6b89eb11ea115135e69 diff --git a/lustre/lmv/lmv_obd.c b/lustre/lmv/lmv_obd.c index 29550e6..8afd6d7 100644 --- a/lustre/lmv/lmv_obd.c +++ b/lustre/lmv/lmv_obd.c @@ -27,7 +27,7 @@ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2014, Intel Corporation. + * Copyright (c) 2011, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -71,6 +71,8 @@ static void lmv_activate_target(struct lmv_obd *lmv, tgt->ltd_active = activate; lmv->desc.ld_active_tgt_count += (activate ? 1 : -1); + + tgt->ltd_exp->exp_obd->obd_inactive = !activate; } /** @@ -265,9 +267,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 +285,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 +300,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 +385,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, @@ -432,6 +424,7 @@ static void lmv_del_target(struct lmv_obd *lmv, int index) static int lmv_add_target(struct obd_device *obd, struct obd_uuid *uuidp, __u32 index, int gen) { + struct obd_device *mdc_obd; struct lmv_obd *lmv = &obd->u.lmv; struct lmv_tgt_desc *tgt; int orig_tgt_count = 0; @@ -439,22 +432,15 @@ static int lmv_add_target(struct obd_device *obd, struct obd_uuid *uuidp, ENTRY; CDEBUG(D_CONFIG, "Target uuid: %s. index %d\n", uuidp->uuid, index); - - mutex_lock(&lmv->lmv_init_mutex); - - if (lmv->desc.ld_tgt_count == 0) { - struct obd_device *mdc_obd; - - mdc_obd = class_find_client_obd(uuidp, LUSTRE_MDC_NAME, - &obd->obd_uuid); - if (!mdc_obd) { - mutex_unlock(&lmv->lmv_init_mutex); - CERROR("%s: Target %s not attached: rc = %d\n", - obd->obd_name, uuidp->uuid, -EINVAL); - RETURN(-EINVAL); - } + mdc_obd = class_find_client_obd(uuidp, LUSTRE_MDC_NAME, + &obd->obd_uuid); + if (!mdc_obd) { + CERROR("%s: Target %s not attached: rc = %d\n", + obd->obd_name, uuidp->uuid, -EINVAL); + RETURN(-EINVAL); } + mutex_lock(&lmv->lmv_init_mutex); if ((index < lmv->tgts_size) && (lmv->tgts[index] != NULL)) { tgt = lmv->tgts[index]; CERROR("%s: UUID %s already assigned at LOV target index %d:" @@ -511,22 +497,27 @@ static int lmv_add_target(struct obd_device *obd, struct obd_uuid *uuidp, lmv->desc.ld_tgt_count = index + 1; } - if (lmv->connected) { - rc = lmv_connect_mdc(obd, tgt); - if (rc != 0) { - spin_lock(&lmv->lmv_lock); - if (lmv->desc.ld_tgt_count == index + 1) - lmv->desc.ld_tgt_count = orig_tgt_count; - memset(tgt, 0, sizeof(*tgt)); - spin_unlock(&lmv->lmv_lock); - } 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); - } + if (lmv->connected == 0) { + /* lmv_check_connect() will connect this target. */ + mutex_unlock(&lmv->lmv_init_mutex); + RETURN(0); } + /* Otherwise let's connect it ourselves */ mutex_unlock(&lmv->lmv_init_mutex); + rc = lmv_connect_mdc(obd, tgt); + if (rc != 0) { + spin_lock(&lmv->lmv_lock); + if (lmv->desc.ld_tgt_count == index + 1) + lmv->desc.ld_tgt_count = orig_tgt_count; + memset(tgt, 0, sizeof(*tgt)); + spin_unlock(&lmv->lmv_lock); + } 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); + } + RETURN(rc); } @@ -578,7 +569,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 +611,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) @@ -692,7 +683,8 @@ out_local: RETURN(rc); } -static int lmv_fid2path(struct obd_export *exp, int len, void *karg, void *uarg) +static int lmv_fid2path(struct obd_export *exp, int len, void *karg, + void __user *uarg) { struct obd_device *obddev = class_exp2obd(exp); struct lmv_obd *lmv = &obddev->u.lmv; @@ -819,9 +811,8 @@ static void lmv_hsm_req_build(struct lmv_obd *lmv, static int lmv_hsm_ct_unregister(struct lmv_obd *lmv, unsigned int cmd, int len, struct lustre_kernelcomm *lk, void *uarg) { - __u32 i; - int rc; - struct kkuc_ct_data *kcd = NULL; + __u32 i; + int rc; ENTRY; /* unregister request (call from llapi_hsm_copytool_fini) */ @@ -839,9 +830,7 @@ static int lmv_hsm_ct_unregister(struct lmv_obd *lmv, unsigned int cmd, int len, * Unreached coordinators will get EPIPE on next requests * and will unregister automatically. */ - rc = libcfs_kkuc_group_rem(lk->lk_uid, lk->lk_group, (void **)&kcd); - if (kcd != NULL) - OBD_FREE_PTR(kcd); + rc = libcfs_kkuc_group_rem(lk->lk_uid, lk->lk_group); RETURN(rc); } @@ -853,7 +842,7 @@ static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len, __u32 i, j; int err, rc; bool any_set = false; - struct kkuc_ct_data *kcd; + struct kkuc_ct_data kcd = { 0 }; ENTRY; /* All or nothing: try to register to all MDS. @@ -901,21 +890,14 @@ static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len, if (filp == NULL) RETURN(-EBADF); - OBD_ALLOC_PTR(kcd); - if (kcd == NULL) { - fput(filp); - RETURN(-ENOMEM); - } - kcd->kcd_magic = KKUC_CT_DATA_MAGIC; - kcd->kcd_uuid = lmv->cluuid; - kcd->kcd_archive = lk->lk_data; + kcd.kcd_magic = KKUC_CT_DATA_MAGIC; + kcd.kcd_uuid = lmv->cluuid; + kcd.kcd_archive = lk->lk_data; - rc = libcfs_kkuc_group_add(filp, lk->lk_uid, lk->lk_group, kcd); - if (rc != 0) { - if (filp != NULL) - fput(filp); - OBD_FREE_PTR(kcd); - } + rc = libcfs_kkuc_group_add(filp, lk->lk_uid, lk->lk_group, + &kcd, sizeof(kcd)); + if (rc != 0) + fput(filp); RETURN(rc); } @@ -924,7 +906,7 @@ static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len, static int lmv_iocontrol(unsigned int cmd, struct obd_export *exp, - int len, void *karg, void *uarg) + int len, void *karg, void __user *uarg) { struct obd_device *obddev = class_exp2obd(exp); struct lmv_obd *lmv = &obddev->u.lmv; @@ -1373,7 +1355,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 +1491,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 +1502,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 +1525,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 +1551,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, @@ -1764,26 +1743,27 @@ lmv_locate_mds(struct lmv_obd *lmv, struct md_op_data *op_data, * index if the file under striped dir is being restored, see * ct_restore(). */ if (op_data->op_bias & MDS_CREATE_VOLATILE && - (int)op_data->op_mds != -1 && lsm != NULL) { + (int)op_data->op_mds != -1) { int i; tgt = lmv_get_target(lmv, op_data->op_mds, NULL); if (IS_ERR(tgt)) return tgt; - /* refill the right parent fid */ - for (i = 0; i < lsm->lsm_md_stripe_count; i++) { - struct lmv_oinfo *oinfo; + if (lsm != NULL) { + /* refill the right parent fid */ + for (i = 0; i < lsm->lsm_md_stripe_count; i++) { + struct lmv_oinfo *oinfo; - oinfo = &lsm->lsm_md_oinfo[i]; - if (oinfo->lmo_mds == op_data->op_mds) { - *fid = oinfo->lmo_fid; - break; + oinfo = &lsm->lsm_md_oinfo[i]; + if (oinfo->lmo_mds == op_data->op_mds) { + *fid = oinfo->lmo_fid; + break; + } } - } - /* Hmm, can not find the stripe by mdt_index(op_mds) */ - if (i == lsm->lsm_md_stripe_count) - tgt = ERR_PTR(-EINVAL); + if (i == lsm->lsm_md_stripe_count) + *fid = lsm->lsm_md_oinfo[0].lmo_fid; + } return tgt; } @@ -1952,14 +1932,13 @@ lmv_getattr_name(struct obd_export *exp,struct md_op_data *op_data, NULL) static int lmv_early_cancel(struct obd_export *exp, struct lmv_tgt_desc *tgt, - struct md_op_data *op_data, - __u32 op_tgt, ldlm_mode_t mode, int bits, int flag) -{ - struct lu_fid *fid = md_op_data_fid(op_data, flag); - struct obd_device *obd = exp->exp_obd; - struct lmv_obd *lmv = &obd->u.lmv; - ldlm_policy_data_t policy = {{ 0 }}; - int rc = 0; + struct md_op_data *op_data, __u32 op_tgt, + enum ldlm_mode mode, int bits, int flag) +{ + struct lu_fid *fid = md_op_data_fid(op_data, flag); + struct lmv_obd *lmv = &exp->exp_obd->u.lmv; + union ldlm_policy_data policy = { { 0 } }; + int rc = 0; ENTRY; if (!fid_is_sane(fid)) @@ -2051,6 +2030,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 +2073,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 +2085,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 +2149,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 != -EXDEV) + 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 +2224,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 +2240,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); } @@ -2723,25 +2740,13 @@ try_next_stripe: goto retry_unlink; } -static int lmv_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage) +static int lmv_precleanup(struct obd_device *obd) { - struct lmv_obd *lmv = &obd->u.lmv; - int rc = 0; - - switch (stage) { - case OBD_CLEANUP_EARLY: - /* XXX: here should be calling obd_precleanup() down to - * stack. */ - break; - case OBD_CLEANUP_EXPORTS: - fld_client_proc_fini(&lmv->lmv_fld); - lprocfs_obd_cleanup(obd); - lprocfs_free_md_stats(obd); - break; - default: - break; - } - RETURN(rc); + ENTRY; + fld_client_proc_fini(&obd->u.lmv.lmv_fld); + lprocfs_obd_cleanup(obd); + lprocfs_free_md_stats(obd); + RETURN(0); } /** @@ -2799,8 +2804,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 +2883,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 +2927,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 +2956,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,59 +3005,27 @@ 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) + union ldlm_policy_data *policy, + enum ldlm_mode mode, enum ldlm_cancel_flags flags, + void *opaque) { - struct obd_device *obd = exp->exp_obd; - struct lmv_obd *lmv = &obd->u.lmv; - int rc = 0; - int err; - __u32 i; - ENTRY; + struct lmv_obd *lmv = &exp->exp_obd->u.lmv; + int rc = 0; + __u32 i; + ENTRY; - LASSERT(fid != NULL); + LASSERT(fid != NULL); for (i = 0; i < lmv->desc.ld_tgt_count; i++) { struct lmv_tgt_desc *tgt = lmv->tgts[i]; + int err; if (tgt == NULL || tgt->ltd_exp == NULL || !tgt->ltd_active) continue; @@ -3175,14 +3052,14 @@ int lmv_set_lock_data(struct obd_export *exp, __u64 *lockh, void *data, RETURN(rc); } -ldlm_mode_t lmv_lock_match(struct obd_export *exp, __u64 flags, - const struct lu_fid *fid, ldlm_type_t type, - ldlm_policy_data_t *policy, ldlm_mode_t mode, - struct lustre_handle *lockh) +enum ldlm_mode lmv_lock_match(struct obd_export *exp, __u64 flags, + const struct lu_fid *fid, enum ldlm_type type, + union ldlm_policy_data *policy, + enum ldlm_mode mode, struct lustre_handle *lockh) { struct obd_device *obd = exp->exp_obd; struct lmv_obd *lmv = &obd->u.lmv; - ldlm_mode_t rc; + enum ldlm_mode rc; int tgt; int i; ENTRY; @@ -3278,10 +3155,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,62 +3172,46 @@ 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, - struct md_enqueue_info *minfo, - struct ldlm_enqueue_info *einfo) + struct md_enqueue_info *minfo) { struct md_op_data *op_data = &minfo->mi_data; struct obd_device *obd = exp->exp_obd; struct lmv_obd *lmv = &obd->u.lmv; - struct lmv_tgt_desc *tgt = NULL; + struct lmv_tgt_desc *ptgt = NULL; + struct lmv_tgt_desc *ctgt = NULL; int rc; ENTRY; + if (!fid_is_sane(&op_data->op_fid2)) + RETURN(-EINVAL); + rc = lmv_check_connect(obd); if (rc) RETURN(rc); - tgt = lmv_locate_mds(lmv, op_data, &op_data->op_fid1); - if (IS_ERR(tgt)) - RETURN(PTR_ERR(tgt)); + ptgt = lmv_locate_mds(lmv, op_data, &op_data->op_fid1); + if (IS_ERR(ptgt)) + RETURN(PTR_ERR(ptgt)); + + ctgt = lmv_locate_mds(lmv, op_data, &op_data->op_fid2); + if (IS_ERR(ctgt)) + RETURN(PTR_ERR(ctgt)); + + /* + * if child is on remote MDT, we need 2 async RPCs to fetch both LOOKUP + * lock on parent, and UPDATE lock on child MDT, which makes all + * complicated. Considering remote dir is rare case, and not supporting + * it in statahead won't cause any issue, drop its support for now. + */ + if (ptgt != ctgt) + RETURN(-ENOTSUPP); - rc = md_intent_getattr_async(tgt->ltd_exp, minfo, einfo); + rc = md_intent_getattr_async(ptgt->ltd_exp, minfo); RETURN(rc); } @@ -3500,8 +3359,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,27 +3392,27 @@ 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) +static int __init lmv_init(void) { return class_register_type(&lmv_obd_ops, &lmv_md_ops, true, NULL, LUSTRE_LMV_NAME, NULL); } -static void lmv_exit(void) +static void __exit lmv_exit(void) { - class_unregister_type(LUSTRE_LMV_NAME); + class_unregister_type(LUSTRE_LMV_NAME); } -MODULE_AUTHOR("Sun Microsystems, Inc. "); -MODULE_DESCRIPTION("Lustre Logical Metadata Volume OBD driver"); +MODULE_AUTHOR("OpenSFS, Inc. "); +MODULE_DESCRIPTION("Lustre Logical Metadata Volume"); +MODULE_VERSION(LUSTRE_VERSION_STRING); MODULE_LICENSE("GPL"); module_init(lmv_init);