Whamcloud - gitweb
LU-9679 modules: convert MIN/MAX to kernel style
[fs/lustre-release.git] / lustre / mgs / mgs_handler.c
index 392fee3..e5603d5 100644 (file)
@@ -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/
@@ -130,7 +130,7 @@ 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);
        OBD_ALLOC(lcfg, lustre_cfg_len(mgi->mgi_bufs.lcfg_bufcount,
@@ -139,12 +139,10 @@ static int mgs_set_info(struct tgt_session_info *tsi)
                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);
        }
 
@@ -272,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,
@@ -330,25 +328,23 @@ static int mgs_check_target(const struct lu_env *env,
 /* Ensure this is not a failover node that is connecting first*/
 static int mgs_check_failover_reg(struct mgs_target_info *mti)
 {
-        lnet_nid_t nid;
-        char *ptr;
-        int i;
+       lnet_nid_t nid;
+       char *ptr;
+       int i;
 
-        ptr = mti->mti_params;
-        while (class_find_param(ptr, PARAM_FAILNODE, &ptr) == 0) {
+       ptr = mti->mti_params;
+       while (class_find_param(ptr, PARAM_FAILNODE, &ptr) == 0) {
                while (class_parse_nid_quiet(ptr, &nid, &ptr) == 0) {
-                        for (i = 0; i < mti->mti_nid_count; i++) {
-                                if (nid == mti->mti_nids[i]) {
-                                        LCONSOLE_WARN("Denying initial registra"
-                                                      "tion attempt from nid %s"
-                                                      ", specified as failover"
-                                                      "\n",libcfs_nid2str(nid));
-                                        return -EADDRNOTAVAIL;
-                                }
-                        }
-                }
-        }
-        return 0;
+                       for (i = 0; i < mti->mti_nid_count; i++) {
+                               if (nid == mti->mti_nids[i]) {
+                                       LCONSOLE_WARN("Denying initial registration attempt from nid %s, specified as failover\n",
+                                                     libcfs_nid2str(nid));
+                                       return -EADDRNOTAVAIL;
+                               }
+                       }
+               }
+       }
+       return 0;
 }
 
 /* Called whenever a target starts up.  Flags indicate first connect, etc. */
@@ -440,8 +436,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));
@@ -501,8 +496,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);
@@ -512,19 +505,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);
@@ -538,10 +525,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:
@@ -754,7 +740,7 @@ static int mgs_extract_fs_pool(char *arg, char *fsname, char *poolname)
        /* Also make sure poolname is not to long. */
        if (strlen(ptr) > LOV_MAXPOOLNAME)
                return -ENAMETOOLONG;
-       strncpy(poolname, ptr, strlen(ptr));
+       strncpy(poolname, ptr, LOV_MAXPOOLNAME);
 
        /* Test if fsname is empty */
        len = strlen(arg) - strlen(ptr) - 1;
@@ -834,7 +820,8 @@ static int mgs_iocontrol_nodemap(const struct lu_env *env,
                nid = libcfs_str2nid(nidstr);
                nodemap_test_nid(nid, name_buf, sizeof(name_buf));
                rc = copy_to_user(data->ioc_pbuf1, name_buf,
-                                 MIN(data->ioc_plen1, sizeof(name_buf)));
+                                 min_t(size_t, data->ioc_plen1,
+                                       sizeof(name_buf)));
                if (rc != 0)
                        GOTO(out_lcfg, rc = -EFAULT);
                break;
@@ -874,6 +861,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);
@@ -886,6 +874,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);
@@ -1018,9 +1007,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",
@@ -1037,7 +1025,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);
@@ -1048,32 +1036,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;
                }
 
@@ -1087,6 +1080,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;
@@ -1178,11 +1202,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[] = {
@@ -1199,7 +1223,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,
@@ -1210,7 +1234,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),
 };
 
@@ -1368,7 +1391,7 @@ 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_kset,
-                                                  obd->obd_proc_entry);
+                                                  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);
@@ -1403,7 +1426,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);
        }
@@ -1579,7 +1602,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);
        }
 
@@ -1618,28 +1641,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;
@@ -1647,43 +1658,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)
@@ -1717,7 +1733,7 @@ static int mgs_health_check(const struct lu_env *env, struct obd_device *obd)
 }
 
 /* use obd ops to offer management infrastructure */
-static struct obd_ops mgs_obd_device_ops = {
+static const struct obd_ops mgs_obd_device_ops = {
        .o_owner                = THIS_MODULE,
        .o_connect              = mgs_obd_connect,
        .o_reconnect            = mgs_obd_reconnect,