]> git.hungrycats.org Git - linux/commitdiff
[PATCH] gendisk for mtdblock_ro
authorAlexander Viro <viro@math.psu.edu>
Sat, 21 Sep 2002 09:42:40 +0000 (02:42 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sat, 21 Sep 2002 09:42:40 +0000 (02:42 -0700)
mtdblock_ro switched to use of gendisk, both mtdblock.c and mtdblock_ro.c
slightly cleaned up.

drivers/mtd/mtdblock.c
drivers/mtd/mtdblock_ro.c

index 401eee6729af6f6985d6a8cdfdaa56681c7477fe..91d8aa2ccc7bc953537a9fdbfad4fa32326f65c3 100644 (file)
@@ -490,13 +490,7 @@ int mtdblock_thread(void *dummy)
        return 0;
 }
 
-#if LINUX_VERSION_CODE < 0x20300
-#define RQFUNC_ARG void
-#else
-#define RQFUNC_ARG request_queue_t *q
-#endif
-
-static void mtdblock_request(RQFUNC_ARG)
+static void mtdblock_request(request_queue *q)
 {
        /* Don't do anything, except wake the thread if necessary */
        wake_up(&thr_wq);
@@ -522,10 +516,8 @@ static int mtdblock_ioctl(struct inode * inode, struct file * file,
                return put_user((u64)mtdblk->mtd->size, (u64 *)arg);
                
        case BLKFLSBUF:
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
                if(!capable(CAP_SYS_ADMIN))
                        return -EACCES;
-#endif
                fsync_bdev(inode->i_bdev);
                invalidate_bdev(inode->i_bdev, 0);
                down(&mtdblk->cache_sem);
@@ -540,16 +532,6 @@ static int mtdblock_ioctl(struct inode * inode, struct file * file,
        }
 }
 
-#if LINUX_VERSION_CODE < 0x20326
-static struct file_operations mtd_fops =
-{
-       open: mtdblock_open,
-       ioctl: mtdblock_ioctl,
-       release: mtdblock_release,
-       read: block_read,
-       write: block_write
-};
-#else
 static struct block_device_operations mtd_fops = 
 {
        owner: THIS_MODULE,
@@ -557,7 +539,6 @@ static struct block_device_operations mtd_fops =
        release: mtdblock_release,
        ioctl: mtdblock_ioctl
 };
-#endif
 
 #ifdef CONFIG_DEVFS_FS
 /* Notification that a new device has been added. Create the devfs entry for
index 72482560b696b0f8150f64b1aa5811d0f11d5032..9b75ccc07f35d01c6d3a914c6f0648dbb7608da6 100644 (file)
 #define DEVICE_NR(device) (device)
 #include <linux/blk.h>
 
-#if LINUX_VERSION_CODE < 0x20300
-#define RQFUNC_ARG void
-#define blkdev_dequeue_request(req) do {CURRENT = req->next;} while (0)
-#else
 #define RQFUNC_ARG request_queue_t *q
-#endif
 
 #ifdef MTDBLOCK_DEBUG
 static int debug = MTDBLOCK_DEBUG;
 MODULE_PARM(debug, "i");
 #endif
 
-
-static int mtd_sizes[MAX_MTD_DEVICES];
-
+static struct gendisk mtd_disks[MAX_MTD_DEVICES];
+static char names names[MAX_MTD_DEVICES][11];
 
 static int mtdblock_open(struct inode *inode, struct file *file)
 {
        struct mtd_info *mtd = NULL;
-
-       int dev;
+       int dev = minor(inode->i_rdev);
+       struct gendisk *disk = mtd_disks + dev;
 
        DEBUG(1,"mtdblock_open\n");
-       
-       if (inode == 0)
-               return -EINVAL;
-       
-       dev = minor(inode->i_rdev);
-       
+
        mtd = get_mtd_device(NULL, dev);
        if (!mtd)
                return -EINVAL;
@@ -59,7 +48,10 @@ static int mtdblock_open(struct inode *inode, struct file *file)
                return -EINVAL;
        }
 
-       mtd_sizes[dev] = mtd->size>>9;
+       set_capacit(disk, mtd->size>>9);
+       add_gendisk(disk);
+       register_disk(disk, mk_kdev(disk->major, disk->first_minor),
+                       1<<disk->minor_shift, disk->fops, get_capacity(disk));
 
        DEBUG(1, "ok\n");
 
@@ -83,6 +75,8 @@ static release_t mtdblock_release(struct inode *inode, struct file *file)
                printk(KERN_WARNING "MTD device is absent on mtd_release!\n");
                release_return(-ENODEV);
        }
+
+       del_gendisk(mtd_disks + dev);
        
        if (mtd->sync)
                mtd->sync(mtd);
@@ -143,12 +137,10 @@ static void mtdblock_request(RQFUNC_ARG)
       
       /* Remove the request we are handling from the request list so nobody messes
          with it */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
       /* Now drop the lock that the ll_rw_blk functions grabbed for us
          and process the request. This is necessary due to the extreme time
          we spend processing it. */
       spin_unlock_irq(&io_request_lock);
-#endif
 
       // Handle the request
       switch (current_request->cmd)
@@ -193,9 +185,7 @@ static void mtdblock_request(RQFUNC_ARG)
       }
 
       // Grab the lock and re-thread the item onto the linked list
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
        spin_lock_irq(&io_request_lock);
