X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmgs%2Fmgs_handler.c;h=c26270671ea600036ad35faf4ea0779b0b924881;hb=6601661f96325b4971d0d1cb0be0fa01cc2ddc97;hp=1c7327670194aa8cb95b16370f24716b0808ab1c;hpb=b8afd0dcd3834a88b0ceead18c71d37052a00a8d;p=fs%2Flustre-release.git diff --git a/lustre/mgs/mgs_handler.c b/lustre/mgs/mgs_handler.c index 1c73276..c262706 100644 --- a/lustre/mgs/mgs_handler.c +++ b/lustre/mgs/mgs_handler.c @@ -23,7 +23,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2010, 2016, Intel Corporation. + * Copyright (c) 2010, 2017, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -41,9 +41,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include "mgs_internal.h" @@ -130,19 +130,19 @@ static int mgs_set_info(struct tgt_session_info *tsi) !str_starts_with(s + 1, "lov.stripeoffset=")) RETURN(-EINVAL); - /* Construct lustre_cfg structure to pass to function mgs_setparam */ + /* Construct lustre_cfg structure to pass to function mgs_set_param */ lustre_cfg_bufs_reset(&mgi->mgi_bufs, NULL); lustre_cfg_bufs_set_string(&mgi->mgi_bufs, 1, msp->mgs_param); - lcfg = lustre_cfg_new(LCFG_PARAM, &mgi->mgi_bufs); - if (lcfg == NULL) + OBD_ALLOC(lcfg, lustre_cfg_len(mgi->mgi_bufs.lcfg_bufcount, + mgi->mgi_bufs.lcfg_buflen)); + if (!lcfg) RETURN(-ENOMEM); + lustre_cfg_init(lcfg, LCFG_PARAM, &mgi->mgi_bufs); - rc = mgs_setparam(tsi->tsi_env, exp2mgs_dev(tsi->tsi_exp), lcfg, - mgi->mgi_fsname); + rc = mgs_set_param(tsi->tsi_env, exp2mgs_dev(tsi->tsi_exp), lcfg); if (rc) { - LCONSOLE_WARN("%s: Unable to set parameter %s for %s: %d\n", - tgt_name(tsi->tsi_tgt), msp->mgs_param, - mgi->mgi_fsname, rc); + LCONSOLE_WARN("%s: Unable to set parameter %s: %d\n", + tgt_name(tsi->tsi_tgt), msp->mgs_param, rc); GOTO(out_cfg, rc); } @@ -151,7 +151,7 @@ static int mgs_set_info(struct tgt_session_info *tsi) *rep_msp = *msp; EXIT; out_cfg: - lustre_cfg_free(lcfg); + OBD_FREE(lcfg, lustre_cfg_len(lcfg->lcfg_bufcount, lcfg->lcfg_buflens)); return rc; } #endif @@ -270,7 +270,7 @@ void mgs_revoke_lock(struct mgs_device *mgs, struct fs_db *fsdb, int type) if (!rc) { LASSERT(cp != NULL); - rc = ldlm_cli_enqueue_local(mgs->mgs_obd->obd_namespace, + rc = ldlm_cli_enqueue_local(NULL, mgs->mgs_obd->obd_namespace, &res_id, LDLM_PLAIN, NULL, LCK_EX, &flags, ldlm_blocking_ast, cp, NULL, fsdb, 0, LVB_T_NONE, NULL, @@ -438,8 +438,7 @@ static int mgs_target_reg(struct tgt_session_info *tsi) if (mti->mti_flags & LDD_F_NEED_INDEX) mti->mti_flags |= LDD_F_WRITECONF; - if (!(mti->mti_flags & (LDD_F_WRITECONF | LDD_F_UPGRADE14 | - LDD_F_UPDATE))) { + if (!(mti->mti_flags & (LDD_F_WRITECONF | LDD_F_UPDATE))) { /* We're just here as a startup ping. */ CDEBUG(D_MGS, "Server %s is running on %s\n", mti->mti_svname, obd_export_nid2str(tsi->tsi_exp)); @@ -499,8 +498,6 @@ static int mgs_target_reg(struct tgt_session_info *tsi) } mti->mti_flags |= LDD_F_UPDATE; - /* Erased logs means start from scratch. */ - mti->mti_flags &= ~LDD_F_UPGRADE14; } rc = mgs_find_or_make_fsdb(tsi->tsi_env, mgs, mti->mti_fsname, &c_fsdb); @@ -510,19 +507,13 @@ static int mgs_target_reg(struct tgt_session_info *tsi) GOTO(out_norevoke, rc); } - /* - * Log writing contention is handled by the fsdb_mutex. - * - * It should be alright if someone was reading while we were - * updating the logs - if we revoke at the end they will just update - * from where they left off. - */ - - if (mti->mti_flags & LDD_F_UPGRADE14) { - CERROR("Can't upgrade from 1.4 (%d)\n", rc); - GOTO(out, rc); - } - + /* + * Log writing contention is handled by the fsdb_mutex. + * + * It should be alright if someone was reading while we were + * updating the logs - if we revoke at the end they will just update + * from where they left off. + */ if (mti->mti_flags & LDD_F_UPDATE) { CDEBUG(D_MGS, "updating %s, index=%d\n", mti->mti_svname, mti->mti_stripe_index); @@ -536,10 +527,9 @@ static int mgs_target_reg(struct tgt_session_info *tsi) GOTO(out, rc); } - mti->mti_flags &= ~(LDD_F_VIRGIN | LDD_F_UPDATE | - LDD_F_NEED_INDEX | LDD_F_WRITECONF | - LDD_F_UPGRADE14); - mti->mti_flags |= LDD_F_REWRITE_LDD; + mti->mti_flags &= ~(LDD_F_VIRGIN | LDD_F_UPDATE | + LDD_F_NEED_INDEX | LDD_F_WRITECONF); + mti->mti_flags |= LDD_F_REWRITE_LDD; } out: @@ -729,22 +719,43 @@ static inline int mgs_destroy_export(struct obd_export *exp) RETURN(0); } -static int mgs_extract_fs_pool(char * arg, char *fsname, char *poolname) +static int mgs_extract_fs_pool(char *arg, char *fsname, char *poolname) { - char *ptr; + size_t len; + char *ptr; - ENTRY; - for (ptr = arg; (*ptr != '\0') && (*ptr != '.'); ptr++ ) { - *fsname = *ptr; - fsname++; - } - if (*ptr == '\0') - return -EINVAL; - *fsname = '\0'; - ptr++; - strcpy(poolname, ptr); + ENTRY; + /* Validate name */ + for (ptr = arg; *ptr != '\0'; ptr++) { + if (!isalnum(*ptr) && *ptr != '_' && *ptr != '-' && *ptr != '.') + return -EINVAL; + } - RETURN(0); + /* Test for fsname.poolname format. + * strlen() test if poolname is empty + */ + ptr = strchr(arg, '.'); + if (!ptr || !strlen(ptr)) + return -EINVAL; + ptr++; + + /* Also make sure poolname is not to long. */ + if (strlen(ptr) > LOV_MAXPOOLNAME) + return -ENAMETOOLONG; + strncpy(poolname, ptr, LOV_MAXPOOLNAME); + + /* Test if fsname is empty */ + len = strlen(arg) - strlen(ptr) - 1; + if (!len) + return -EINVAL; + + /* or too long */ + if (len > LUSTRE_MAXFSNAME) + return -ENAMETOOLONG; + + strncpy(fsname, arg, len); + + RETURN(0); } static int mgs_iocontrol_nodemap(const struct lu_env *env, @@ -851,6 +862,7 @@ static int mgs_iocontrol_nodemap(const struct lu_env *env, case LCFG_NODEMAP_ADD_GIDMAP: case LCFG_NODEMAP_DEL_GIDMAP: case LCFG_NODEMAP_SET_FILESET: + case LCFG_NODEMAP_SET_SEPOL: if (lcfg->lcfg_bufcount != 3) GOTO(out_lcfg, rc = -EINVAL); nodemap_name = lustre_cfg_string(lcfg, 1); @@ -863,6 +875,7 @@ static int mgs_iocontrol_nodemap(const struct lu_env *env, case LCFG_NODEMAP_SQUASH_UID: case LCFG_NODEMAP_SQUASH_GID: case LCFG_NODEMAP_MAP_MODE: + case LCFG_NODEMAP_AUDIT_MODE: if (lcfg->lcfg_bufcount != 4) GOTO(out_lcfg, rc = -EINVAL); nodemap_name = lustre_cfg_string(lcfg, 1); @@ -995,9 +1008,8 @@ static int mgs_iocontrol(unsigned int cmd, struct obd_export *exp, int len, switch (cmd) { - case OBD_IOC_PARAM: { - struct mgs_thread_info *mgi = mgs_env_info(&env); - struct lustre_cfg *lcfg; + case OBD_IOC_PARAM: { + struct lustre_cfg *lcfg; if (data->ioc_type != LUSTRE_CFG_TYPE) { CERROR("%s: unknown cfg record type: %d\n", @@ -1014,7 +1026,7 @@ static int mgs_iocontrol(unsigned int cmd, struct obd_export *exp, int len, if (lcfg->lcfg_bufcount < 1) GOTO(out_free, rc = -EINVAL); - rc = mgs_setparam(&env, mgs, lcfg, mgi->mgi_fsname); + rc = mgs_set_param(&env, mgs, lcfg); if (rc) CERROR("%s: setparam err: rc = %d\n", exp->exp_obd->obd_name, rc); @@ -1025,32 +1037,37 @@ out_free: case OBD_IOC_REPLACE_NIDS: { if (!data->ioc_inllen1 || !data->ioc_inlbuf1) { - CERROR("No device name specified!\n"); rc = -EINVAL; + CERROR("%s: no device or fsname specified: rc = %d\n", + exp->exp_obd->obd_name, rc); break; } - if (data->ioc_inlbuf1[data->ioc_inllen1 - 1] != 0) { - CERROR("Device name is not NUL terminated!\n"); - rc = -EINVAL; + if (data->ioc_inllen1 > MTI_NAME_MAXLEN) { + rc = -EOVERFLOW; + CERROR("%s: device or fsname is too long: rc = %d\n", + exp->exp_obd->obd_name, rc); break; } - if (data->ioc_plen1 > MTI_NAME_MAXLEN) { - CERROR("Device name is too long\n"); - rc = -EOVERFLOW; + if (data->ioc_inlbuf1[data->ioc_inllen1 - 1] != 0) { + rc = -EINVAL; + CERROR("%s: device or fsname is not NUL terminated: " + "rc = %d\n", exp->exp_obd->obd_name, rc); break; } if (!data->ioc_inllen2 || !data->ioc_inlbuf2) { - CERROR("No NIDs were specified!\n"); rc = -EINVAL; + CERROR("%s: no NIDs specified: rc = %d\n", + exp->exp_obd->obd_name, rc); break; } if (data->ioc_inlbuf2[data->ioc_inllen2 - 1] != 0) { - CERROR("NID list is not NUL terminated!\n"); rc = -EINVAL; + CERROR("%s: NID list is not NUL terminated: " + "rc = %d\n", exp->exp_obd->obd_name, rc); break; } @@ -1064,6 +1081,37 @@ out_free: break; } + case OBD_IOC_CLEAR_CONFIGS: { + if (!data->ioc_inllen1 || !data->ioc_inlbuf1) { + rc = -EINVAL; + CERROR("%s: no device or fsname specified: rc = %d\n", + exp->exp_obd->obd_name, rc); + break; + } + + if (data->ioc_inllen1 > MTI_NAME_MAXLEN) { + rc = -EOVERFLOW; + CERROR("%s: device or fsname is too long: rc = %d\n", + exp->exp_obd->obd_name, rc); + break; + } + + if (data->ioc_inlbuf1[data->ioc_inllen1 - 1] != 0) { + rc = -EINVAL; + CERROR("%s: device or fsname is not NUL terminated: " + "rc = %d\n", exp->exp_obd->obd_name, rc); + break; + } + + /* remove records marked SKIP from config logs */ + rc = mgs_clear_configs(&env, mgs, data->ioc_inlbuf1); + if (rc) + CERROR("%s: error clearing config log: rc = %d\n", + exp->exp_obd->obd_name, rc); + + break; + } + case OBD_IOC_POOL: rc = mgs_iocontrol_pool(&env, mgs, data); break; @@ -1155,11 +1203,11 @@ TGT_RPC_HANDLER(MGS_FIRST_OPC, &RQF_MDS_DISCONNECT, LUSTRE_OBD_VERSION), TGT_MGS_HDL_VAR(0, MGS_EXCEPTION, mgs_exception), #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 13, 53, 0) -TGT_MGS_HDL (HABEO_REFERO | MUTABOR, MGS_SET_INFO, mgs_set_info), +TGT_MGS_HDL(HAS_REPLY | IS_MUTABLE, MGS_SET_INFO, mgs_set_info), #endif -TGT_MGS_HDL (HABEO_REFERO | MUTABOR, MGS_TARGET_REG, mgs_target_reg), +TGT_MGS_HDL(HAS_REPLY | IS_MUTABLE, MGS_TARGET_REG, mgs_target_reg), TGT_MGS_HDL_VAR(0, MGS_TARGET_DEL, mgs_target_del), -TGT_MGS_HDL (HABEO_REFERO, MGS_CONFIG_READ, mgs_config_read), +TGT_MGS_HDL(HAS_REPLY, MGS_CONFIG_READ, mgs_config_read), }; static struct tgt_handler mgs_obd_handlers[] = { @@ -1176,7 +1224,7 @@ static struct tgt_handler mgs_dlm_handlers[] = { * * instead of common OBD_FAIL_LDLM_ENQUEUE_NET */ .th_fail_id = 0, .th_opc = LDLM_ENQUEUE, - .th_flags = HABEO_CLAVIS, + .th_flags = HAS_KEY, .th_act = tgt_enqueue, .th_fmt = &RQF_LDLM_ENQUEUE, .th_version = LUSTRE_DLM_VERSION, @@ -1187,7 +1235,6 @@ static struct tgt_handler mgs_llog_handlers[] = { TGT_LLOG_HDL (0, LLOG_ORIGIN_HANDLE_CREATE, mgs_llog_open), TGT_LLOG_HDL (0, LLOG_ORIGIN_HANDLE_NEXT_BLOCK, tgt_llog_next_block), TGT_LLOG_HDL (0, LLOG_ORIGIN_HANDLE_READ_HEADER, tgt_llog_read_header), -TGT_LLOG_HDL_VAR(0, LLOG_ORIGIN_HANDLE_CLOSE, tgt_llog_close), TGT_LLOG_HDL (0, LLOG_ORIGIN_HANDLE_PREV_BLOCK, tgt_llog_prev_block), }; @@ -1290,7 +1337,7 @@ static int mgs_init0(const struct lu_env *env, struct mgs_device *mgs, /* Internal mgs setup */ mgs_init_fsdb_list(mgs); mutex_init(&mgs->mgs_mutex); - mgs->mgs_start_time = cfs_time_current_sec(); + mgs->mgs_start_time = ktime_get_real_seconds(); spin_lock_init(&mgs->mgs_lock); mutex_init(&mgs->mgs_health_mutex); init_rwsem(&mgs->mgs_barrier_rwsem); @@ -1344,7 +1391,8 @@ static int mgs_init0(const struct lu_env *env, struct mgs_device *mgs, }; /* Start the service threads */ - mgs->mgs_service = ptlrpc_register_service(&conf, obd->obd_proc_entry); + mgs->mgs_service = ptlrpc_register_service(&conf, &obd->obd_kset, + obd->obd_debugfs_entry); if (IS_ERR(mgs->mgs_service)) { rc = PTR_ERR(mgs->mgs_service); CERROR("failed to start mgs service: %d\n", rc); @@ -1379,7 +1427,7 @@ err_ns: err_ops: lu_site_purge(env, mgs2lu_dev(mgs)->ld_site, ~0); if (!cfs_hash_is_empty(mgs2lu_dev(mgs)->ld_site->ls_obj_hash)) { - LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_ERROR, NULL); + LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_OTHER, NULL); lu_site_print(env, mgs2lu_dev(mgs)->ld_site, &msgdata, lu_cdebug_printer); } @@ -1555,7 +1603,7 @@ static struct lu_device *mgs_device_fini(const struct lu_env *env, lu_site_purge(env, d->ld_site, ~0); if (!cfs_hash_is_empty(d->ld_site->ls_obj_hash)) { - LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_ERROR, NULL); + LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_OTHER, NULL); lu_site_print(env, d->ld_site, &msgdata, lu_cdebug_printer); } @@ -1594,28 +1642,16 @@ static struct lu_device_type mgs_device_type = { .ldt_ctx_tags = LCT_MG_THREAD }; -static int mgs_obd_connect(const struct lu_env *env, struct obd_export **exp, - struct obd_device *obd, struct obd_uuid *cluuid, - struct obd_connect_data *data, void *localdata) +static int mgs_obd_reconnect(const struct lu_env *env, struct obd_export *exp, + struct obd_device *obd, struct obd_uuid *cluuid, + struct obd_connect_data *data, void *localdata) { - struct obd_export *lexp; - struct lustre_handle conn = { - .cookie = 0, - }; - int rc; - ENTRY; if (exp == NULL || obd == NULL || cluuid == NULL) RETURN(-EINVAL); - rc = class_connect(&conn, obd, cluuid); - if (rc) - RETURN(rc); - - lexp = class_conn2export(&conn); - if (lexp == NULL) - RETURN(-EFAULT); + tgt_counter_incr(exp, LPROC_MGS_CONNECT); if (data != NULL) { data->ocd_connect_flags &= MGS_CONNECT_SUPPORTED; @@ -1623,43 +1659,48 @@ static int mgs_obd_connect(const struct lu_env *env, struct obd_export **exp, if (data->ocd_connect_flags & OBD_CONNECT_FLAGS2) data->ocd_connect_flags2 &= MGS_CONNECT_SUPPORTED2; + exp->exp_connect_data = *data; data->ocd_version = LUSTRE_VERSION_CODE; - lexp->exp_connect_data = *data; } - tgt_counter_incr(lexp, LPROC_MGS_CONNECT); - - rc = mgs_export_stats_init(obd, lexp, localdata); - if (rc) - class_disconnect(lexp); - else - *exp = lexp; - - RETURN(rc); + RETURN(mgs_export_stats_init(obd, exp, localdata)); } -static int mgs_obd_reconnect(const struct lu_env *env, struct obd_export *exp, - struct obd_device *obd, struct obd_uuid *cluuid, - struct obd_connect_data *data, void *localdata) +static int mgs_obd_connect(const struct lu_env *env, struct obd_export **exp, + struct obd_device *obd, struct obd_uuid *cluuid, + struct obd_connect_data *data, void *localdata) { + struct obd_export *lexp; + struct lustre_handle conn = { + .cookie = 0, + }; + int rc; + ENTRY; if (exp == NULL || obd == NULL || cluuid == NULL) RETURN(-EINVAL); - tgt_counter_incr(exp, LPROC_MGS_CONNECT); + rc = class_connect(&conn, obd, cluuid); + if (rc) + RETURN(rc); - if (data != NULL) { - data->ocd_connect_flags &= MGS_CONNECT_SUPPORTED; + lexp = class_conn2export(&conn); + if (lexp == NULL) + RETURN(-EFAULT); - if (data->ocd_connect_flags & OBD_CONNECT_FLAGS2) - data->ocd_connect_flags2 &= MGS_CONNECT_SUPPORTED2; + rc = mgs_obd_reconnect(env, lexp, obd, cluuid, data, localdata); + if (rc) + GOTO(out_disconnect, rc); - data->ocd_version = LUSTRE_VERSION_CODE; - exp->exp_connect_data = *data; - } + *exp = lexp; - RETURN(mgs_export_stats_init(obd, exp, localdata)); + RETURN(rc); + +out_disconnect: + class_disconnect(lexp); + + return rc; } static int mgs_obd_disconnect(struct obd_export *exp)