bsg: bind bsg to request_queue instead of gendisk
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Mon, 9 Jul 2007 10:40:35 +0000 (12:40 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Mon, 16 Jul 2007 06:52:46 +0000 (08:52 +0200)
This patch binds bsg devices to request_queue instead of gendisk. Any
objects (like transport entities) can define own request_handler and
create own bsg device.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/bsg.c
block/ll_rw_blk.c
include/linux/blkdev.h
include/linux/bsg.h
include/linux/genhd.h

index 0427ece9b6d89c1915453025771cec8a4ac89eff..4ea4bedb413fd8bf19ffe0e280f3deda7d25b0dd 100644 (file)
@@ -34,7 +34,6 @@
 static char bsg_version[] = "block layer sg (bsg) 0.4";
 
 struct bsg_device {
-       struct gendisk *disk;
        request_queue_t *queue;
        spinlock_t lock;
        struct list_head busy_list;
@@ -46,7 +45,7 @@ struct bsg_device {
        int done_cmds;
        wait_queue_head_t wq_done;
        wait_queue_head_t wq_free;
-       char name[BDEVNAME_SIZE];
+       char name[BUS_ID_SIZE];
        int max_queue;
        unsigned long flags;
 };
@@ -375,7 +374,7 @@ static void bsg_add_command(struct bsg_device *bd, request_queue_t *q,
        dprintk("%s: queueing rq %p, bc %p\n", bd->name, rq, bc);
 
        rq->end_io_data = bc;
-       blk_execute_rq_nowait(q, bd->disk, rq, 1, bsg_rq_end_io);
+       blk_execute_rq_nowait(q, NULL, rq, 1, bsg_rq_end_io);
 }
 
 static inline struct bsg_command *bsg_next_done_cmd(struct bsg_device *bd)
@@ -741,7 +740,7 @@ out:
 }
 
 static struct bsg_device *bsg_add_device(struct inode *inode,
-                                        struct gendisk *disk,
+                                        struct request_queue *rq,
                                         struct file *file)
 {
        struct bsg_device *bd = NULL;
@@ -753,17 +752,16 @@ static struct bsg_device *bsg_add_device(struct inode *inode,
        if (!bd)
                return ERR_PTR(-ENOMEM);
 
-       bd->disk = disk;
-       bd->queue = disk->queue;
-       kobject_get(&disk->queue->kobj);
+       bd->queue = rq;
+       kobject_get(&rq->kobj);
        bsg_set_block(bd, file);
 
        atomic_set(&bd->ref_count, 1);
        bd->minor = iminor(inode);
        mutex_lock(&bsg_mutex);
-       hlist_add_head(&bd->dev_list,&bsg_device_list[bsg_list_idx(bd->minor)]);
+       hlist_add_head(&bd->dev_list, &bsg_device_list[bsg_list_idx(bd->minor)]);
 
-       strncpy(bd->name, disk->disk_name, sizeof(bd->name) - 1);
+       strncpy(bd->name, rq->bsg_dev.class_dev->class_id, sizeof(bd->name) - 1);
        dprintk("bound to <%s>, max queue %d\n",
                format_dev_t(buf, inode->i_rdev), bd->max_queue);
 
@@ -817,7 +815,7 @@ static struct bsg_device *bsg_get_device(struct inode *inode, struct file *file)
        if (!bcd)
                return ERR_PTR(-ENODEV);
 
-       return bsg_add_device(inode, bcd->disk, file);
+       return bsg_add_device(inode, bcd->queue, file);
 }
 
 static int bsg_open(struct inode *inode, struct file *file)
@@ -900,7 +898,7 @@ bsg_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
        case SG_EMULATED_HOST:
        case SCSI_IOCTL_SEND_COMMAND: {
                void __user *uarg = (void __user *) arg;
-               return scsi_cmd_ioctl(file, bd->queue, bd->disk, cmd, uarg);
+               return scsi_cmd_ioctl(file, bd->queue, NULL, cmd, uarg);
        }
        case SG_IO: {
                struct request *rq;
@@ -915,7 +913,7 @@ bsg_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                        return PTR_ERR(rq);
 
                bio = rq->bio;
-               blk_execute_rq(bd->queue, bd->disk, rq, 0);
+               blk_execute_rq(bd->queue, NULL, rq, 0);
                blk_complete_sgv4_hdr_rq(rq, &hdr, bio);
 
                if (copy_to_user(uarg, &hdr, sizeof(hdr)))
@@ -945,24 +943,23 @@ static struct file_operations bsg_fops = {
        .owner          =       THIS_MODULE,
 };
 
-void bsg_unregister_disk(struct gendisk *disk)
+void bsg_unregister_queue(struct request_queue *q)
 {
-       struct bsg_class_device *bcd = &disk->bsg_dev;
+       struct bsg_class_device *bcd = &q->bsg_dev;
 
        if (!bcd->class_dev)
                return;
 
        mutex_lock(&bsg_mutex);
-       sysfs_remove_link(&bcd->disk->queue->kobj, "bsg");
+       sysfs_remove_link(&q->kobj, "bsg");
        class_device_destroy(bsg_class, MKDEV(BSG_MAJOR, bcd->minor));
        bcd->class_dev = NULL;
        list_del_init(&bcd->list);
        mutex_unlock(&bsg_mutex);
 }
 
-int bsg_register_disk(struct gendisk *disk)
+int bsg_register_queue(struct request_queue *q, char *name)
 {
-       request_queue_t *q = disk->queue;
        struct bsg_class_device *bcd;
        dev_t dev;
 
@@ -972,7 +969,7 @@ int bsg_register_disk(struct gendisk *disk)
        if (!q->request_fn)
                return 0;
 
-       bcd = &disk->bsg_dev;
+       bcd = &q->bsg_dev;
        memset(bcd, 0, sizeof(*bcd));
        INIT_LIST_HEAD(&bcd->list);
 
@@ -980,8 +977,8 @@ int bsg_register_disk(struct gendisk *disk)
        dev = MKDEV(BSG_MAJOR, bsg_device_nr);
        bcd->minor = bsg_device_nr;
        bsg_device_nr++;
-       bcd->disk = disk;
-       bcd->class_dev = class_device_create(bsg_class, NULL, dev, bcd->dev, "%s", disk->disk_name);
+       bcd->queue = q;
+       bcd->class_dev = class_device_create(bsg_class, NULL, dev, bcd->dev, "%s", name);
        if (!bcd->class_dev)
                goto err;
        list_add_tail(&bcd->list, &bsg_class_list);
index 3795e0708a229b9641d2c70354b81e641dc3853b..74a5498c29a10c26ee807ee4f7e236c716480d97 100644 (file)
@@ -4091,7 +4091,7 @@ int blk_register_queue(struct gendisk *disk)
                return ret;
        }
 
-       ret = bsg_register_disk(disk);
+       ret = bsg_register_queue(q, disk->disk_name);
        if (ret) {
                elv_unregister_queue(q);
                kobject_unregister(&q->kobj);
@@ -4106,7 +4106,7 @@ void blk_unregister_queue(struct gendisk *disk)
        request_queue_t *q = disk->queue;
 
        if (q && q->request_fn) {
-               bsg_unregister_disk(disk);
+               bsg_unregister_queue(q);
                elv_unregister_queue(q);
 
                kobject_uevent(&q->kobj, KOBJ_REMOVE);
index 2746632c22678a4d590f7034c8f03053720d8b6c..24b474e05a4457ffe6fa518d706d40a24921db13 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/bio.h>
 #include <linux/module.h>
 #include <linux/stringify.h>
+#include <linux/bsg.h>
 
 #include <asm/scatterlist.h>
 
@@ -470,6 +471,10 @@ struct request_queue
        unsigned int            bi_size;
 
        struct mutex            sysfs_lock;
+
+#if defined(CONFIG_BLK_DEV_BSG)
+       struct bsg_class_device bsg_dev;
+#endif
 };
 
 #define QUEUE_FLAG_CLUSTER     0       /* cluster several segments into 1 */
index 2154a6dfbd536f70b1b91aa97bc14e95177a9e07..0475a6d3ff6ad5a28711a23ba046c9552a29f482 100644 (file)
@@ -47,16 +47,16 @@ struct bsg_class_device {
        struct class_device *class_dev;
        struct device *dev;
        int minor;
-       struct gendisk *disk;
        struct list_head list;
+       struct request_queue *queue;
 };
 
-extern int bsg_register_disk(struct gendisk *);
-extern void bsg_unregister_disk(struct gendisk *);
+extern int bsg_register_queue(struct request_queue *, char *);
+extern void bsg_unregister_queue(struct request_queue *);
 #else
 struct bsg_class_device { };
-#define bsg_register_disk(disk)                (0)
-#define bsg_unregister_disk(disk)      do { } while (0)
+#define bsg_register_queue(disk, name)         (0)
+#define bsg_unregister_queue(disk)     do { } while (0)
 #endif
 
 #endif /* __KERNEL__ */
index 8c43d70326127df3d241cd75f2e204d8a809b0f2..9756fc102a83f284a1040386bd076d6acca81cff 100644 (file)
@@ -67,7 +67,6 @@ struct partition {
 #include <linux/string.h>
 #include <linux/fs.h>
 #include <linux/workqueue.h>
-#include <linux/bsg.h>
 
 struct partition {
        unsigned char boot_ind;         /* 0x80 - active */
@@ -92,7 +91,6 @@ struct hd_struct {
 #ifdef CONFIG_FAIL_MAKE_REQUEST
        int make_it_fail;
 #endif
-       struct bsg_class_device bsg_dev;
 };
 
 #define GENHD_FL_REMOVABLE                     1