-#endif
        mtdblock_end_request(current_request, res);
    }
 }
@@ -209,47 +199,25 @@ static int mtdblock_ioctl(struct inode * inode, struct file * file,
 
        mtd = __get_mtd_device(NULL, minor(inode->i_rdev));
 
-       if (!mtd) return -EINVAL;
-
-       switch (cmd) {
-       case BLKGETSIZE:   /* Return device size */
-               return put_user((mtd->size >> 9), (unsigned long *) arg);
-       case BLKGETSIZE64:
-               return put_user((u64)mtd->size, (u64 *)arg);
-               
-       case BLKFLSBUF:
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
-               if(!capable(CAP_SYS_ADMIN))  return -EACCES;
-#endif
-               fsync_bdev(inode->i_bdev);
-               invalidate_bdev(inode->i_bdev, 0);
-               if (mtd->sync)
-                       mtd->sync(mtd);
-               return 0;
-
-       default:
-               return -ENOTTY;
-       }
+       if (!mtd || cmd != BLKFLSBUF)
+               return -EINVAL;
+
+       if(!capable(CAP_SYS_ADMIN))
+               return -EACCES;
+       fsync_bdev(inode->i_bdev);
+       invalidate_bdev(inode->i_bdev, 0);
+       if (mtd->sync)
+               mtd->sync(mtd);
+       return 0;
 }
 
-#if LINUX_VERSION_CODE < 0x20326
-static struct file_operations mtd_fops =
-{
-       open: mtdblock_open,
-       ioctl: mtdblock_ioctl,
-       release: mtdblock_release,
-       read: block_read,
-       write: block_write
-};
-#else
 static struct block_device_operations mtd_fops = 
 {
-       owner: THIS_MODULE,
-       open: mtdblock_open,
-       release: mtdblock_release,
-       ioctl: mtdblock_ioctl
+       .owner          = THIS_MODULE,
+       .open           = mtdblock_open,
+       .release        = mtdblock_release,
+       .ioctl          = mtdblock_ioctl
 };
-#endif
 
 int __init init_mtdblock(void)
 {
@@ -260,16 +228,17 @@ int __init init_mtdblock(void)
                       MTD_BLOCK_MAJOR);
                return -EAGAIN;
        }
-       
-       /* We fill it in at open() time. */
-       for (i=0; i< MAX_MTD_DEVICES; i++) {
-               mtd_sizes[i] = 0;
-       }
-       
-       /* Allow the block size to default to BLOCK_SIZE. */
-       blk_size[MAJOR_NR] = mtd_sizes;
-       
+
        blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), &mtdblock_request);
+
+       for (i = 0; i < MAX_MTD_DEVICES; i++) {
+               struct gendisk *disk = mtd_disks + i;
+               disk->major = MAJOR_NR;
+               disk->first_minor = i;
+               sprintf(names[i], "mtdblock%d", i);
+               disk->major_name = names[i];
+               disk->fops = &mtd_fops;
+       }
        return 0;
 }