1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Lustre Light Super operations
6 * Copyright (c) 2002, 2003 Cluster File Systems, Inc.
8 * This file is part of Lustre, http://www.lustre.org.
10 * Lustre is free software; you can redistribute it and/or
11 * modify it under the terms of version 2 of the GNU General Public
12 * License as published by the Free Software Foundation.
14 * Lustre is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with Lustre; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <sys/types.h>
28 #include <sys/queue.h>
30 #include <netinet/in.h>
31 #include <sys/socket.h>
32 #include <arpa/inet.h>
40 #include <portals/api-support.h> /* needed for ptpctl.h */
41 #include <portals/ptlctl.h> /* needed for parse_dump */
42 #include <procbridge.h>
44 #include "llite_lib.h"
47 ptl_handle_ni_t tcpnal_ni;
48 struct task_struct *current;
49 struct obd_class_user_state ocus;
51 /* portals interfaces */
53 kportal_get_ni (int nal)
65 kportal_put_ni (int nal)
70 struct ldlm_namespace;
74 void *inter_module_get(char *arg)
76 if (!strcmp(arg, "tcpnal_ni"))
78 else if (!strcmp(arg, "ldlm_cli_cancel_unused"))
79 return ldlm_cli_cancel_unused;
80 else if (!strcmp(arg, "ldlm_namespace_cleanup"))
81 return ldlm_namespace_cleanup;
82 else if (!strcmp(arg, "ldlm_replay_locks"))
83 return ldlm_replay_locks;
88 /* XXX move to proper place */
89 char *portals_nid2str(int nal, ptl_nid_t nid, char *str)
95 sprintf(str, "%u:%d.%d.%d.%d", (__u32)(nid >> 32),
102 sprintf(str, "%u:%u", (__u32)(nid >> 32), (__u32)nid);
110 void init_current(char *comm)
112 current = malloc(sizeof(*current));
113 current->fs = malloc(sizeof(*current->fs));
114 current->fs->umask = umask(0777);
115 umask(current->fs->umask);
116 strncpy(current->comm, comm, sizeof(current->comm));
117 current->pid = getpid();
120 current->cap_effective = -1;
121 memset(¤t->pending, 0, sizeof(current->pending));
125 void generate_random_uuid(unsigned char uuid_out[16])
127 int *arr = (int*)uuid_out;
130 for (i = 0; i < sizeof(uuid_out)/sizeof(int); i++)
134 ptl_nid_t tcpnal_mynid;
136 int init_lib_portals()
142 rc = PtlNIInit(procbridge_interface, 0, 0, 0, &tcpnal_ni);
144 CERROR("ksocknal: PtlNIInit failed: error %d\n", rc);
148 PtlNIDebug(tcpnal_ni, ~0);
153 kportal_nal_cmd(struct portals_cfg *pcfg)
155 /* handle portals command if we want */
159 extern int class_handle_ioctl(struct obd_class_user_state *ocus, unsigned int cmd, unsigned long arg);
161 int lib_ioctl_nalcmd(int dev_id, int opc, void * ptr)
163 struct portal_ioctl_data *ptldata;
165 if (opc == IOC_PORTAL_NAL_CMD) {
166 ptldata = (struct portal_ioctl_data *) ptr;
168 if (ptldata->ioc_nal_cmd == NAL_CMD_REGISTER_MYNID) {
169 tcpnal_mynid = ptldata->ioc_nid;
170 printf("mynid: %u.%u.%u.%u\n",
171 (unsigned)(tcpnal_mynid>>24) & 0xFF,
172 (unsigned)(tcpnal_mynid>>16) & 0xFF,
173 (unsigned)(tcpnal_mynid>>8) & 0xFF,
174 (unsigned)(tcpnal_mynid) & 0xFF);
181 int lib_ioctl(int dev_id, int opc, void * ptr)
185 if (dev_id == OBD_DEV_ID) {
186 struct obd_ioctl_data *ioc = ptr;
189 ioc->ioc_plen1 = ioc->ioc_inllen1;
190 ioc->ioc_pbuf1 = ioc->ioc_bulk;
193 rc = class_handle_ioctl(&ocus, opc, (unsigned long)ptr);
195 printf ("proccssing ioctl cmd: %x, rc %d\n", opc, rc);
203 int lllib_init(char *dumpfile)
205 INIT_LIST_HEAD(&ocus.ocus_conns);
208 /* this parse only get my nid from config file
209 * before initialize portals
211 if (parse_dump(dumpfile, lib_ioctl_nalcmd))
214 /* XXX need setup mynid before tcpnal initialize */
215 tcpnal_mynid = ((uint64_t)getpid() << 32) | time(0);
216 printf("set tcpnal mynid: %016llx\n", tcpnal_mynid);
219 init_current("dummy");
220 if (init_obdclass() ||
221 init_lib_portals() ||
229 if (!g_zconf && parse_dump(dumpfile, lib_ioctl))
232 return _sysio_fssw_register("llite", &llu_fssw_ops);
236 static void llu_check_request()
238 liblustre_wait_event(0);
242 int liblustre_process_log(struct config_llog_instance *cfg)
244 struct lustre_cfg lcfg;
245 char *peer = "MDS_PEER_UUID";
246 struct obd_device *obd;
247 struct lustre_handle mdc_conn = {0, };
248 struct obd_export *exp;
249 char *name = "mdc_dev";
251 struct obd_uuid mdc_uuid;
252 struct llog_ctxt *ctxt;
254 int nal, err, rc = 0;
257 generate_random_uuid(uuid);
258 class_uuid_unparse(uuid, &mdc_uuid);
260 if (ptl_parse_nid(&nid, g_zconf_mdsnid)) {
261 CERROR("Can't parse NID %s\n", g_zconf_mdsnid);
264 nal = ptl_name2nal("tcp");
266 CERROR("Can't parse NAL tcp\n");
269 LCFG_INIT(lcfg, LCFG_ADD_UUID, NULL);
271 lcfg.lcfg_inllen1 = strlen(peer) + 1;
272 lcfg.lcfg_inlbuf1 = peer;
274 err = class_process_config(&lcfg);
278 LCFG_INIT(lcfg, LCFG_ATTACH, name);
279 lcfg.lcfg_inlbuf1 = "mdc";
280 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
281 lcfg.lcfg_inlbuf2 = mdc_uuid.uuid;
282 lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
283 err = class_process_config(&lcfg);
285 GOTO(out_del_uuid, err);
287 LCFG_INIT(lcfg, LCFG_SETUP, name);
288 lcfg.lcfg_inlbuf1 = g_zconf_mdsname;
289 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
290 lcfg.lcfg_inlbuf2 = peer;
291 lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
292 err = class_process_config(&lcfg);
294 GOTO(out_detach, err);
296 obd = class_name2obd(name);
298 GOTO(out_cleanup, err = -EINVAL);
300 err = obd_connect(&mdc_conn, obd, &mdc_uuid);
302 CERROR("cannot connect to %s: rc = %d\n",
303 g_zconf_mdsname, err);
304 GOTO(out_cleanup, err);
307 exp = class_conn2export(&mdc_conn);
309 ctxt = exp->exp_obd->obd_llog_ctxt[LLOG_CONFIG_REPL_CTXT];
310 rc = class_config_parse_llog(ctxt, g_zconf_profile, cfg);
312 CERROR("class_config_parse_llog failed: rc = %d\n", rc);
315 err = obd_disconnect(exp, 0);
318 LCFG_INIT(lcfg, LCFG_CLEANUP, name);
319 err = class_process_config(&lcfg);
324 LCFG_INIT(lcfg, LCFG_DETACH, name);
325 err = class_process_config(&lcfg);
330 LCFG_INIT(lcfg, LCFG_DEL_UUID, name);
331 lcfg.lcfg_inllen1 = strlen(peer) + 1;
332 lcfg.lcfg_inlbuf1 = peer;
333 err = class_process_config(&lcfg);
342 static void sighandler_USR1(int signum)
347 /* parse host:/mdsname/profile string */
348 int ll_parse_mount_target(const char *target, char **mdsnid,
349 char **mdsname, char **profile)
351 static char buf[256];
355 strncpy(buf, target, 255);
357 if ((s = strchr(buf, ':'))) {
364 if ((s = strchr(*mdsname, '/'))) {
375 #define ENV_LUSTRE_MNTPNT "LIBLUSTRE_MOUNT_POINT"
376 #define ENV_LUSTRE_MNTTGT "LIBLUSTRE_MOUNT_TARGET"
377 #define ENV_LUSTRE_DUMPFILE "LIBLUSTRE_DUMPFILE"
379 extern int _sysio_native_init();
381 /* global variables */
382 int g_zconf = 0; /* zeroconf or dumpfile */
383 char *g_zconf_mdsname = NULL; /* mdsname, for zeroconf */
384 char *g_zconf_mdsnid = NULL; /* mdsnid, for zeroconf */
385 char *g_zconf_profile = NULL; /* profile, for zeroconf */
388 void __liblustre_setup_(void)
390 char *lustre_path = NULL;
392 char *dumpfile = NULL;
393 char *root_driver = "native";
394 char *lustre_driver = "llite";
395 char *root_path = "/";
396 unsigned mntflgs = 0;
402 signal(SIGUSR1, sighandler_USR1);
404 lustre_path = getenv(ENV_LUSTRE_MNTPNT);
406 lustre_path = "/mnt/lustre";
409 target = getenv(ENV_LUSTRE_MNTTGT);
411 dumpfile = getenv(ENV_LUSTRE_DUMPFILE);
413 CERROR("Neither mount target, nor dumpfile\n");
417 printf("LibLustre: mount point %s, dumpfile %s\n",
418 lustre_path, dumpfile);
420 if (ll_parse_mount_target(target,
424 CERROR("mal-formed target %s \n", target);
428 printf("LibLustre: mount point %s, target %s\n",
429 lustre_path, target);
432 if (_sysio_init() != 0) {
433 perror("init sysio");
437 /* cygwin don't need native driver */
439 _sysio_native_init();
442 err = _sysio_mount_root(root_path, root_driver, mntflgs, NULL);
450 portal_subsystem_debug = 0;
452 err = lllib_init(dumpfile);
454 perror("init llite driver");
458 err = mount("/", lustre_path, lustre_driver, mntflgs, NULL);
461 perror(lustre_driver);
466 __sysio_hook_sys_enter = llu_check_request;
467 __sysio_hook_sys_leave = NULL;
471 void __liblustre_cleanup_(void)