]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] gendisk for nbd
authorAlexander Viro <viro@math.psu.edu>
Sat, 21 Sep 2002 09:51:50 +0000 (02:51 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sat, 21 Sep 2002 09:51:50 +0000 (02:51 -0700)
nbd switched to use of gendisk

drivers/block/nbd.c
include/linux/nbd.h

index eaa59c9a683d8e111307361ca6900961f7e2fb35..12902c6de2b9f85604f7e6d354bf28d0a1e8bea5 100644 (file)
@@ -59,8 +59,8 @@
 
 static int nbd_blksizes[MAX_NBD];
 static int nbd_blksize_bits[MAX_NBD];
-static int nbd_sizes[MAX_NBD];
 static u64 nbd_bytesizes[MAX_NBD];
+static char nbd_names[MAX_NBD][7];
 
 static struct nbd_device nbd_dev[MAX_NBD];
 static devfs_handle_t devfs_handle;
@@ -78,11 +78,7 @@ static int requests_out;
 
 static int nbd_open(struct inode *inode, struct file *file)
 {
-       int dev;
-
-       if (!inode)
-               return -EINVAL;
-       dev = minor(inode->i_rdev);
+       int dev = minor(inode->i_rdev);
        if (dev >= MAX_NBD)
                return -ENODEV;
 
@@ -387,21 +383,15 @@ static void do_nbd_request(request_queue_t * q)
 static int nbd_ioctl(struct inode *inode, struct file *file,
                     unsigned int cmd, unsigned long arg)
 {
-       struct nbd_device *lo;
-       int dev, error, temp;
+       int dev = minor(inode->i_rdev);
+       struct nbd_device *lo = &nbd_dev[dev];
+       int error, temp;
        struct request sreq ;
 
        /* Anyone capable of this syscall can do *real bad* things */
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
-       if (!inode)
-               return -EINVAL;
-       dev = minor(inode->i_rdev);
-       if (dev >= MAX_NBD)
-               return -ENODEV;
-
-       lo = &nbd_dev[dev];
        switch (cmd) {
        case NBD_DISCONNECT:
                printk(KERN_INFO "NBD_DISCONNECT\n");
@@ -455,15 +445,15 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
                        temp >>= 1;
                }
                nbd_bytesizes[dev] &= ~(nbd_blksizes[dev]-1); 
-               nbd_sizes[dev] = nbd_bytesizes[dev] >> BLOCK_SIZE_BITS;
+               set_capacity(&lo->disk, nbd_bytesizes[dev] >> 9);
                return 0;
        case NBD_SET_SIZE:
                nbd_bytesizes[dev] = arg & ~(nbd_blksizes[dev]-1); 
-               nbd_sizes[dev] = nbd_bytesizes[dev] >> BLOCK_SIZE_BITS;
+               set_capacity(&lo->disk, nbd_bytesizes[dev] >> 9);
                return 0;
        case NBD_SET_SIZE_BLOCKS:
                nbd_bytesizes[dev] = ((u64) arg) << nbd_blksize_bits[dev]; 
-               nbd_sizes[dev] = nbd_bytesizes[dev] >> BLOCK_SIZE_BITS;
+               set_capacity(&lo->disk, nbd_bytesizes[dev] >> 9);
                return 0;
        case NBD_DO_IT:
                if (!lo->file)
@@ -479,25 +469,14 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
                       dev, lo->queue_head.next, lo->queue_head.prev, requests_in, requests_out);
                return 0;
 #endif
-       case BLKGETSIZE:
-               return put_user(nbd_bytesizes[dev] >> 9, (unsigned long *) arg);
-       case BLKGETSIZE64:
-               return put_user((u64)nbd_bytesizes[dev], (u64 *) arg);
        }
        return -EINVAL;
 }
 
 static int nbd_release(struct inode *inode, struct file *file)
 {
-       struct nbd_device *lo;
-       int dev;
-
-       if (!inode)
-               return -ENODEV;
-       dev = minor(inode->i_rdev);
-       if (dev >= MAX_NBD)
-               return -ENODEV;
-       lo = &nbd_dev[dev];
+       int dev = minor(inode->i_rdev);
+       struct nbd_device *lo = &nbd_dev[dev];
        if (lo->refcnt <= 0)
                printk(KERN_ALERT "nbd_release: refcount(%d) <= 0\n", lo->refcnt);
        lo->refcnt--;
@@ -535,9 +514,9 @@ static int __init nbd_init(void)
 #ifdef MODULE
        printk("nbd: registered device at major %d\n", MAJOR_NR);
 #endif
-       blk_size[MAJOR_NR] = nbd_sizes;
        blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), do_nbd_request, &nbd_lock);
        for (i = 0; i < MAX_NBD; i++) {
+               struct gendisk *disk = &nbd_dev[i].disk;
                nbd_dev[i].refcnt = 0;
                nbd_dev[i].file = NULL;
                nbd_dev[i].magic = LO_MAGIC;
@@ -548,9 +527,14 @@ static int __init nbd_init(void)
                nbd_blksizes[i] = 1024;
                nbd_blksize_bits[i] = 10;
                nbd_bytesizes[i] = 0x7ffffc00; /* 2GB */
-               nbd_sizes[i] = nbd_bytesizes[i] >> BLOCK_SIZE_BITS;
-               register_disk(NULL, mk_kdev(MAJOR_NR,i), 1, &nbd_fops,
-                               nbd_bytesizes[i]>>9);
+               disk->major = MAJOR_NR;
+               disk->first_minor = i;
+               disk->minor_shift = 0;
+               disk->fops = &nbd_fops;
+               sprintf(nbd_names[i], "nbd%d", i);
+               disk->major_name = nbd_names[i];
+               set_capacity(disk, 0x3ffffe);
+               add_disk(disk);
        }
        devfs_handle = devfs_mk_dir (NULL, "nbd", NULL);
        devfs_register_series (devfs_handle, "%u", MAX_NBD,
@@ -563,6 +547,9 @@ static int __init nbd_init(void)
 
 static void __exit nbd_cleanup(void)
 {
+       int i;
+       for (i = 0; i < MAX_NBD; i++)
+               del_gendisk(&nbd_dev[i].disk);
        devfs_unregister (devfs_handle);
        blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
 
index d2e9309f1a7614b91ca20f312ee62dd377bb02e8..8e4b8c236e8b3e64e0e82f8f94bf3ce40f8d23a2 100644 (file)
@@ -79,6 +79,7 @@ struct nbd_device {
        spinlock_t queue_lock;
        struct list_head queue_head;    /* Requests are added here...                   */
        struct semaphore tx_lock;
+       struct gendisk disk;
 };
 #endif