RETURN(0);
}
+static int obd_class_name2dev(char *name)
+{
+ int res = -1;
+ int i;
+
+ for (i=0; i < MAX_OBD_DEVICES; i++) {
+ struct obd_device *obd = &obd_dev[i];
+ if (obd->obd_name &&
+ strcmp(name, obd->obd_name) == 0) {
+ res = i;
+ return res;
+ }
+ }
+
+ return res;
+}
+
/*
* support functions: we could use inter-module communication, but this
* is more portable to other OS's
RETURN(0);
}
+ case OBD_IOC_NAME2DEV: {
+ int dev;
+ if (!data->ioc_inlbuf1) {
+ CERROR("No name passed!\n");
+ RETURN(-EINVAL);
+ }
+ CDEBUG(D_IOCTL, "device name %s\n", data->ioc_inlbuf1);
+ dev = obd_class_name2dev(data->ioc_inlbuf1);
+ data->ioc_dev= dev;
+ if (dev == -1) {
+ CERROR("No device for name %s!\n", data->ioc_inlbuf1);
+ RETURN(-EINVAL);
+ }
+
+ CDEBUG(D_IOCTL, "device name %s, dev %d\n", data->ioc_inlbuf1,
+ dev);
+ filp->private_data = &obd_dev[data->ioc_dev];
+ err = copy_to_user((int *)arg, data, sizeof(*data));
+ RETURN(err);
+ }
+
case OBD_IOC_ATTACH: {
struct obd_type *type;
/* do the attach */
if (OBT(obd) && OBP(obd, attach))
- err = OBP(obd, attach)(obd, sizeof(*data), data);
-
+ err = OBP(obd,attach)(obd, sizeof(*data), data);
if (err) {
obd->obd_type = NULL;
} else {
obd->obd_minor, data->ioc_inlbuf1);
obd->obd_proc_entry =
proc_lustre_register_obd_device(obd);
+ if (data->ioc_inlbuf2) {
+ int len = strlen(data->ioc_inlbuf2);
+ OBD_ALLOC(obd->obd_name, len + 1);
+ if (!obd->obd_name) {
+ CERROR("no memory\n");
+ LBUG();
+ }
+ memcpy(obd->obd_name, data->ioc_inlbuf2, len+1);
+ }
+
MOD_INC_USE_COUNT;
}
obd->obd_minor);
RETURN(-EBUSY);
}
+
+ if (obd->obd_name) {
+ OBD_FREE(obd->obd_name, strlen(obd->obd_name)+ 1);
+ obd->obd_name = NULL;
+ }
if (obd->obd_proc_entry)
proc_lustre_release_obd_device(obd);
return func;
}
-#define difftime(a, b) \
+#define difftime(a, b) \
((double)(a)->tv_sec - (b)->tv_sec + \
((double)((a)->tv_usec - (b)->tv_usec) / 1000000))
IOCINIT(data);
if (argc != 2 && argc != 3) {
- fprintf(stderr, "usage: %s type [data]\n", cmdname(argv[0]));
+ fprintf(stderr, "usage: %s type [name [uuid]]\n", cmdname(argv[0]));
return -1;
}
return rc;
}
+static int jt_name2dev(int argc, char **argv)
+{
+ struct obd_ioctl_data data;
+ int rc;
+
+ IOCINIT(data);
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s name\n", cmdname(argv[0]));
+ return -1;
+ }
+
+ data.ioc_inllen1 = strlen(argv[1]) + 1;
+ data.ioc_inlbuf1 = argv[1];
+
+ printf("%s: len %d addr %p name %s\n",
+ cmdname(argv[0]), data.ioc_len, buf,
+ MKSTR(data.ioc_inlbuf1));
+
+ if (obd_ioctl_pack(&data, &buf, max)) {
+ fprintf(stderr, "error: %s: invalid ioctl\n", cmdname(argv[0]));
+ return -2;
+ }
+ printf("%s: len %d addr %p raw %p name %s and %s\n",
+ cmdname(argv[0]), data.ioc_len, buf, rawbuf,
+ MKSTR(data.ioc_inlbuf1), &buf[516]);
+
+ rc = ioctl(fd, OBD_IOC_NAME2DEV , buf);
+ if (rc < 0)
+ fprintf(stderr, "error: %s: %x %s\n", cmdname(argv[0]),
+ OBD_IOC_NAME2DEV, strerror(rc = errno));
+ memcpy((char *)(&data), buf, sizeof(data));
+ printf("device set to %d (name %s)\n", data.ioc_dev, argv[1]);
+
+ return rc;
+}
+
static int jt_setup(int argc, char **argv)
{
struct obd_ioctl_data data;
"--threads <threads> <devno> <command [args ...]>"},
/* Device configuration commands */
- {"device", jt_device, 0, "set current device (args device no)"},
+ {"device", jt_device, 0, "set current device (args device_no name)"},
+ {"name2dev", jt_name2dev, 0, "set device by name (args name)"},
{"attach", jt_attach, 0, "name the type of device (args: type data"},
{"setup", jt_setup, 0, "setup device (args: <blkdev> [data]"},
{"detach", jt_detach, 0, "detach the current device (arg: )"},