1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2001, 2002 Cluster File Systems, Inc.
6 * This file is part of Lustre, http://www.lustre.org.
8 * Lustre is free software; you can redistribute it and/or
9 * modify it under the terms of version 2 of the GNU General Public
10 * License as published by the Free Software Foundation.
12 * Lustre is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Lustre; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 # define EXPORT_SYMTAB
25 #define DEBUG_SUBSYSTEM S_PORTALS
27 #include <linux/config.h>
28 #include <linux/module.h>
29 #include <linux/kernel.h>
31 #include <linux/string.h>
32 #include <linux/stat.h>
33 #include <linux/init.h>
34 #include <linux/errno.h>
35 #include <linux/smp_lock.h>
36 #include <linux/unistd.h>
38 #include <asm/system.h>
39 #include <asm/uaccess.h>
42 #include <linux/stat.h>
43 #include <asm/uaccess.h>
44 #include <asm/segment.h>
45 #include <linux/miscdevice.h>
47 #include <portals/lib-p30.h>
48 #include <portals/p30.h>
49 #include <linux/kp30.h>
50 #include <linux/kpr.h>
51 #include <linux/portals_compat25.h>
53 extern void (kping_client)(struct portal_ioctl_data *);
55 struct nal_cmd_handler {
56 nal_cmd_handler_t nch_handler;
60 static struct nal_cmd_handler nal_cmd[NAL_MAX_NR + 1];
61 static DECLARE_MUTEX(nal_cmd_sem);
65 kportal_add_route(int gateway_nalid, ptl_nid_t gateway_nid,
66 ptl_nid_t lo_nid, ptl_nid_t hi_nid)
69 kpr_control_interface_t *ci;
71 ci = (kpr_control_interface_t *) PORTAL_SYMBOL_GET (kpr_control_interface);
75 rc = ci->kprci_add_route (gateway_nalid, gateway_nid, lo_nid, hi_nid);
77 PORTAL_SYMBOL_PUT(kpr_control_interface);
82 kportal_del_route(int gw_nalid, ptl_nid_t gw_nid,
83 ptl_nid_t lo, ptl_nid_t hi)
86 kpr_control_interface_t *ci;
88 ci = (kpr_control_interface_t *)PORTAL_SYMBOL_GET(kpr_control_interface);
92 rc = ci->kprci_del_route (gw_nalid, gw_nid, lo, hi);
94 PORTAL_SYMBOL_PUT(kpr_control_interface);
99 kportal_notify_router (int gw_nalid, ptl_nid_t gw_nid,
100 int alive, time_t when)
103 kpr_control_interface_t *ci;
105 /* No error if router not preset. Sysadmin is allowed to notify
106 * _everywhere_ when a NID boots or crashes, even if they know
107 * nothing of the peer. */
108 ci = (kpr_control_interface_t *)PORTAL_SYMBOL_GET(kpr_control_interface);
112 rc = ci->kprci_notify (gw_nalid, gw_nid, alive, when);
114 PORTAL_SYMBOL_PUT(kpr_control_interface);
119 kportal_get_route(int index, __u32 *gateway_nalidp, ptl_nid_t *gateway_nidp,
120 ptl_nid_t *lo_nidp, ptl_nid_t *hi_nidp, int *alivep)
123 ptl_nid_t gateway_nid;
128 kpr_control_interface_t *ci;
130 ci = (kpr_control_interface_t *) PORTAL_SYMBOL_GET(kpr_control_interface);
134 rc = ci->kprci_get_route(index, &gateway_nalid, &gateway_nid,
135 &lo_nid, &hi_nid, &alive);
138 CDEBUG(D_IOCTL, "got route [%d] %d "LPX64":"LPX64" - "LPX64", %s\n",
139 index, gateway_nalid, gateway_nid, lo_nid, hi_nid,
140 alive ? "up" : "down");
142 *gateway_nalidp = (__u32)gateway_nalid;
143 *gateway_nidp = gateway_nid;
149 PORTAL_SYMBOL_PUT (kpr_control_interface);
154 kportal_router_cmd(struct portals_cfg *pcfg, void * private)
159 switch(pcfg->pcfg_command) {
161 CDEBUG(D_IOCTL, "Inappropriate cmd: %d\n", pcfg->pcfg_command);
164 case NAL_CMD_ADD_ROUTE:
165 CDEBUG(D_IOCTL, "Adding route: [%d] "LPU64" : "LPU64" - "LPU64"\n",
166 pcfg->pcfg_nal, pcfg->pcfg_nid,
167 pcfg->pcfg_nid2, pcfg->pcfg_nid3);
168 err = kportal_add_route(pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
169 pcfg->pcfg_nid2, pcfg->pcfg_nid3);
172 case NAL_CMD_DEL_ROUTE:
173 CDEBUG (D_IOCTL, "Removing routes via [%d] "LPU64" : "LPU64" - "LPU64"\n",
174 pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
175 pcfg->pcfg_nid2, pcfg->pcfg_nid3);
176 err = kportal_del_route (pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
177 pcfg->pcfg_nid2, pcfg->pcfg_nid3);
180 case NAL_CMD_NOTIFY_ROUTER: {
181 CDEBUG (D_IOCTL, "Notifying peer [%d] "LPU64" %s @ %ld\n",
182 pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
183 pcfg->pcfg_flags ? "Enabling" : "Disabling",
184 (time_t)pcfg->pcfg_nid3);
186 err = kportal_notify_router (pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
188 (time_t)pcfg->pcfg_nid3);
192 case NAL_CMD_GET_ROUTE:
193 CDEBUG (D_IOCTL, "Getting route [%d]\n", pcfg->pcfg_count);
194 err = kportal_get_route(pcfg->pcfg_count, &pcfg->pcfg_gw_nal,
196 &pcfg->pcfg_nid2, &pcfg->pcfg_nid3,
204 kportal_nal_cmd(struct portals_cfg *pcfg)
206 __u32 nal = pcfg->pcfg_nal;
212 if (nal > 0 && nal <= NAL_MAX_NR && nal_cmd[nal].nch_handler) {
213 CDEBUG(D_IOCTL, "calling handler nal: %d, cmd: %d\n", nal,
215 rc = nal_cmd[nal].nch_handler(pcfg, nal_cmd[nal].nch_private);
222 kportal_get_ni (int nal)
228 return (PORTAL_SYMBOL_GET(kqswnal_ni));
230 return (PORTAL_SYMBOL_GET(ksocknal_ni));
232 return (PORTAL_SYMBOL_GET(kgmnal_ni));
234 return (PORTAL_SYMBOL_GET(kibnal_ni));
239 return (PORTAL_SYMBOL_GET(kscimacnal_ni));
241 /* A warning to a naive caller */
242 CERROR ("unknown nal: %d\n", nal);
248 kportal_put_ni (int nal)
254 PORTAL_SYMBOL_PUT(kqswnal_ni);
257 PORTAL_SYMBOL_PUT(ksocknal_ni);
260 PORTAL_SYMBOL_PUT(kgmnal_ni);
263 PORTAL_SYMBOL_PUT(kibnal_ni);
266 /* A lesson to a malicious caller */
269 PORTAL_SYMBOL_PUT(kscimacnal_ni);
272 CERROR ("unknown nal: %d\n", nal);
277 kportal_nal_register(int nal, nal_cmd_handler_t handler, void * private)
281 CDEBUG(D_IOCTL, "Register NAL %d, handler: %p\n", nal, handler);
283 if (nal > 0 && nal <= NAL_MAX_NR) {
285 if (nal_cmd[nal].nch_handler != NULL)
288 nal_cmd[nal].nch_handler = handler;
289 nal_cmd[nal].nch_private = private;
297 kportal_nal_unregister(int nal)
301 CDEBUG(D_IOCTL, "Unregister NAL %d\n", nal);
303 if (nal > 0 && nal <= NAL_MAX_NR) {
305 nal_cmd[nal].nch_handler = NULL;
306 nal_cmd[nal].nch_private = NULL;
312 static int kportal_ioctl(struct portal_ioctl_data *data,
313 unsigned int cmd, unsigned long arg)
316 char str[PTL_NALFMT_SIZE];
320 case IOC_PORTAL_PING: {
321 void (*ping)(struct portal_ioctl_data *);
323 CDEBUG(D_IOCTL, "doing %d pings to nid "LPX64" (%s)\n",
324 data->ioc_count, data->ioc_nid,
325 portals_nid2str(data->ioc_nal, data->ioc_nid, str));
326 ping = PORTAL_SYMBOL_GET(kping_client);
328 CERROR("PORTAL_SYMBOL_GET failed\n");
331 PORTAL_SYMBOL_PUT(kping_client);
336 case IOC_PORTAL_GET_NID: {
337 const ptl_handle_ni_t *nip;
338 ptl_process_id_t pid;
340 CDEBUG (D_IOCTL, "Getting nid for nal [%d]\n", data->ioc_nal);
342 nip = kportal_get_ni (data->ioc_nal);
346 err = PtlGetId (*nip, &pid);
347 LASSERT (err == PTL_OK);
348 kportal_put_ni (data->ioc_nal);
350 data->ioc_nid = pid.nid;
351 if (copy_to_user ((char *)arg, data, sizeof (*data)))
356 case IOC_PORTAL_NAL_CMD: {
357 struct portals_cfg pcfg;
359 LASSERT (data->ioc_plen1 == sizeof(pcfg));
360 err = copy_from_user(&pcfg, (void *)data->ioc_pbuf1,
367 CDEBUG (D_IOCTL, "nal command nal %d cmd %d\n", pcfg.pcfg_nal,
369 err = kportal_nal_cmd(&pcfg);
371 if (copy_to_user((char *)data->ioc_pbuf1, &pcfg,
374 if (copy_to_user((char *)arg, data, sizeof (*data)))
379 case IOC_PORTAL_FAIL_NID: {
380 const ptl_handle_ni_t *nip;
382 CDEBUG (D_IOCTL, "fail nid: [%d] "LPU64" count %d\n",
383 data->ioc_nal, data->ioc_nid, data->ioc_count);
385 nip = kportal_get_ni (data->ioc_nal);
389 err = PtlFailNid (*nip, data->ioc_nid, data->ioc_count);
390 kportal_put_ni (data->ioc_nal);
401 DECLARE_IOCTL_HANDLER(kportal_ioctl_handler, kportal_ioctl);
403 static int init_kportals_module(void)
410 CERROR("PtlInit: error %d\n", rc);
414 rc = kportal_nal_register(ROUTER, kportal_router_cmd, NULL);
417 CERROR("kportal_nal_registre: ROUTER error %d\n", rc);
421 libcfs_register_ioctl(&kportal_ioctl_handler);
426 static void exit_kportals_module(void)
428 libcfs_deregister_ioctl(&kportal_ioctl_handler);
429 kportal_nal_unregister(ROUTER);
433 EXPORT_SYMBOL(kportal_nal_register);
434 EXPORT_SYMBOL(kportal_nal_unregister);
435 EXPORT_SYMBOL(kportal_get_ni);
436 EXPORT_SYMBOL(kportal_put_ni);
437 EXPORT_SYMBOL(kportal_nal_cmd);
439 EXPORT_SYMBOL(ptl_err_str);
440 EXPORT_SYMBOL(lib_dispatch);
441 EXPORT_SYMBOL(PtlMEAttach);
442 EXPORT_SYMBOL(PtlMEInsert);
443 EXPORT_SYMBOL(PtlMEUnlink);
444 EXPORT_SYMBOL(PtlEQAlloc);
445 EXPORT_SYMBOL(PtlMDAttach);
446 EXPORT_SYMBOL(PtlMDUnlink);
447 EXPORT_SYMBOL(PtlNIInit);
448 EXPORT_SYMBOL(PtlNIFini);
449 EXPORT_SYMBOL(PtlNIDebug);
450 EXPORT_SYMBOL(PtlInit);
451 EXPORT_SYMBOL(PtlFini);
452 EXPORT_SYMBOL(PtlSnprintHandle);
453 EXPORT_SYMBOL(PtlPut);
454 EXPORT_SYMBOL(PtlGet);
455 EXPORT_SYMBOL(PtlEQWait);
456 EXPORT_SYMBOL(PtlEQFree);
457 EXPORT_SYMBOL(PtlEQGet);
458 EXPORT_SYMBOL(PtlGetId);
459 EXPORT_SYMBOL(PtlMDBind);
460 EXPORT_SYMBOL(lib_iov_nob);
461 EXPORT_SYMBOL(lib_copy_iov2buf);
462 EXPORT_SYMBOL(lib_copy_buf2iov);
463 EXPORT_SYMBOL(lib_extract_iov);
464 EXPORT_SYMBOL(lib_kiov_nob);
465 EXPORT_SYMBOL(lib_copy_kiov2buf);
466 EXPORT_SYMBOL(lib_copy_buf2kiov);
467 EXPORT_SYMBOL(lib_extract_kiov);
468 EXPORT_SYMBOL(lib_finalize);
469 EXPORT_SYMBOL(lib_parse);
470 EXPORT_SYMBOL(lib_create_reply_msg);
471 EXPORT_SYMBOL(lib_init);
472 EXPORT_SYMBOL(lib_fini);
473 EXPORT_SYMBOL(dispatch_name);
475 MODULE_AUTHOR("Peter J. Braam <braam@clusterfs.com>");
476 MODULE_DESCRIPTION("Portals v3.1");
477 MODULE_LICENSE("GPL");
478 module_init(init_kportals_module);
479 module_exit(exit_kportals_module);