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)
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,