#define OBD_IOC_BRW_READ _IOWR('f', 27, long)
#define OBD_IOC_BRW_WRITE _IOWR('f', 28, long)
#define OBD_IOC_NAME2DEV _IOWR('f', 29, long)
+#define OBD_IOC_NEWDEV _IOWR('f', 30, long)
#define OBD_IOC_DEC_FS_USE_COUNT _IO ('f', 32 )
int (*o_cleanup)(struct obd_device *dev);
int (*o_connect)(struct obd_conn *conn);
int (*o_disconnect)(struct obd_conn *conn);
+
+
int (*o_statfs)(struct obd_conn *conn, struct statfs *statfs);
int (*o_preallocate)(struct obd_conn *, obd_count *req, obd_id *ids);
int (*o_create)(struct obd_conn *conn, struct obdo *oa);
memset(buf, 0, sizeof(buf));
if (!obd && cmd != OBD_IOC_DEVICE && cmd != TCGETS
- && cmd != OBD_IOC_NAME2DEV) {
+ && cmd != OBD_IOC_NAME2DEV && cmd != OBD_IOC_NEWDEV) {
CERROR("OBD ioctl: No device\n");
RETURN(-EINVAL);
}
RETURN(err);
}
+ case OBD_IOC_NEWDEV: {
+ int dev = -1;
+ int i;
+
+ filp->private_data = NULL;
+ for (i = 0 ; i < MAX_OBD_DEVICES ; i++) {
+ struct obd_device *obd = &obd_dev[i];
+ if (!obd->obd_type) {
+ filp->private_data = obd;
+ dev = i;
+ break;
+ }
+ }
+
+
+ data->ioc_dev = dev;
+ if (dev == -1)
+ RETURN(-EINVAL);
+
+ err = copy_to_user((int *)arg, data, sizeof(*data));
+ RETURN(err);
+ }
+
case OBD_IOC_ATTACH: {
struct obd_type *type;
return strdup(buf);
}
+int getfd()
+{
+ if (fd == -1)
+ fd = open("/dev/obd", O_RDWR);
+ if (fd == -1) {
+ fprintf(stderr, "error: opening /dev/obd: %s\n",
+ strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+
static char *cmdname(char *func)
{
static char buf[512];
return rc;
}
+static int jt_newdev(int argc, char **argv)
+{
+ struct obd_ioctl_data data;
+ int rc;
+
+ if (getfd())
+ return -1;
+
+ IOCINIT(data);
+
+ if (argc != 1) {
+ fprintf(stderr, "usage: %s\n", cmdname(argv[0]));
+ return -1;
+ }
+
+ rc = ioctl(fd, OBD_IOC_NEWDEV , &data);
+ if (rc < 0)
+ fprintf(stderr, "error: %s: %s\n", cmdname(argv[0]),
+ strerror(rc=errno));
+ else {
+ printf("Current device set to %d\n", data.ioc_dev);
+ }
+
+ return rc;
+}
+
static int jt_attach(int argc, char **argv)
{
struct obd_ioctl_data data;
struct obd_ioctl_data data;
int rc;
- if (fd == -1)
- fd = open("/dev/obd", O_RDWR);
- if (fd == -1) {
- fprintf(stderr, "error: %s: opening /dev/obd: %s\n",
- cmdname(argv[0]), strerror(errno));
- return errno;
- }
+ if (getfd())
+ return -1;
IOCINIT(data);
"--threads <threads> <devno> <command [args ...]>"},
/* Device configuration commands */
+ {"newdev", jt_newdev, 0, "set device to a new unused obd (no args)"},
{"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"},