Whamcloud - gitweb
LU-3527 nodemap: add nodemap kernel module
[fs/lustre-release.git] / lustre / mgs / mgs_handler.c
index 560dd19..5be9040 100644 (file)
@@ -620,6 +620,60 @@ static int mgs_extract_fs_pool(char * arg, char *fsname, char *poolname)
         RETURN(0);
 }
 
+static int mgs_iocontrol_nodemap(const struct lu_env *env,
+                                struct mgs_device *mgs,
+                                struct obd_ioctl_data *data)
+{
+       struct lustre_cfg *lcfg = NULL;
+       const char *nodemap_name;
+       char *param = NULL;
+       __u32 cmd;
+       int rc = 0;
+       ENTRY;
+
+       if (data->ioc_type != LUSTRE_CFG_TYPE) {
+               CERROR("%s: unknown cfg record type: %d\n",
+                      mgs->mgs_obd->obd_name, data->ioc_type);
+               GOTO(out, rc = -EINVAL);
+       }
+
+       if (data->ioc_plen1 > PAGE_CACHE_SIZE)
+               GOTO(out, rc = -E2BIG);
+
+       OBD_ALLOC(lcfg, data->ioc_plen1);
+       if (lcfg == NULL)
+               GOTO(out, rc = -ENOMEM);
+
+       if (copy_from_user(lcfg, data->ioc_pbuf1, data->ioc_plen1))
+               GOTO(out_lcfg, rc = -EFAULT);
+
+       nodemap_name = lustre_cfg_string(lcfg, 1);
+       cmd = lcfg->lcfg_command;
+
+       switch (cmd) {
+       case LCFG_NODEMAP_ADD:
+       case LCFG_NODEMAP_DEL:
+               if (lcfg->lcfg_bufcount != 2)
+                       GOTO(out_lcfg, rc = -EINVAL);
+               rc = mgs_nodemap_cmd(env, mgs, cmd, nodemap_name, param);
+               break;
+       default:
+               rc = -ENOTTY;
+       }
+
+       if (rc != 0) {
+               CERROR("%s: OBD_IOC_NODEMAP command %X for %s: rc = %d\n",
+                      mgs->mgs_obd->obd_name, lcfg->lcfg_command,
+                      nodemap_name, rc);
+               GOTO(out_lcfg, rc);
+       }
+
+out_lcfg:
+       OBD_FREE(lcfg, data->ioc_plen1);
+out:
+       RETURN(rc);
+}
+
 static int mgs_iocontrol_pool(const struct lu_env *env,
                              struct mgs_device *mgs,
                               struct obd_ioctl_data *data)
@@ -792,8 +846,12 @@ out_free:
                rc = mgs_iocontrol_pool(&env, mgs, data);
                break;
 
-        case OBD_IOC_DUMP_LOG: {
-                struct llog_ctxt *ctxt;
+       case OBD_IOC_NODEMAP:
+               rc = mgs_iocontrol_nodemap(&env, mgs, data);
+               break;
+
+       case OBD_IOC_DUMP_LOG: {
+               struct llog_ctxt *ctxt;
 
                ctxt = llog_get_context(mgs->mgs_obd, LLOG_CONFIG_ORIG_CTXT);
                rc = class_config_dump_llog(&env, ctxt, data->ioc_inlbuf1,