[Patch] Cleanup struct gendisk registration, 2.3.40-pre1

From: Stephen C. Tweedie (sct@redhat.com)
Date: Thu Jan 13 2000 - 13:30:31 EST


Hi,

The patch below cleans up the struct gendisk handling in the block
device layer for 2.3.40-1. It adds generic [un]register_gendisk
functions, allows the gendisk to be registered automatically during
register_blockdev(), and forces gendisk removal on
unregister_blockdev().

It also adds in a forgotten gendisk registration in the i2o stack.

This code is a prerequisite for the "sard" advanced disk IO accounting
patch, which accumulates disk stats in the gendisk arrays.

--Stephen

----------------------------------------------------------------
--- linux-2.3.39-gendisk/arch/m68k/atari/stram.c.~1~ Thu Jan 13 15:04:51 2000
+++ linux-2.3.39-gendisk/arch/m68k/atari/stram.c Thu Jan 13 15:08:50 2000
@@ -1246,7 +1246,7 @@
         /* swapping not enabled */
         return( -ENXIO );
         
- if (register_blkdev( STRAM_MAJOR, "stram", &stram_fops)) {
+ if (register_blkdev( STRAM_MAJOR, "stram", &stram_fops, NULL)) {
         printk( KERN_ERR "stram: Unable to get major %d\n", STRAM_MAJOR );
         return( -ENXIO );
     }
--- linux-2.3.39-gendisk/drivers/acorn/block/fd1772.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/acorn/block/fd1772.c Thu Jan 13 15:08:50 2000
@@ -1580,7 +1580,7 @@
 {
         int i;
 
- if (register_blkdev(MAJOR_NR, "fd", &floppy_fops)) {
+ if (register_blkdev(MAJOR_NR, "fd", &floppy_fops,NULL)) {
                 printk("Unable to get major %d for floppy\n", MAJOR_NR);
                 return 1;
         }
--- linux-2.3.39-gendisk/drivers/acorn/block/mfmhd.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/acorn/block/mfmhd.c Thu Jan 13 15:08:50 2000
@@ -1421,7 +1421,7 @@
 {
         unsigned char irqmask;
 
- if (register_blkdev(MAJOR_NR, "mfm", &mfm_fops)) {
+ if (register_blkdev(MAJOR_NR, "mfm", &mfm_fops, &mfm_gendisk)) {
                 printk("mfm_init: unable to get major number %d\n", MAJOR_NR);
                 return -1;
         }
@@ -1458,11 +1458,6 @@
 
         blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;
         read_ahead[MAJOR_NR] = 8; /* 8 sector (4kB?) read ahread */
-
-#ifndef MODULE
- mfm_gendisk.next = gendisk_head;
- gendisk_head = &mfm_gendisk;
-#endif
 
         Busy = 0;
         lastspecifieddrive = -1;
--- linux-2.3.39-gendisk/drivers/ap1000/ap.c.~1~ Thu Jan 13 15:04:51 2000
+++ linux-2.3.39-gendisk/drivers/ap1000/ap.c Thu Jan 13 15:08:50 2000
@@ -258,7 +258,7 @@
 
   if (done) return(1);
 
- if (register_blkdev(MAJOR_NR,"apblock",&ap_fops)) {
+ if (register_blkdev(MAJOR_NR,"apblock",&ap_fops,NULL)) {
     printk("ap: unable to get major %d for ap block dev\n",MAJOR_NR);
     return -1;
   }
--- linux-2.3.39-gendisk/drivers/ap1000/ddv.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/ap1000/ddv.c Thu Jan 13 15:08:50 2000
@@ -917,7 +917,7 @@
         
         cid = mpp_cid();
         
- if (register_blkdev(MAJOR_NR,DEVICE_NAME,&ddv_fops)) {
+ if (register_blkdev(MAJOR_NR,DEVICE_NAME,&ddv_fops, &ddv_gendisk)) {
                 printk("ap: unable to get major %d for ap block dev\n",
                        MAJOR_NR);
                 return -1;
@@ -928,8 +928,6 @@
         read_ahead[MAJOR_NR] = DDV_READ_AHEAD;
         
         bif_add_debug_key('d',ddv_status,"DDV status");
- ddv_gendisk.next = gendisk_head;
- gendisk_head = &ddv_gendisk;
 
         num_options = mpp_num_cells();
         this_option = mpp_cid();
@@ -1002,11 +1000,6 @@
         OPT_IO(PRST) = PRST_IRST;
 
         unregister_blkdev( MAJOR_NR, DEVICE_NAME );
- for (gdp = &gendisk_head; *gdp; gdp = &((*gdp)->next))
- if (*gdp == &ddv_gendisk)
- break;
- if (*gdp)
- *gdp = (*gdp)->next;
         free_irq(APOPT0_IRQ, NULL);
         blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
 }
--- linux-2.3.39-gendisk/drivers/block/ataflop.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/block/ataflop.c Thu Jan 13 15:08:57 2000
@@ -1974,7 +1974,7 @@
                 /* Hades doesn't have Atari-compatible floppy */
                 return -ENXIO;
 
- if (register_blkdev(MAJOR_NR,"fd",&floppy_fops)) {
+ if (register_blkdev(MAJOR_NR,"fd",&floppy_fops,NULL)) {
                 printk(KERN_ERR "Unable to get major %d for floppy\n",MAJOR_NR);
                 return -EBUSY;
         }
--- linux-2.3.39-gendisk/drivers/block/blkpg.c.~1~ Wed May 26 17:30:31 1999
+++ linux-2.3.39-gendisk/drivers/block/blkpg.c Thu Jan 13 15:28:03 2000
@@ -55,21 +55,53 @@
  */
 
 /* a linear search, superfluous when dev is a pointer */
-static struct gendisk *get_gendisk(kdev_t dev) {
- struct gendisk *g;
- int m = MAJOR(dev);
+struct gendisk *get_gendisk(int major) {
+ struct gendisk *gd;
+
+ for (gd = gendisk_head; gd; gd = gd->next)
+ if (gd->major == major)
+ break;
+ return gd;
+}
+
+/* Generic function to register a major device's gendisk structure on
+ * the global list. register_blkdev() calls this automatically if given
+ * a non-NULL gendisk. */
+
+void register_gendisk(unsigned int major, struct gendisk *gendisk)
+{
+ if (get_gendisk(major))
+ return;
+ gendisk->major = major;
+ gendisk->next = gendisk_head;
+ gendisk_head = gendisk;
+}
+
+/* Generic function to unregister a major device's gendisk
+ * structure. Called automatically by unregister_blkdev. */
+
+void unregister_gendisk(unsigned int major)
+{
+ struct gendisk *gd, **gdp;
 
- for (g = gendisk_head; g; g = g->next)
- if (g->major == m)
+ for (gdp = &gendisk_head; ; gdp = &(gd->next)) {
+ gd = *gdp;
+ if (!gd)
+ return;
+ if (gd->major == major)
                         break;
- return g;
+ }
+
+ *gdp = gd->next;
+ gd->next = NULL;
 }
 
+
 /* moved here from md.c - will be discarded later */
 char *partition_name (kdev_t dev) {
         static char name[40]; /* kdevname returns 32 bytes */
                                         /* disk_name requires 32 bytes */
- struct gendisk *hd = get_gendisk (dev);
+ struct gendisk *hd = get_gendisk (MAJOR(dev));
 
         if (!hd) {
                 sprintf (name, "[dev %s]", kdevname(dev));
@@ -104,7 +136,7 @@
                 return -EINVAL;
 
         /* find the drive major */
- g = get_gendisk(dev);
+ g = get_gendisk(MAJOR(dev));
         if (!g)
                 return -ENXIO;
 
@@ -154,7 +186,7 @@
         int drive, first_minor, minor;
 
         /* find the drive major */
- g = get_gendisk(dev);
+ g = get_gendisk(MAJOR(dev));
         if (!g)
                 return -ENXIO;
 
@@ -265,7 +297,7 @@
                 case BLKGETSIZE:
                         /* Today get_gendisk() requires a linear scan;
                            add this when dev has pointer type. */
- g = get_gendisk(dev);
+ g = get_gendisk(MAJOR(dev));
                         if (!g)
                                 longval = 0;
                         else
--- linux-2.3.39-gendisk/drivers/block/cpqarray.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/block/cpqarray.c Thu Jan 13 15:08:57 2000
@@ -343,17 +343,6 @@
                 remove_proc_entry(hba[i]->devname, proc_array);
                 kfree(hba[i]->cmd_pool);
                 kfree(hba[i]->cmd_pool_bits);
-
- if (gendisk_head == &ida_gendisk[i]) {
- gendisk_head = ida_gendisk[i].next;
- } else {
- for(g=gendisk_head; g; g=g->next) {
- if (g->next == &ida_gendisk[i]) {
- g->next = ida_gendisk[i].next;
- break;
- }
- }
- }
         }
 
         kfree(ida);
@@ -422,7 +411,7 @@
                                 hba[i]->intr, hba[i]->devname);
                         continue;
                 }
- if (register_blkdev(MAJOR_NR+i, hba[i]->devname, &ida_fops)) {
+ if (register_blkdev(MAJOR_NR+i, hba[i]->devname, &ida_fops, NULL)) {
                         printk("Unable to get major number %d for ida\n",
                                 MAJOR_NR+i);
                         continue;
@@ -478,8 +467,7 @@
                 read_ahead[MAJOR_NR+i] = READ_AHEAD;
 
                 /* Get on the disk list */
- ida_gendisk[i].next = gendisk_head;
- gendisk_head = &ida_gendisk[i];
+ register_gendisk(MAJOR_NR + i, &ida_gendisk[i]);
 
                 init_timer(&hba[i]->timer);
                 hba[i]->timer.expires = jiffies + IDA_TIMER;
--- linux-2.3.39-gendisk/drivers/block/DAC960.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/block/DAC960.c Thu Jan 13 15:08:57 2000
@@ -1027,7 +1027,7 @@
   /*
     Register the Block Device Major Number for this DAC960 Controller.
   */
- if (register_blkdev(MajorNumber, "rd", &DAC960_FileOperations) < 0)
+ if (register_blkdev(MajorNumber, "rd", &DAC960_FileOperations, NULL) < 0)
     {
       DAC960_Error("UNABLE TO ACQUIRE MAJOR NUMBER %d - DETACHING\n",
                    Controller, MajorNumber);
@@ -1074,13 +1074,7 @@
   /*
     Install the Generic Disk Information structure at the end of the list.
   */
- if ((GenericDiskInfo = gendisk_head) != NULL)
- {
- while (GenericDiskInfo->next != NULL)
- GenericDiskInfo = GenericDiskInfo->next;
- GenericDiskInfo->next = &Controller->GenericDiskInfo;
- }
- else gendisk_head = &Controller->GenericDiskInfo;
+ register_gendisk(MajorNumber, &Controller->GenericDiskInfo);
   /*
     Indicate the Block Device Registration completed successfully,
   */
@@ -1114,19 +1108,6 @@
   blksize_size[MajorNumber] = NULL;
   max_sectors[MajorNumber] = NULL;
   max_segments[MajorNumber] = NULL;
- /*
- Remove the Generic Disk Information structure from the list.
- */
- if (gendisk_head != &Controller->GenericDiskInfo)
- {
- GenericDiskInfo_T *GenericDiskInfo = gendisk_head;
- while (GenericDiskInfo != NULL &&
- GenericDiskInfo->next != &Controller->GenericDiskInfo)
- GenericDiskInfo = GenericDiskInfo->next;
- if (GenericDiskInfo != NULL)
- GenericDiskInfo->next = GenericDiskInfo->next->next;
- }
- else gendisk_head = Controller->GenericDiskInfo.next;
 }
 
 
--- linux-2.3.39-gendisk/drivers/block/floppy.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/block/floppy.c Thu Jan 13 15:08:57 2000
@@ -4053,7 +4053,7 @@
 
         raw_cmd = 0;
 
- if (register_blkdev(MAJOR_NR,"fd",&floppy_fops)) {
+ if (register_blkdev(MAJOR_NR,"fd",&floppy_fops,NULL)) {
                 printk("Unable to get major %d for floppy\n",MAJOR_NR);
                 return -EBUSY;
         }
--- linux-2.3.39-gendisk/drivers/block/hd.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/block/hd.c Thu Jan 13 15:10:14 2000
@@ -798,14 +798,12 @@
 
 int __init hd_init(void)
 {
- if (register_blkdev(MAJOR_NR,"hd",&hd_fops)) {
+ if (register_blkdev(MAJOR_NR,"hd",&hd_fops,&hd_gendisk)) {
                 printk("hd: unable to get major %d for hard disk\n",MAJOR_NR);
                 return -1;
         }
         blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
         read_ahead[MAJOR_NR] = 8; /* 8 sector (4kB) read-ahead */
- hd_gendisk.next = gendisk_head;
- gendisk_head = &hd_gendisk;
         timer_table[HD_TIMER].fn = hd_times_out;
         return 0;
 }
--- linux-2.3.39-gendisk/drivers/block/ide.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/block/ide.c Thu Jan 13 15:11:28 2000
@@ -1879,7 +1879,7 @@
 
 void ide_unregister (unsigned int index)
 {
- struct gendisk *gd, **gdp;
+ struct gendisk *gd;
         ide_drive_t *drive, *d;
         ide_hwif_t *hwif, *g;
         ide_hwgroup_t *hwgroup;
@@ -1989,6 +1989,7 @@
         /*
          * Remove us from the kernel's knowledge
          */
+ gd = get_gendisk(hwif->major);
         unregister_blkdev(hwif->major, hwif->name);
         kfree(blksize_size[hwif->major]);
         kfree(max_sectors[hwif->major]);
@@ -1997,13 +1998,9 @@
         blk_dev[hwif->major].data = NULL;
         blk_dev[hwif->major].queue = NULL;
         blksize_size[hwif->major] = NULL;
- for (gdp = &gendisk_head; *gdp; gdp = &((*gdp)->next))
- if (*gdp == hwif->gd)
- break;
- if (*gdp == NULL)
+ if (gd == NULL)
                 printk("gd not in disk chain!\n");
         else {
- gd = *gdp; *gdp = gd->next;
                 kfree(gd->sizes);
                 kfree(gd->part);
                 kfree(gd);
--- linux-2.3.39-gendisk/drivers/block/ide-probe.c.~1~ Wed Jan 5 12:06:48 2000
+++ linux-2.3.39-gendisk/drivers/block/ide-probe.c Thu Jan 13 15:08:57 2000
@@ -647,7 +647,7 @@
  */
 static void init_gendisk (ide_hwif_t *hwif)
 {
- struct gendisk *gd, **gdp;
+ struct gendisk *gd;
         unsigned int unit, units, minors;
         int *bs, *max_sect, *max_ra;
 
@@ -693,8 +693,8 @@
         gd->real_devices= hwif; /* ptr to internal data */
         gd->next = NULL; /* linked list of major devs */
 
- for (gdp = &gendisk_head; *gdp; gdp = &((*gdp)->next)) ;
- hwif->gd = *gdp = gd; /* link onto tail of list */
+ hwif->gd = gd; /* link onto tail of list */
+ register_gendisk(hwif->major, gd);
 
         for (unit = 0; unit < units; ++unit) {
                 if (hwif->drives[unit].present)
@@ -757,7 +757,7 @@
                 printk("%s: request_fn NOT DEFINED\n", hwif->name);
                 return (hwif->present = 0);
         }
- if (register_blkdev (hwif->major, hwif->name, ide_fops)) {
+ if (register_blkdev (hwif->major, hwif->name, ide_fops, NULL)) {
                 printk("%s: UNABLE TO GET MAJOR NUMBER %d\n", hwif->name, hwif->major);
                 return (hwif->present = 0);
         }
--- linux-2.3.39-gendisk/drivers/block/loop.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/block/loop.c Thu Jan 13 15:08:57 2000
@@ -715,7 +715,7 @@
 {
         int i;
 
- if (register_blkdev(MAJOR_NR, "loop", &lo_fops)) {
+ if (register_blkdev(MAJOR_NR, "loop", &lo_fops, NULL)) {
                 printk(KERN_WARNING "Unable to get major number %d for loop device\n",
                        MAJOR_NR);
                 return -EIO;
--- linux-2.3.39-gendisk/drivers/block/md.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/block/md.c Thu Jan 13 15:08:57 2000
@@ -1235,7 +1235,7 @@
     MD_MAJOR_VERSION, MD_MINOR_VERSION, MD_PATCHLEVEL_VERSION,
     MAX_MD_DEV, MAX_REAL);
 
- if (register_blkdev (MD_MAJOR, "md", &md_fops))
+ if (register_blkdev (MD_MAJOR, "md", &md_fops, &md_gendisk))
   {
     printk ("Unable to get major %d for md\n", MD_MAJOR);
     return (-1);
@@ -1244,9 +1244,6 @@
   blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
   read_ahead[MD_MAJOR]=INT_MAX;
   memset(md_dev, 0, MAX_MD_DEV * sizeof (struct md_dev));
- md_gendisk.next=gendisk_head;
-
- gendisk_head=&md_gendisk;
 
 #if SUPPORT_RECONSTRUCTION
   if ((md_sync_thread = md_register_thread(mdsyncd, NULL)) == NULL)
--- linux-2.3.39-gendisk/drivers/block/nbd.c.~1~ Thu Jan 13 15:05:23 2000
+++ linux-2.3.39-gendisk/drivers/block/nbd.c Thu Jan 13 15:08:57 2000
@@ -469,7 +469,7 @@
                 return -EIO;
         }
 
- if (register_blkdev(MAJOR_NR, "nbd", &nbd_fops)) {
+ if (register_blkdev(MAJOR_NR, "nbd", &nbd_fops, NULL)) {
                 printk("Unable to get major number %d for NBD\n",
                        MAJOR_NR);
                 return -EIO;
--- linux-2.3.39-gendisk/drivers/block/paride/pcd.c.~1~ Tue Dec 21 14:42:06 1999
+++ linux-2.3.39-gendisk/drivers/block/paride/pcd.c Thu Jan 13 15:08:57 2000
@@ -335,7 +335,7 @@
         /* get the atapi capabilities page */
         pcd_probe_capabilities();
 
- if (register_blkdev(MAJOR_NR,name,&cdrom_fops)) {
+ if (register_blkdev(MAJOR_NR,name,&cdrom_fops,NULL)) {
                 printk("pcd: unable to get major number %d\n",MAJOR_NR);
                 return -1;
         }
--- linux-2.3.39-gendisk/drivers/block/paride/pd.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/block/paride/pd.c Thu Jan 13 15:08:57 2000
@@ -390,7 +390,7 @@
 
         if (disable) return -1;
 
- if (register_blkdev(MAJOR_NR,name,&pd_fops)) {
+ if (register_blkdev(MAJOR_NR,name,&pd_fops,&pd_gendisk)) {
                 printk("%s: unable to get major number %d\n",
                         name,major);
                 return -1;
@@ -400,8 +400,6 @@
         
         pd_gendisk.major = major;
         pd_gendisk.major_name = name;
- pd_gendisk.next = gendisk_head;
- gendisk_head = &pd_gendisk;
 
         for(i=0;i<PD_DEVS;i++) pd_blocksizes[i] = 1024;
         blksize_size[MAJOR_NR] = pd_blocksizes;
@@ -608,14 +606,9 @@
 
 void cleanup_module(void)
 
-{ struct gendisk **gdp;
- int unit;
+{ int unit;
 
         unregister_blkdev(MAJOR_NR,name);
-
- for(gdp=&gendisk_head;*gdp;gdp=&((*gdp)->next))
- if (*gdp == &pd_gendisk) break;
- if (*gdp) *gdp = (*gdp)->next;
 
         for (unit=0;unit<PD_UNITS;unit++)
            if (PD.present) pi_release(PI);
--- linux-2.3.39-gendisk/drivers/block/paride/pf.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/block/paride/pf.c Thu Jan 13 15:08:57 2000
@@ -350,7 +350,7 @@
         if (pf_detect()) return -1;
         pf_busy = 0;
 
- if (register_blkdev(MAJOR_NR,name,&pf_fops)) {
+ if (register_blkdev(MAJOR_NR,name,&pf_fops,NULL)) {
                 printk("pf_init: unable to get major number %d\n",
                         major);
                 return -1;
--- linux-2.3.39-gendisk/drivers/block/ps2esdi.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/block/ps2esdi.c Thu Jan 13 15:08:57 2000
@@ -175,7 +175,7 @@
 
         /* register the device - pass the name, major number and operations
            vector . */
- if (register_blkdev(MAJOR_NR, "ed", &ps2esdi_fops)) {
+ if (register_blkdev(MAJOR_NR, "ed", &ps2esdi_fops, &ps2esdi_gendisk)) {
                 printk("%s: Unable to get major number %d\n", DEVICE_NAME, MAJOR_NR);
                 return -1;
         }
@@ -183,9 +183,6 @@
         blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
         read_ahead[MAJOR_NR] = 8; /* 8 sector (4kB) read ahead */
 
- /* some minor housekeeping - setup the global gendisk structure */
- ps2esdi_gendisk.next = gendisk_head;
- gendisk_head = &ps2esdi_gendisk;
         return 0;
 
 } /* ps2esdi_init */
--- linux-2.3.39-gendisk/drivers/block/rd.c.~1~ Thu Jan 13 15:04:53 2000
+++ linux-2.3.39-gendisk/drivers/block/rd.c Thu Jan 13 15:12:15 2000
@@ -379,7 +379,7 @@
         return 0;
 }
 
-static struct block_device_operations fd_fops = {
+static struct block_device_operations rd_fops = {
         open: rd_open,
         release: rd_release,
         ioctl: rd_ioctl,
@@ -410,7 +410,7 @@
                 rd_blocksize = BLOCK_SIZE;
         }
 
- if (register_blkdev(MAJOR_NR, "ramdisk", &fd_fops)) {
+ if (register_blkdev(MAJOR_NR, "ramdisk", &rd_fops, NULL)) {
                 printk("RAMDISK: Could not get major %d", MAJOR_NR);
                 return -EIO;
         }
--- linux-2.3.39-gendisk/drivers/block/swim3.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/block/swim3.c Thu Jan 13 15:08:57 2000
@@ -1056,7 +1056,7 @@
 
         if (floppy_count > 0)
         {
- if (register_blkdev(MAJOR_NR, "fd", &floppy_fops)) {
+ if (register_blkdev(MAJOR_NR, "fd", &floppy_fops, NULL)) {
                         printk(KERN_ERR "Unable to get major %d for floppy\n",
                                MAJOR_NR);
                         return -EBUSY;
--- linux-2.3.39-gendisk/drivers/block/swim_iop.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/block/swim_iop.c Thu Jan 13 15:08:57 2000
@@ -146,7 +146,7 @@
 
         if (!iop_ism_present) return -ENODEV;
 
- if (register_blkdev(MAJOR_NR, "fd", &floppy_fops)) {
+ if (register_blkdev(MAJOR_NR, "fd", &floppy_fops, NULL)) {
                 printk(KERN_ERR "SWIM-IOP: Unable to get major %d for floppy\n",
                        MAJOR_NR);
                 return -EBUSY;
--- linux-2.3.39-gendisk/drivers/block/xd.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/block/xd.c Thu Jan 13 15:12:45 2000
@@ -173,14 +173,12 @@
 /* xd_init: register the block device number and set up pointer tables */
 int __init xd_init (void)
 {
- if (register_blkdev(MAJOR_NR,"xd",&xd_fops)) {
+ if (register_blkdev(MAJOR_NR,"xd",&xd_fops,&xd_gendisk)) {
                 printk("xd: Unable to get major number %d\n",MAJOR_NR);
                 return -1;
         }
         blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
         read_ahead[MAJOR_NR] = 8; /* 8 sector (4kB) read ahead */
- xd_gendisk.next = gendisk_head;
- gendisk_head = &xd_gendisk;
 
         return 0;
 }
--- linux-2.3.39-gendisk/drivers/block/z2ram.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/block/z2ram.c Thu Jan 13 15:08:57 2000
@@ -342,7 +342,7 @@
     if ( !MACH_IS_AMIGA )
         return -ENXIO;
 
- if ( register_blkdev( MAJOR_NR, DEVICE_NAME, &z2_fops ) )
+ if ( register_blkdev( MAJOR_NR, DEVICE_NAME, &z2_fops, NULL ) )
     {
         printk( KERN_ERR DEVICE_NAME ": Unable to get major %d\n",
             MAJOR_NR );
--- linux-2.3.39-gendisk/drivers/cdrom/aztcd.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/cdrom/aztcd.c Thu Jan 13 15:08:57 2000
@@ -1785,7 +1785,7 @@
                return -EIO;
              }
          }
- if (register_blkdev(MAJOR_NR, "aztcd", &azt_fops) != 0)
+ if (register_blkdev(MAJOR_NR, "aztcd", &azt_fops, NULL) != 0)
         {
                 printk("aztcd: Unable to get major %d for Aztech CD-ROM\n",
                        MAJOR_NR);
--- linux-2.3.39-gendisk/drivers/cdrom/cdu31a.c.~1~ Tue Dec 21 14:42:06 1999
+++ linux-2.3.39-gendisk/drivers/cdrom/cdu31a.c Thu Jan 13 15:08:57 2000
@@ -3441,7 +3441,7 @@
 
       request_region(cdu31a_port, 4,"cdu31a");
       
- if (register_blkdev(MAJOR_NR,"cdu31a",&cdrom_fops))
+ if (register_blkdev(MAJOR_NR,"cdu31a",&cdrom_fops,NULL))
       {
          printk("Unable to get major %d for CDU-31a\n", MAJOR_NR);
          goto errout2;
--- linux-2.3.39-gendisk/drivers/cdrom/cm206.c.~1~ Tue Dec 21 14:42:06 1999
+++ linux-2.3.39-gendisk/drivers/cdrom/cm206.c Thu Jan 13 15:08:57 2000
@@ -1390,7 +1390,7 @@
     return -EIO;
   }
   printk(".\n");
- if (register_blkdev(MAJOR_NR, "cm206", &cdrom_fops) != 0) {
+ if (register_blkdev(MAJOR_NR, "cm206", &cdrom_fops, NULL) != 0) {
     printk(KERN_INFO "Cannot register for major %d!\n", MAJOR_NR);
     cleanup(3);
     return -EIO;
--- linux-2.3.39-gendisk/drivers/cdrom/gscd.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/cdrom/gscd.c Thu Jan 13 15:08:57 2000
@@ -1067,7 +1067,7 @@
            i++;
         }
 
- if (register_blkdev(MAJOR_NR, "gscd", &gscd_fops) != 0)
+ if (register_blkdev(MAJOR_NR, "gscd", &gscd_fops, NULL) != 0)
         {
                 printk("GSCD: Unable to get major %d for GoldStar CD-ROM\n",
                        MAJOR_NR);
--- linux-2.3.39-gendisk/drivers/cdrom/mcd.c.~1~ Tue Dec 21 14:42:06 1999
+++ linux-2.3.39-gendisk/drivers/cdrom/mcd.c Thu Jan 13 15:08:57 2000
@@ -1181,7 +1181,7 @@
           return -EIO;
         }
 
- if (register_blkdev(MAJOR_NR, "mcd", &cdrom_fops) != 0)
+ if (register_blkdev(MAJOR_NR, "mcd", &cdrom_fops, NULL) != 0)
         {
                 printk("Unable to get major %d for Mitsumi CD-ROM\n",
                        MAJOR_NR);
--- linux-2.3.39-gendisk/drivers/cdrom/mcdx.c.~1~ Tue Dec 21 14:42:06 1999
+++ linux-2.3.39-gendisk/drivers/cdrom/mcdx.c Thu Jan 13 15:08:57 2000
@@ -1123,7 +1123,7 @@
         }
 
         xtrace(INIT, "init() register blkdev\n");
- if (register_blkdev(MAJOR_NR, "mcdx", &cdrom_fops) != 0) {
+ if (register_blkdev(MAJOR_NR, "mcdx", &cdrom_fops, NULL) != 0) {
                 xwarn("%s=0x%3p,%d: Init failed. Can't get major %d.\n",
                       MCDX,
                       stuffp->wreg_data, stuffp->irq, MAJOR_NR);
--- linux-2.3.39-gendisk/drivers/cdrom/optcd.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/cdrom/optcd.c Thu Jan 13 15:08:57 2000
@@ -2061,7 +2061,7 @@
                 DEBUG((DEBUG_VFS, "exec_cmd COMINITDOUBLE: %02x", -status));
                 return -EIO;
         }
- if (register_blkdev(MAJOR_NR, "optcd", &opt_fops) != 0)
+ if (register_blkdev(MAJOR_NR, "optcd", &opt_fops, NULL) != 0)
         {
                 printk(KERN_ERR "optcd: unable to get major %d\n", MAJOR_NR);
                 return -EIO;
--- linux-2.3.39-gendisk/drivers/cdrom/sbpcd.c.~1~ Tue Dec 21 14:42:06 1999
+++ linux-2.3.39-gendisk/drivers/cdrom/sbpcd.c Thu Jan 13 15:08:57 2000
@@ -5731,7 +5731,7 @@
         OUT(MIXER_data,0xCC); /* one nibble per channel, max. value: 0xFF */
 #endif SOUND_BASE
         
- if (register_blkdev(MAJOR_NR, major_name, &cdrom_fops) != 0)
+ if (register_blkdev(MAJOR_NR, major_name, &cdrom_fops, NULL) != 0)
         {
                 msg(DBG_INF, "Can't get MAJOR %d for Matsushita CDROM\n", MAJOR_NR);
 #ifdef MODULE
--- linux-2.3.39-gendisk/drivers/cdrom/sjcd.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/cdrom/sjcd.c Thu Jan 13 15:08:57 2000
@@ -1471,7 +1471,7 @@
         hardsect_size[MAJOR_NR] = &secsize;
         blksize_size[MAJOR_NR] = &blksize;
 
- if( register_blkdev( MAJOR_NR, "sjcd", &sjcd_fops ) != 0 ){
+ if( register_blkdev( MAJOR_NR, "sjcd", &sjcd_fops, NULL ) != 0 ){
     printk( "SJCD: Unable to get major %d for Sanyo CD-ROM\n", MAJOR_NR );
     return( -EIO );
   }
--- linux-2.3.39-gendisk/drivers/cdrom/sonycd535.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/cdrom/sonycd535.c Thu Jan 13 15:08:57 2000
@@ -1590,7 +1590,7 @@
                                         printk("IRQ%d, ", tmp_irq);
                                 printk("using %d byte buffer\n", sony_buffer_size);
 
- if (register_blkdev(MAJOR_NR, CDU535_HANDLE, &cdu_fops)) {
+ if (register_blkdev(MAJOR_NR, CDU535_HANDLE, &cdu_fops, NULL)) {
                                         printk("Unable to get major %d for %s\n",
                                                         MAJOR_NR, CDU535_MESSAGE_NAME);
                                         return -EIO;
--- linux-2.3.39-gendisk/drivers/i2o/i2o_block.c.~1~ Thu Jan 13 15:05:24 2000
+++ linux-2.3.39-gendisk/drivers/i2o/i2o_block.c Thu Jan 13 15:08:57 2000
@@ -1056,7 +1056,7 @@
          * Register the block device interfaces
          */
 
- if (register_blkdev(MAJOR_NR, "i2o_block", &i2ob_fops)) {
+ if (register_blkdev(MAJOR_NR, "i2o_block", &i2ob_fops, &i2ob_gendisk)) {
                 printk("Unable to get major number %d for i2o_block\n",
                        MAJOR_NR);
                 return -EIO;
@@ -1157,14 +1157,5 @@
          */
         if (unregister_blkdev(MAJOR_NR, "i2o_block") != 0)
                 printk("i2o_block: cleanup_module failed\n");
-
- /*
- * Why isnt register/unregister gendisk in the kernel ???
- */
-
- for (gdp = &gendisk_head; *gdp; gdp = &((*gdp)->next))
- if (*gdp == &i2ob_gendisk)
- break;
-
 }
 #endif
--- linux-2.3.39-gendisk/drivers/scsi/sd.c.~1~ Thu Jan 13 15:05:25 2000
+++ linux-2.3.39-gendisk/drivers/scsi/sd.c Thu Jan 13 15:19:04 2000
@@ -975,7 +975,7 @@
 
         if (!sd_registered) {
                 for (i = 0; i <= (sd_template.dev_max - 1) / SCSI_DISKS_PER_MAJOR; i++) {
- if (register_blkdev(SD_MAJOR(i), "sd", &sd_fops)) {
+ if (register_blkdev(SD_MAJOR(i), "sd", &sd_fops, NULL)) {
                                 printk("Unable to get major %d for SCSI disk\n", SD_MAJOR(i));
                                 return 1;
                         }
@@ -1023,32 +1023,23 @@
                 sd_gendisks[i].part = sd + (i * SCSI_DISKS_PER_MAJOR << 4);
                 sd_gendisks[i].sizes = sd_sizes + (i * SCSI_DISKS_PER_MAJOR << 4);
                 sd_gendisks[i].nr_real = 0;
- sd_gendisks[i].next = sd_gendisks + i + 1;
                 sd_gendisks[i].real_devices =
                     (void *) (rscsi_disks + i * SCSI_DISKS_PER_MAJOR);
         }
 
         LAST_SD_GENDISK.max_nr =
             (sd_template.dev_max - 1) % SCSI_DISKS_PER_MAJOR + 1;
- LAST_SD_GENDISK.next = NULL;
         return 0;
 }
 
 
 static void sd_finish()
 {
- struct gendisk *gendisk;
         int i;
 
         for (i = 0; i <= (sd_template.dev_max - 1) / SCSI_DISKS_PER_MAJOR; i++) {
                 blk_dev[SD_MAJOR(i)].queue = sd_find_queue;
- }
- for (gendisk = gendisk_head; gendisk != NULL; gendisk = gendisk->next)
- if (gendisk == sd_gendisks)
- break;
- if (gendisk == NULL) {
- LAST_SD_GENDISK.next = gendisk_head;
- gendisk_head = sd_gendisks;
+ register_gendisk(SD_MAJOR(i), sd_gendisks+i);
         }
         for (i = 0; i < sd_template.dev_max; ++i)
                 if (!rscsi_disks[i].capacity &&
@@ -1256,23 +1247,6 @@
                 scsi_init_free((char *) sd_hardsizes, sd_template.dev_max * sizeof(int));
                 scsi_init_free((char *) sd,
                   (sd_template.dev_max << 4) * sizeof(struct hd_struct));
-
- /*
- * Now remove sd_gendisks from the linked list
- */
- prev_sdgd_link = &gendisk_head;
- while ((sdgd = *prev_sdgd_link) != NULL) {
- if (sdgd >= sd_gendisks && sdgd <= &LAST_SD_GENDISK) {
- removed++;
- *prev_sdgd_link = sdgd->next;
- continue;
- }
- prev_sdgd_link = &sdgd->next;
- }
-
- if (removed != N_USED_SD_MAJORS)
- printk("%s %d sd_gendisks in disk chain",
- removed > N_USED_SD_MAJORS ? "total" : "just", removed);
 
         }
         for (i = 0; i <= (sd_template.dev_max - 1) / SCSI_DISKS_PER_MAJOR; i++) {
--- linux-2.3.39-gendisk/drivers/scsi/sr.c.~1~ Thu Jan 13 15:04:59 2000
+++ linux-2.3.39-gendisk/drivers/scsi/sr.c Thu Jan 13 15:08:58 2000
@@ -705,7 +705,7 @@
                 return 0;
 
         if (!sr_registered) {
- if (register_blkdev(MAJOR_NR, "sr", &cdrom_fops)) {
+ if (register_blkdev(MAJOR_NR, "sr", &cdrom_fops, NULL)) {
                         printk("Unable to get major %d for SCSI-CD\n", MAJOR_NR);
                         return 1;
                 }
--- linux-2.3.39-gendisk/fs/block_dev.c.~1~ Thu Jan 13 15:05:26 2000
+++ linux-2.3.39-gendisk/fs/block_dev.c Thu Jan 13 15:19:47 2000
@@ -458,7 +458,7 @@
         return ret;
 }
 
-int register_blkdev(unsigned int major, const char * name, struct block_device_operations *bdops)
+int register_blkdev(unsigned int major, const char * name, struct block_device_operations *bdops, struct gendisk *gendisk)
 {
         if (major == 0) {
                 for (major = MAX_BLKDEV-1; major > 0; major--) {
@@ -476,6 +476,10 @@
                 return -EBUSY;
         blkdevs[major].name = name;
         blkdevs[major].bdops = bdops;
+
+ if (gendisk)
+ register_gendisk(major, gendisk);
+
         return 0;
 }
 
@@ -489,6 +493,7 @@
                 return -EINVAL;
         blkdevs[major].name = NULL;
         blkdevs[major].bdops = NULL;
+ unregister_gendisk(major);
         return 0;
 }
 
--- linux-2.3.39-gendisk/include/linux/fs.h.~1~ Thu Jan 13 15:05:44 2000
+++ linux-2.3.39-gendisk/include/linux/fs.h Thu Jan 13 15:29:19 2000
@@ -767,8 +767,9 @@
 #define putname(name) free_page((unsigned long)(name))
 
 enum {BDEV_FILE, BDEV_SWAP, BDEV_FS, BDEV_RAW};
+struct gendisk;
 extern void kill_fasync(struct fasync_struct *, int, int);
-extern int register_blkdev(unsigned int, const char *, struct block_device_operations *);
+extern int register_blkdev(unsigned int, const char *, struct block_device_operations *, struct gendisk *);
 extern int unregister_blkdev(unsigned int, const char *);
 extern struct block_device *bdget(dev_t);
 extern void bdput(struct block_device *);
--- linux-2.3.39-gendisk/include/linux/genhd.h.~1~ Tue Sep 7 19:28:53 1999
+++ linux-2.3.39-gendisk/include/linux/genhd.h Thu Jan 13 15:21:16 2000
@@ -218,6 +218,10 @@
 char *disk_name (struct gendisk *hd, int minor, char *buf);
 
 int get_hardsect_size(kdev_t dev);
+struct gendisk *get_gendisk(int major);
+void register_gendisk(unsigned int major, struct gendisk *gendisk);
+void unregister_gendisk(unsigned int major);
+
 #endif
 
 #endif
--- linux-2.3.39-gendisk/kernel/ksyms.c.~1~ Thu Jan 13 15:05:31 2000
+++ linux-2.3.39-gendisk/kernel/ksyms.c Thu Jan 13 15:08:58 2000
@@ -261,6 +261,8 @@
 EXPORT_SYMBOL(blkdev_put);
 EXPORT_SYMBOL(ioctl_by_bdev);
 EXPORT_SYMBOL(gendisk_head);
+EXPORT_SYMBOL(register_gendisk);
+EXPORT_SYMBOL(unregister_gendisk);
 EXPORT_SYMBOL(resetup_one_dev);
 EXPORT_SYMBOL(unplug_device);
 EXPORT_SYMBOL(make_request);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Jan 15 2000 - 21:00:22 EST