]> git.hungrycats.org Git - linux/commitdiff
[PATCH] early allocation of ->part
authorAlexander Viro <viro@math.psu.edu>
Tue, 15 Oct 2002 11:23:25 +0000 (04:23 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Tue, 15 Oct 2002 11:23:25 +0000 (04:23 -0700)
allocation of ->part[] moved to alloc_disk(); alloc_disk() got an
argument (number of minors expected).  Freeing is in put_disk().

49 files changed:
arch/m68k/atari/stram.c
arch/um/drivers/ubd_kern.c
drivers/acorn/block/fd1772.c
drivers/acorn/block/mfmhd.c
drivers/block/DAC960.c
drivers/block/acsi.c
drivers/block/amiflop.c
drivers/block/ataflop.c
drivers/block/cciss.c
drivers/block/cpqarray.c
drivers/block/floppy.c
drivers/block/genhd.c
drivers/block/loop.c
drivers/block/nbd.c
drivers/block/paride/pcd.c
drivers/block/paride/pd.c
drivers/block/paride/pf.c
drivers/block/ps2esdi.c
drivers/block/rd.c
drivers/block/swim3.c
drivers/block/swim_iop.c
drivers/block/umem.c
drivers/block/xd.c
drivers/block/z2ram.c
drivers/cdrom/aztcd.c
drivers/cdrom/cdu31a.c
drivers/cdrom/cm206.c
drivers/cdrom/gscd.c
drivers/cdrom/mcd.c
drivers/cdrom/mcdx.c
drivers/cdrom/optcd.c
drivers/cdrom/sbpcd.c
drivers/cdrom/sjcd.c
drivers/cdrom/sonycd535.c
drivers/ide/ide-probe.c
drivers/ide/legacy/hd.c
drivers/md/md.c
drivers/message/i2o/i2o_block.c
drivers/mtd/ftl.c
drivers/mtd/mtdblock.c
drivers/mtd/mtdblock_ro.c
drivers/mtd/nftlcore.c
drivers/s390/block/dasd_genhd.c
drivers/s390/block/xpram.c
drivers/sbus/char/jsflash.c
drivers/scsi/sd.c
drivers/scsi/sr.c
fs/partitions/check.c
include/linux/genhd.h

index f40e6f70df3b3db59f2717b4bd19044fdbc68c6f..5d6eac53280af8f22d7c58844ca02f2ae4fe15ee 100644 (file)
@@ -1057,7 +1057,7 @@ int __init stram_device_init(void)
        if (!max_swap_size)
                /* swapping not enabled */
                return -ENXIO;
-       stram_disk = alloc_disk();
+       stram_disk = alloc_disk(1);
        if (!stram_disk)
                return -ENOMEM;
 
@@ -1070,7 +1070,6 @@ int __init stram_device_init(void)
        blk_init_queue(BLK_DEFAULT_QUEUE(STRAM_MAJOR), do_stram_request);
        stram_disk->major = STRAM_MAJOR;
        stram_disk->first_minor = STRAM_MINOR;
-       stram_disk->minor_shift = 0;
        stram_disk->fops = &stram_fops;
        sprintf(stram_disk->disk_name, "stram");
        set_capacity(stram_disk, (swap_end - swap_start)/512);
index 36995c3f84f6b5535632d5a82689fd3497e1b2ad..9229a26c1d164018e716647d4b17283b057bb165 100644 (file)
@@ -404,12 +404,11 @@ static int ubd_add(int n)
        if (!dev->file)
                return -1;
 
-       disk = alloc_disk();
+       disk = alloc_disk(1 << UBD_SHIFT);
        if (!disk)
                return -1;
        disk->major = MAJOR_NR;
        disk->first_minor = n << UBD_SHIFT;
-       disk->minor_shift = UBD_SHIFT;
        disk->fops = &ubd_blops;
        if (fakehd_set)
                sprintf(disk->disk_name, "hd%c", n + 'a');
@@ -417,14 +416,13 @@ static int ubd_add(int n)
                sprintf(disk->disk_name, "ubd%d", n);
 
        if (fake_major) {
-               fake_disk = alloc_disk();
+               fake_disk = alloc_disk(1 << UBD_SHIFT);
                if (!fake_disk) {
                        put_disk(disk);
                        return -1;
                }
                fake_disk->major = fake_major;
                fake_disk->first_minor = n << UBD_SHIFT;
-               fake_disk->minor_shift = UBD_SHIFT;
                fake_disk->fops = &ubd_blops;
                sprintf(fake_disk->disk_name, "ubd%d", n);
                fake_gendisk[n] = fake_disk;
index 85b5b9cd8859b87205128465049276db574170c2..1285b838842135d5d869ef2a882510980002087c 100644 (file)
@@ -1547,7 +1547,7 @@ int fd1772_init(void)
                return 0;
 
        for (i = 0; i < FD_MAX_UNITS; i++) {
-               disks[i] = alloc_disk();
+               disks[i] = alloc_disk(1);
                if (!disks[i])
                        goto out;
        }
index 32bef8806190600036927f49b9bf0ab873d5f3d9..b29cb6ad55052e304b419dc34798a80be3bc7175 100644 (file)
@@ -1336,12 +1336,11 @@ static int __init mfm_init (void)
                goto out3;
        
        for (i = 0; i < mfm_drives; i++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(64);
                if (!disk)
                        goto Enomem;
                disk->major = MAJOR_NR;
                disk->first_minor = i << 6;
-               disk->minor_shift = 6;
                disk->fops = &mfm_fops;
                sprintf(disk->disk_name, "mfm%c", 'a'+i);
                mfm_gendisk[i] = disk;
index 24a1ee66d93b3bdfbe304e8521ec955a498eff81..1c1a72e440e6694293f475cc08ddc46418d68d58 100644 (file)
@@ -1962,7 +1962,6 @@ static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
        sprintf(disk->disk_name, "rd/c%dd%d", Controller->ControllerNumber, n);
        disk->major = MajorNumber;
        disk->first_minor = n << DAC960_MaxPartitionsBits;
-       disk->minor_shift = DAC960_MaxPartitionsBits;
        disk->fops = &DAC960_BlockDeviceOperations;
    }
   /*
@@ -2200,7 +2199,7 @@ static void DAC960_DetectControllers(DAC960_HardwareType_T HardwareType)
        }
       memset(Controller, 0, sizeof(DAC960_Controller_T));
       for (i = 0; i < DAC960_MaxLogicalDrives; i++) {
-               Controller->disks[i] = alloc_disk();
+               Controller->disks[i] = alloc_disk(1<<DAC960_MaxPartitionsBits);
                if (!Controller->disks[i])
                        goto Enomem;
       }
index 5d36adb832e2ef0ec16500a6008391f4acb56a83..006ff8b23e32b5c1d57536f0e766cab79f1bf4d4 100644 (file)
@@ -1729,7 +1729,7 @@ int acsi_init( void )
 #endif
        err = -ENOMEM;
        for( i = 0; i < NDevices; ++i ) {
-               acsi_gendisk[i] = alloc_disk();
+               acsi_gendisk[i] = alloc_disk(16);
                if (!acsi_gendisk[i])
                        goto out4;
        }
index 22790c4145fe37cd031c99324ed0fb6c04e21b75..df7d1ac10fe96ba199d406190df88e0ab616e959 100644 (file)
@@ -1735,7 +1735,7 @@ static int __init fd_probe_drives(void)
                fd_probe(drive);
                if (unit[drive].type->code == FD_NODRIVE)
                        continue;
-               disk = alloc_disk();
+               disk = alloc_disk(1);
                if (!disk) {
                        unit[drive].type->code = FD_NODRIVE;
                        continue;
@@ -1751,7 +1751,6 @@ static int __init fd_probe_drives(void)
                printk("fd%d ",drive);
                disk->major = MAJOR_NR;
                disk->first_minor = drive;
-               disk->minor_shift = 0;
                disk->fops = &floppy_fops;
                sprintf(disk->disk_name, "fd%d", drive);
                set_capacity(disk, 880*2);
index 12f3ae02b3178075ab5141ace75f3c6a5d54768a..eac85e42887f3e6cfaca4e8bd8dd100f21a6c6a8 100644 (file)
@@ -1949,7 +1949,7 @@ int __init atari_floppy_init (void)
        }
 
        for (i = 0; i < FD_MAX_UNITS; i++) {
-               unit[i].disk = alloc_disk();
+               unit[i].disk = alloc_disk(1);
                if (!unit[i].disk)
                        goto Enomem;
        }
index ebd7a216810fd986bbac2a4d250b05b685dd40bb..caa30e1c6e84c005baad4384e566c354dd8a3850 100644 (file)
@@ -740,7 +740,7 @@ static int revalidate_allvol(kdev_t dev)
 
        for(i=0; i< NWD; i++) {
                struct gendisk *disk = hba[ctlr]->gendisk[i];
-               if (disk->part)
+               if (disk->flags & GENHD_FL_UP)
                        del_gendisk(disk);
        }
 
@@ -792,7 +792,7 @@ static int deregister_disk(int ctlr, int logvol)
        spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
 
        /* invalidate the devices and deregister the disk */ 
-       if (disk->part)
+       if (disk->flags & GENHD_FL_UP)
                del_gendisk(disk);
        /* check to see if it was the last disk */
        if (logvol == h->highest_lun) {
@@ -2274,7 +2274,7 @@ static int alloc_cciss_hba(void)
        struct gendisk *disk[NWD];
        int i, n;
        for (n = 0; n < NWD; n++) {
-               disk[n] = alloc_disk();
+               disk[n] = alloc_disk(1 << NWD_SHIFT);
                if (!disk[n])
                        goto out;
        }
@@ -2447,7 +2447,6 @@ static int __init cciss_init_one(struct pci_dev *pdev,
                sprintf(disk->disk_name, "cciss/c%dd%d", i, j);
                disk->major = MAJOR_NR + i;
                disk->first_minor = j << NWD_SHIFT;
-               disk->minor_shift = NWD_SHIFT;
                if( !(drv->nr_blocks))
                        continue;
                (BLK_DEFAULT_QUEUE(MAJOR_NR + i))->hardsect_size = drv->block_size;
@@ -2500,7 +2499,7 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev)
        /* remove it from the disk list */
        for (j = 0; j < NWD; j++) {
                struct gendisk *disk = hba[i]->gendisk[j];
-               if (disk->part)
+               if (disk->flags & GENHD_FL_UP)
                        del_gendisk(disk);
        }
 
index 7bfa29a5bc8952413fd0e0f273cb5a8ba5da8685..c3b1c4b17ea71492016d2c04b543d2054901a7a6 100644 (file)
@@ -304,7 +304,7 @@ static void __exit cpqarray_exit(void)
                kfree(hba[i]->cmd_pool_bits);
 
                for (j = 0; j < NWD; j++) {
-                       if (ida_gendisk[i][j]->part)
+                       if (ida_gendisk[i][j]->flags & GENHD_FL_UP)
                                del_gendisk(ida_gendisk[i][j]);
                        put_disk(ida_gendisk[i][j]);
                }
@@ -358,7 +358,7 @@ static int __init cpqarray_init(void)
                }
                num_cntlrs_reg++;
                for (j=0; j<NWD; j++) {
-                       ida_gendisk[i][j] = alloc_disk();
+                       ida_gendisk[i][j] = alloc_disk(1 << NWD_SHIFT);
                        if (!ida_gendisk[i][j])
                                goto Enomem2;
                }
@@ -405,7 +405,6 @@ static int __init cpqarray_init(void)
                        sprintf(disk->disk_name, "ida/c%dd%d", i, j);
                        disk->major = MAJOR_NR + i;
                        disk->first_minor = j<<NWD_SHIFT;
-                       disk->minor_shift = NWD_SHIFT;
                        disk->flags = GENHD_FL_DEVFS;
                        disk->fops = &ida_fops; 
                        if (!drv->nr_blks)
@@ -1428,7 +1427,7 @@ static int revalidate_allvol(kdev_t dev)
         */
        for (i = 0; i < NWD; i++) {
                struct gendisk *disk = ida_gendisk[ctlr][i];
-               if (disk->part)
+               if (disk->flags & GENDH_FL_UP)
                        del_gendisk(disk);
        }
        memset(hba[ctlr]->drv,            0, sizeof(drv_info_t)*NWD);
index 924e1e011f76364784f1bb69835ab00698126f2d..8783ee17314d4ccf8861b858e369a764694eb77a 100644 (file)
@@ -4240,7 +4240,7 @@ int __init floppy_init(void)
        raw_cmd = NULL;
 
        for (i=0; i<N_DRIVE; i++) {
-               disks[i] = alloc_disk();
+               disks[i] = alloc_disk(1);
                if (!disks[i])
                        goto Enomem;
        }
index 3f6d259165f304d77cf0319ca8d469e849e0929c..b230df7f7b701b1c2b55da89341006af266b9e97 100644 (file)
@@ -57,34 +57,16 @@ EXPORT_SYMBOL(blk_set_probe);       /* Will go away */
  * This function registers the partitioning information in @gp
  * with the kernel.
  */
-static void add_gendisk(struct gendisk *gp)
+void add_disk(struct gendisk *disk)
 {
-       struct hd_struct *p = NULL;
-
-       if (gp->minor_shift) {
-               size_t size = sizeof(struct hd_struct)*((1<<gp->minor_shift)-1);
-               p = kmalloc(size, GFP_KERNEL);
-               if (!p) {
-                       printk(KERN_ERR "out of memory; no partitions for %s\n",
-                               gp->disk_name);
-                       gp->minor_shift = 0;
-               } else
-                       memset(p, 0, size);
-       }
-       gp->part = p;
-
        write_lock(&gendisk_lock);
-       list_add(&gp->list, &gendisks[gp->major].list);
-       if (gp->minor_shift)
-               list_add_tail(&gp->full_list, &gendisk_list);
+       list_add(&disk->list, &gendisks[disk->major].list);
+       if (disk->minor_shift)
+               list_add_tail(&disk->full_list, &gendisk_list);
        else
-               INIT_LIST_HEAD(&gp->full_list);
+               INIT_LIST_HEAD(&disk->full_list);
        write_unlock(&gendisk_lock);
-}
-
-void add_disk(struct gendisk *disk)
-{
-       add_gendisk(disk);
+       disk->flags |= GENHD_FL_UP;
        register_disk(disk);
 }
 
@@ -225,17 +207,33 @@ __initcall(device_init);
 
 EXPORT_SYMBOL(disk_devclass);
 
-struct gendisk *alloc_disk(void)
+struct gendisk *alloc_disk(int minors)
 {
        struct gendisk *disk = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
-       if (disk)
+       if (disk) {
                memset(disk, 0, sizeof(struct gendisk));
+               if (minors > 1) {
+                       int size = (minors - 1) * sizeof(struct hd_struct);
+                       disk->part = kmalloc(size, GFP_KERNEL);
+                       if (!disk->part) {
+                               kfree(disk);
+                               return NULL;
+                       }
+                       memset(disk->part, 0, size);
+               }
+               disk->minors = minors;
+               while (minors >>= 1)
+                       disk->minor_shift++;
+       }
        return disk;
 }
 
 void put_disk(struct gendisk *disk)
 {
-       kfree(disk);
+       if (disk) {
+               kfree(disk->part);
+               kfree(disk);
+       }
 }
 EXPORT_SYMBOL(alloc_disk);
 EXPORT_SYMBOL(put_disk);
index e39755017fafe3906fc196db02022fd91dd09885..14fa8720f8db8e3125cb7057bddaebb3e7a5f6dd 100644 (file)
@@ -1075,7 +1075,7 @@ int __init loop_init(void)
                goto out_mem;
 
        for (i = 0; i < max_loop; i++) {
-               disks[i] = alloc_disk();
+               disks[i] = alloc_disk(1);
                if (!disks[i])
                        goto out_mem2;
        }
index be27027d32b8980e6f29178c47a3461012b3e39f..27726bd0246a81e1e837300e0a57925ad330ab65 100644 (file)
@@ -507,7 +507,7 @@ static int __init nbd_init(void)
        }
 
        for (i = 0; i < MAX_NBD; i++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(1);
                if (!disk)
                        goto out;
                nbd_dev[i].disk = disk;
@@ -537,7 +537,6 @@ static int __init nbd_init(void)
                nbd_bytesizes[i] = 0x7ffffc00; /* 2GB */
                disk->major = MAJOR_NR;
                disk->first_minor = i;
-               disk->minor_shift = 0;
                disk->fops = &nbd_fops;
                sprintf(disk->disk_name, "nbd%d", i);
                set_capacity(disk, 0x3ffffe);
index 0e4bac2bd1ef8b7cc0df4960174a94b1280a6189..95bedb2a580c6b5c8815d4ce934cbe4261b0cddf 100644 (file)
@@ -281,7 +281,7 @@ static void pcd_init_units(void)
 
        pcd_drive_count = 0;
        for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(1);
                if (!disk)
                        continue;
                cd->disk = disk;
@@ -303,7 +303,6 @@ static void pcd_init_units(void)
                cd->info.mask = 0;
                disk->major = major;
                disk->first_minor = unit;
-               disk->minor_shift = 0;
                strcpy(disk->disk_name, cd->name);      /* umm... */
                disk->fops = &pcd_bdops;
        }
index 7fdf4a3e4b2a4bc42286703889ce6135fcc0d0db..3a3ad6390118e3c43b7e93fb51aab192f4942e94 100644 (file)
@@ -703,14 +703,13 @@ static int pd_detect(void)
        }
        for (unit = 0, disk = pd; unit < PD_UNITS; unit++, disk++) {
                if (disk->present) {
-                       struct gendisk *p = alloc_disk();
+                       struct gendisk *p = alloc_disk(1 << PD_BITS);
                        if (!p) {
                                disk->present = 0;
                                k--;
                                continue;
                        }
                        strcpy(p->disk_name, disk->name);
-                       p->minor_shift = PD_BITS;
                        p->fops = &pd_fops;
                        p->major = major;
                        p->first_minor = unit << PD_BITS;
index becf37efd5ecd2b8a3a21c184edab23bf191a37c..69a2c8e23eaeb6e8c08406a01f121d9d53ca5080 100644 (file)
@@ -308,7 +308,7 @@ void pf_init_units(void)
 
        pf_drive_count = 0;
        for (unit = 0, pf = units; unit < PF_UNITS; unit++, pf++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(1);
                if (!disk)
                        continue;
                pf->disk = disk;
@@ -320,7 +320,6 @@ void pf_init_units(void)
                disk->major = MAJOR_NR;
                disk->first_minor = unit;
                strcpy(disk->disk_name, pf->name);
-               disk->minor_shift = 0;
                disk->fops = &pf_fops;
                if (!(*drives[unit])[D_PRT])
                        pf_drive_count++;
index 770fbfd4613fd671ee19d4f29ad1d00685ffcd9c..ed022ff34e3eda803583773246694e4f6114db1e 100644 (file)
@@ -421,13 +421,12 @@ static int __init ps2esdi_geninit(void)
 
        error = -ENOMEM;
        for (i = 0; i < ps2esdi_drives; i++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(64);
                if (!disk)
                        goto err_out4;
                disk->major = MAJOR_NR;
                disk->first_minor = i<<6;
                sprintf(disk->disk_name, "ed%c", 'a'+i);
-               disk->minor_shift = 6;
                disk->fops = &ps2esdi_fops;
                ps2esdi_gendisk[i] = disk;
        }
index a0e60c5972a6f7900ed89e424705202923b66d23..391664b9a34f02c4035963595a1f3b1e12d001fe 100644 (file)
@@ -431,17 +431,16 @@ static int __init rd_init (void)
        }
 
 #ifdef CONFIG_BLK_DEV_INITRD
-       initrd_disk = alloc_disk();
+       initrd_disk = alloc_disk(1);
        if (!initrd_disk)
                return -ENOMEM;
        initrd_disk->major = MAJOR_NR;
        initrd_disk->first_minor = INITRD_MINOR;
-       initrd_disk->minor_shift = 0;
        initrd_disk->fops = &rd_bd_op;  
        sprintf(initrd_disk->disk_name, "initrd");
 #endif
        for (i = 0; i < NUM_RAMDISKS; i++) {
-               rd_disks[i] = alloc_disk();
+               rd_disks[i] = alloc_disk(1);
                if (!rd_disks[i])
                        goto out;
        }
@@ -460,7 +459,6 @@ static int __init rd_init (void)
                rd_length[i] = rd_size << 10;
                disk->major = MAJOR_NR;
                disk->first_minor = i;
-               disk->minor_shift = 0;
                disk->fops = &rd_bd_op;
                sprintf(disk->disk_name, "rd%d", i);
                set_capacity(disk, rd_size * 2);
index b1cb36f3ca5c3844208e37c5acc8e510de41f4ca..2a5f3afefbfaaeb47df17edba221a5dd58dd52c0 100644 (file)
@@ -1037,7 +1037,7 @@ int swim3_init(void)
                return -ENODEV;
 
        for (i = 0; i < floppy_count; i++) {
-               disks[i] = alloc_disk();
+               disks[i] = alloc_disk(1);
                if (!disks[i])
                        goto out;
        }
index 29c2f16960636d3c436258c497412e84083846c5..3ec747c3f80f9d6f5fb955a28c1f652be29ce028 100644 (file)
@@ -188,7 +188,7 @@ int swimiop_init(void)
        printk("SWIM-IOP: detected %d installed drives.\n", floppy_count);
 
        for (i = 0; i < floppy_count; i++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(1);
                if (!disk)
                        continue;
                disk->major = MAJOR_NR;
index 53dfd2a7c624336bb615ab023024c144f5bf0e18..3c6a3b8294b81f22e03fc63e3a65de1981881773 100644 (file)
@@ -1190,7 +1190,7 @@ int __init mm_init(void)
        }
 
        for (i = 0; i < num_cards; i++) {
-               mm_gendisk[i] = alloc_disk();
+               mm_gendisk[i] = alloc_disk(1 << MM_SHIFT);
                if (!mm_gendisk[i])
                        goto out;
        }
@@ -1203,7 +1203,6 @@ int __init mm_init(void)
                spin_lock_init(&cards[i].lock);
                disk->major = major_nr;
                disk->first_minor  = i << MM_SHIFT;
-               disk->minor_shift = MM_SHIFT;
                disk->fops = &mm_fops;
                set_capacity(disk, cards[i].mm_size << 1);
                add_disk(disk);
index 3e3315e81bde363d3b4d3556da9ee867dc0d56cd..4467ba777d608945739b3a055c9c918d860269b2 100644 (file)
@@ -205,12 +205,11 @@ static int __init xd_init(void)
                goto out3;
 
        for (i = 0; i < xd_drives; i++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(64);
                if (!disk)
                        goto Enomem;
                disk->major = MAJOR_NR;
                disk->first_minor = i<<6;
-               disk->minor_shift = 6;
                sprintf(disk->disk_name, "xd%c", i+'a');
                disk->fops = &xd_fops;
                xd_gendisk[i] = disk;
index 30625811de3e2ee033e955d3cf2c6d3043991900..edb2676680e3a9beecb52d1467f21fddbd104b8a 100644 (file)
@@ -365,14 +365,13 @@ z2_init( void )
            MAJOR_NR );
        return -EBUSY;
     }
-    z2ram_gendisk = alloc_disk();
+    z2ram_gendisk = alloc_disk(1);
     if (!z2ram_gendisk) {
        unregister_blkdev( MAJOR_NR, DEVICE_NAME );
        return -ENOMEM;
     }
     z2ram_gendisk->major = MAJOR_NR;
     z2ram_gendisk->first_minor = 0;
-    z2ram_gendisk->minor_shift = 0;
     z2ram_gendisk->fops = &z2_fops;
     sprintf(z2ram_gendisk->disk_name, "z2ram");
 
index 53f8fe2bafe2062c621259606a617671ee353166..b8e1880d8714bf31bc8f67ca95322d968290e96c 100644 (file)
@@ -1908,7 +1908,7 @@ static int __init aztcd_init(void)
        }
        devfs_register(NULL, "aztcd", DEVFS_FL_DEFAULT, MAJOR_NR, 0,
                       S_IFBLK | S_IRUGO | S_IWUGO, &azt_fops, NULL);
-       azt_disk = alloc_disk();
+       azt_disk = alloc_disk(1);
        if (!azt_disk)
                goto err_out2;
        if (register_blkdev(MAJOR_NR, "aztcd", &azt_fops) != 0) {
@@ -1921,7 +1921,6 @@ static int __init aztcd_init(void)
        blk_queue_hardsect_size(BLK_DEFAULT_QUEUE(MAJOR_NR), 2048);
        azt_disk->major = MAJOR_NR;
        azt_disk->first_minor = 0;
-       azt_disk->minor_shift = 0;
        azt_disk->fops = &azt_fops;
        sprintf(azt_disk->disk_name, "aztcd");
        add_disk(azt_disk);
index 8863cb1254de7631333fb98f9763088d7892f868..f4077094707acb57ef90b6e26cb643de5221ee85 100644 (file)
@@ -3366,12 +3366,11 @@ int __init cdu31a_init(void)
                goto errout2;
        }
 
-       disk = alloc_disk();
+       disk = alloc_disk(1);
        if (!disk)
                goto errout1;
        disk->major = MAJOR_NR;
        disk->first_minor = 0;
-       disk->minor_shift = 0;
        sprintf(disk->disk_name, "cdu31a");
        disk->fops = &scd_bdops;
        disk->flags = GENHD_FL_CD;
index 0da8b3bcdf30f2d0208ddc290eb2d3ff29e448f2..8a83a381bcc106cbb12056206c7862d05e65224b 100644 (file)
@@ -1470,12 +1470,11 @@ int __init cm206_init(void)
                printk(KERN_INFO "Cannot register for major %d!\n", MAJOR_NR);
                goto out_blkdev;
        }
-       disk = alloc_disk();
+       disk = alloc_disk(1);
        if (!disk)
                goto out_disk;
        disk->major = MAJOR_NR;
        disk->first_minor = 0;
-       disk->minor_shift = 0;
        sprintf(disk->disk_name, "cm206");
        disk->fops = &cm206_bdops;
        disk->flags = GENHD_FL_CD;
index 9e8a14ce9374fc4b56c99b5b2b722a57f2c07467..d82b99f5a4b5e816e983881f1857dab4bf9666c9 100644 (file)
@@ -972,12 +972,11 @@ static int __init gscd_init(void)
                i++;
        }
 
-       gscd_disk = alloc_disk();
+       gscd_disk = alloc_disk(1);
        if (!gscd_disk)
                goto err_out1;
        gscd_disk->major = MAJOR_NR;
        gscd_disk->first_minor = 0;
-       gscd_disk->minor_shift = 0;
        gscd_disk->fops = &gscd_fops;
        sprintf(gscd_disk->disk_name, "gscd");
 
index 39eff9436cbfee5b2869ff9f67d470a57cd444b1..e6c72eabda52a19cf24c6f3be9f5d9d67ee0be3b 100644 (file)
@@ -1031,7 +1031,7 @@ static void mcd_release(struct cdrom_device_info *cdi)
 
 int __init mcd_init(void)
 {
-       struct gendisk *disk = alloc_disk();
+       struct gendisk *disk = alloc_disk(1);
        int count;
        unsigned char result[3];
        char msg[80];
@@ -1124,7 +1124,6 @@ int __init mcd_init(void)
 
        disk->major = MAJOR_NR;
        disk->first_minor = 0;
-       disk->minor_shift = 0;
        sprintf(disk->disk_name, "mcd");
        disk->fops = &mcd_bdops;
        disk->flags = GENHD_FL_CD;
index 7b6aaace0be1db6bda0e627eb63a5c8bc1a572e6..9747c15b926b7ae9d1830b943ab17d3c695e1cf4 100644 (file)
@@ -1076,7 +1076,7 @@ int __init mcdx_init_drive(int drive)
                return 1;
        }
 
-       disk = alloc_disk();
+       disk = alloc_disk(1);
        if (!disk) {
                xwarn("init() malloc failed\n");
                kfree(stuffp);
@@ -1221,7 +1221,6 @@ int __init mcdx_init_drive(int drive)
        stuffp->info.dev = mk_kdev(MAJOR_NR, drive);
        disk->major = MAJOR_NR;
        disk->first_minor = drive;
-       disk->minor_shift = 0;
        strcpy(disk->disk_name, stuffp->info.name);
        disk->fops = &mcdx_bdops;
        disk->flags = GENHD_FL_CD;
index baf39fd6f7080f89c9ffdbea94c03d02c974d90b..6abce539684e5270eda934b36e7de69a88a38890 100644 (file)
@@ -2010,14 +2010,13 @@ static int __init optcd_init(void)
                        "optcd: no Optics Storage CDROM Initialization\n");
                return -EIO;
        }
-       optcd_disk = alloc_disk();
+       optcd_disk = alloc_disk(1);
        if (!optcd_disk) {
                printk(KERN_ERR "optcd: can't allocate disk\n");
                return -ENOMEM;
        }
        optcd_disk->major = MAJOR_NR;
        optcd_disk->first_minor = 0;
-       optcd_disk->minor_shift = 0;
        optcd_disk->fops = &opt_fops;
        sprintf(optcd_disk->disk_name, "optcd");
        if (!request_region(optcd_port, 4, "optcd")) {
index 409aea0c4f0fca3d30215568b6aa4c13f9102f0f..22a4ca708c6f600e7f5c06dc5d6917f4d2cd45e0 100644 (file)
@@ -5831,10 +5831,9 @@ int __init sbpcd_init(void)
                sbpcd_infop->dev = mk_kdev(MAJOR_NR, j);
                sbpcd_infop->handle = p;
                p->sbpcd_infop = sbpcd_infop;
-               disk = alloc_disk();
+               disk = alloc_disk(1);
                disk->major = MAJOR_NR;
                disk->first_minor = j;
-               disk->minor_shift = 0;
                disk->fops = &sbpcd_bdops;
                strcpy(disk->disk_name, sbpcd_infop->name);
                disk->flags = GENHD_FL_CD;
index c0464754862503eac818a1bae5b51a12cf4bdd0a..9dcdda8741b0edb1e5cb76d3ae0ff9b1b2b449c3 100644 (file)
@@ -1689,14 +1689,13 @@ static int __init sjcd_init(void)
        blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), do_sjcd_request, &sjcd_lock);
        blk_queue_hardsect_size(BLK_DEFAULT_QUEUE(MAJOR_NR), 2048);
 
-       sjcd_disk = alloc_disk();
+       sjcd_disk = alloc_disk(1);
        if (!sjcd_disk) {
                printk(KERN_ERR "SJCD: can't allocate disk");
                goto out1;
        }
        sjcd_disk->major = MAJOR_NR,
        sjcd_disk->first_minor = 0,
-       sjcd_disk->minor_shift = 0,
        sjcd_disk->fops = &sjcd_fops,
        sprintf(sjcd_disk->disk_name, "sjcd");
 
index d73013c02bada67391d3effb4bf1d68d7bd9fd59..68e8103a722393c66aecaca3ec23163f929e98fd 100644 (file)
@@ -1605,12 +1605,11 @@ static int __init sony535_init(void)
        }
        initialized = 1;
 
-       cdu_disk = alloc_disk();
+       cdu_disk = alloc_disk(1);
        if (!cdu_disk)
                goto out6;
        cdu_disk->major = MAJOR_NR;
        cdu_disk->first_minor = 0;
-       cdu_disk->minor_shift = 0;
        cdu_disk->fops = &cdu_fops;
        sprintf(cdu_disk->disk_name, "cdu");
 
index 6277ce3cb1e043d4506e665c21cceeaa50bbaf38..478bffc6aed8d327dd6a0d22ffe13f2c380a31a6 100644 (file)
@@ -986,7 +986,7 @@ static void init_gendisk (ide_hwif_t *hwif)
        units = MAX_DRIVES;
 
        for (unit = 0; unit < MAX_DRIVES; unit++) {
-               disks[unit] = alloc_disk();
+               disks[unit] = alloc_disk(1 << PARTN_BITS);
                if (!disks[unit])
                        goto err_kmalloc_gd;
        }
@@ -996,7 +996,6 @@ static void init_gendisk (ide_hwif_t *hwif)
                disk->major  = hwif->major;
                disk->first_minor = unit << PARTN_BITS;
                sprintf(disk->disk_name,"hd%c",'a'+hwif->index*MAX_DRIVES+unit);
-               disk->minor_shift = PARTN_BITS; 
                disk->fops = ide_fops;
                hwif->drives[unit].disk = disk;
        }
index b0f5f104876d74c95706796205b3be928a81f991..7dc166b8e646545a6e53f8f46aca2348158851ef 100644 (file)
@@ -802,12 +802,11 @@ static int __init hd_init(void)
                goto out;
 
        for (drive=0 ; drive < NR_HD ; drive++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(64);
                if (!disk)
                        goto Enomem;
                disk->major = MAJOR_NR;
                disk->first_minor = drive << 6;
-               disk->minor_shift = 6;
                disk->fops = &hd_fops;
                sprintf(disk->disk_name, "hd%c", 'a'+drive);
                hd_gendisk[drive] = disk;
index a40c6af55da5f8f1c71777d3c40bbdec175ca58b..205bb0fdeee06e644dddb7ac88987a6cae6f2442 100644 (file)
@@ -1394,12 +1394,11 @@ static int do_md_run(mddev_t * mddev)
 #endif
        }
 
-       disk = alloc_disk();
+       disk = alloc_disk(1);
        if (!disk)
                return -ENOMEM;
        disk->major = MD_MAJOR;
        disk->first_minor = mdidx(mddev);
-       disk->minor_shift = 0;
        sprintf(disk->disk_name, "md%d", mdidx(mddev));
        disk->fops = &md_fops;
 
index 0980a0b775c6f69dc80df9e5c49483e4c8cb5927..b6f8af6193f1fbe506258f3786e7493f75e84ae1 100644 (file)
@@ -1647,7 +1647,7 @@ static int i2o_block_init(void)
        }
 
        for (i = 0; i < MAX_I2OB; i++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(16);
                if (!disk)
                        goto oom;
                i2o_disk[i] = disk;
@@ -1679,7 +1679,6 @@ static int i2o_block_init(void)
                struct gendisk *disk = i2ob_disk + i;
                disk->major = MAJOR_NR;
                disk->first_minor = i<<4;
-               disk->minor_shift = 4;
                disk->fops = &i2ob_fops;
                sprintf(disk->disk_name, "i2o/hd%c", 'a' + i);
        }
index 341ad2252885b40df5efa2e466789d805d5799ee..e40e34d3c7d6abbd26ff269f167ef4651949da0a 100644 (file)
@@ -1223,7 +1223,7 @@ static void ftl_notify_add(struct mtd_info *mtd)
        }
 
        partition = kmalloc(sizeof(partition_t), GFP_KERNEL);
-       disk = alloc_disk();
+       disk = alloc_disk(1 << PART_BITS);
                
        if (!partition||!disk) {
                printk(KERN_WARNING "No memory to scan for FTL on %s\n",
@@ -1237,7 +1237,6 @@ static void ftl_notify_add(struct mtd_info *mtd)
        sprintf(disk->disk_name, "ftl%c", 'a' + device);
        disk->major = FTL_MAJOR;
        disk->first_minor = device << 4;
-       disk->minor_shift = PART_BITS;
        disk->fops = &ftl_blk_fops;
        partition->mtd = mtd;
        partition->disk = disk;
index 1ad148bd3364f1f49e22e0f4282242764b51f57a..6b32d3cfb390ef061744cb638ae0c87fec1692cc 100644 (file)
@@ -295,7 +295,7 @@ static int mtdblock_open(struct inode *inode, struct file *file)
        spin_unlock(&mtdblks_lock);
 
        mtdblk = kmalloc(sizeof(struct mtdblk_dev), GFP_KERNEL);
-       disk = alloc_disk();
+       disk = alloc_disk(1);
        if (!mtdblk || !disk)
                goto Enomem;
        memset(mtdblk, 0, sizeof(*mtdblk));
@@ -313,7 +313,6 @@ static int mtdblock_open(struct inode *inode, struct file *file)
        }
        disk->major = MAJOR_NR;
        disk->first_minor = dev;
-       disk->minor_shift = 0;
        disk->fops = &mtd_fops;
        sprintf(disk->disk_name, "mtd%d", dev);
        mtdblk->disk = disk;
index 65b97e3a11dfd92a13e45ecde2cacafcf1601d42..97e8437a75d5c5675a7223a7689623fafbe9ba3d 100644 (file)
@@ -224,7 +224,7 @@ int __init init_mtdblock(void)
        int i;
 
        for (i = 0; i < MAX_MTD_DEVICES; i++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(1);
                if (!disk)
                        goto out;
                disk->major = MAJOR_NR;
index 60d26b10740e41a3e7768be33a5c4b9f52818d12..155aa92a9429ede06e85b13e7514400e5f2f1560 100644 (file)
@@ -74,7 +74,7 @@ static void NFTL_setup(struct mtd_info *mtd)
         }
 
        nftl = kmalloc(sizeof(struct NFTLrecord), GFP_KERNEL);
-       gd = alloc_disk();
+       gd = alloc_disk(1 << NFTL_PARTN_BITS);
        if (!nftl || !gd) {
                kfree(nftl);
                put_disk(gd);
@@ -132,7 +132,6 @@ static void NFTL_setup(struct mtd_info *mtd)
        sprintf(gd->disk_name, "nftl%c", 'a' + firstfree);
        gd->major = MAJOR_NR;
        gd->first_minor = firstfree << NFTL_PARTN_BITS;
-       gd->minor_shift = NFTL_PARTN_BITS;
        set_capacity(gd, nftl->nr_sects);
        nftl->disk = gd;
        add_disk(gd);
index be6c7dc5aa0ab9645d751bdcd35173a56dcbf93c..67597043b7188890535285325406b32fe782745e 100644 (file)
@@ -190,14 +190,13 @@ dasd_gendisk_alloc(int devindex)
                }
        }
 
-       gdp = alloc_disk();
+       gdp = alloc_disk(1 << DASD_PARTN_BITS);
        if (!gdp)
                return ERR_PTR(-ENOMEM);
 
        /* Initialize gendisk structure. */
        gdp->major = mi->major;
        gdp->first_minor = index << DASD_PARTN_BITS;
-       gdp->minor_shift = DASD_PARTN_BITS;
        gdp->fops = &dasd_device_operations;
 
        /*
index 80f8b7573a41f48a3644ebfce3ca8a83999cba16..4db75e1b7e7399b53b04266f6fbeab7dc12103a2 100644 (file)
@@ -441,7 +441,7 @@ static int __init xpram_setup_blkdev(void)
        int i, rc = -ENOMEM;
 
        for (i = 0; i < xpram_devs; i++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(1);
                if (!disk)
                        goto out;
                xpram_disks[i] = disk;
@@ -481,7 +481,6 @@ static int __init xpram_setup_blkdev(void)
                offset += xpram_devices[i].size;
                disk->major = XPRAM_MAJOR;
                disk->first_minor = i;
-               disk->minor_shift = 0;
                disk->fops = &xpram_devops;
                sprintf(disk->disk_name, "slram%d", i);
                set_capacity(disk, xpram_sizes[i] << 1);
index 16386c2349382b508f1cc259c1f9368541a745e2..c0479c824d05b09f253861ade9cdb4ad30ba2404 100644 (file)
@@ -622,7 +622,7 @@ static int jsfd_init(void)
 
        err = -ENOMEM;
        for (i = 0; i < JSF_MAX; i++) {
-               struct gendisk *disk = alloc_disk();
+               struct gendisk *disk = alloc_disk(1);
                if (!disk)
                        goto out;
                jsfd_disk[i] = disk;
@@ -648,7 +648,6 @@ static int jsfd_init(void)
                disk->first_minor = i;
                sprintf(disk->disk_name, "jsfd%d", i);
                disk->fops = &jsfd_fops;
-               disk->minor_shift = 0;
                set_capacity(disk, jdp->dsize >> 9);
                add_disk(disk);
                set_device_ro(MKDEV(JSFD_MAJOR, i), 1);
index 5863cdcf9bbad3bfba30738914e49d2cdc988983..1b7abd00b167f3ccd44848e4ca21f2b5c463f919 100644 (file)
@@ -1386,7 +1386,7 @@ static int sd_attach(Scsi_Device * sdp)
            ((sdp->type != TYPE_DISK) && (sdp->type != TYPE_MOD)))
                return 0;
 
-       gd = alloc_disk();
+       gd = alloc_disk(16);
        if (!gd)
                return 1;
 
@@ -1423,7 +1423,6 @@ static int sd_attach(Scsi_Device * sdp)
         gd->de = sdp->de;
        gd->major = SD_MAJOR(dsk_nr>>4);
        gd->first_minor = (dsk_nr & 15)<<4;
-       gd->minor_shift = 4;
        gd->fops = &sd_fops;
        if (dsk_nr > 26)
                sprintf(gd->disk_name, "sd%c%c",'a'+dsk_nr/26-1,'a'+dsk_nr%26);
index ab50575b899ceb3b1435d7b188a34fe7c167c244..05fe1b938eb4428afe964e4d1a3837de8f637c05 100644 (file)
@@ -757,7 +757,7 @@ void sr_finish()
                 * with loadable modules. */
                if (cd->disk)
                        continue;
-               disk = alloc_disk();
+               disk = alloc_disk(1);
                if (!disk)
                        continue;
                if (cd->disk) {
@@ -766,7 +766,6 @@ void sr_finish()
                }
                disk->major = MAJOR_NR;
                disk->first_minor = i;
-               disk->minor_shift = 0;
                strcpy(disk->disk_name, cd->cdi.name);
                disk->fops = &sr_bdops;
                disk->flags = GENHD_FL_CD;
index 5976fa3e466fef4588c7dcf80f05d9f266e7a36d..b3164b9ca0719563c4242e19f2b6aa80d8630ebe 100644 (file)
@@ -531,10 +531,7 @@ void del_gendisk(struct gendisk *disk)
        wipe_partitions(disk);
        unlink_gendisk(disk);
        devfs_remove_partitions(disk);
-       if (disk->part) {
-               kfree(disk->part);
-               disk->part = NULL;
-       }
+       disk->flags &= ~GENHD_FL_UP;
 }
 
 struct dev_name {
index 62781b452fe95c9b0d25befb62bf986cdbb584a3..70c58d8b7e86986fc27fd1a1615157d6b2db8816 100644 (file)
@@ -69,6 +69,7 @@ struct hd_struct {
 #define GENHD_FL_DRIVERFS  2
 #define GENHD_FL_DEVFS 4
 #define GENHD_FL_CD    8
+#define GENHD_FL_UP    16
 
 struct gendisk {
        int major;                      /* major number of driver */
@@ -262,7 +263,7 @@ char *disk_name (struct gendisk *hd, int part, char *buf);
 extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);
 extern void update_partition(struct gendisk *disk, int part);
 
-extern struct gendisk *alloc_disk(void);
+extern struct gendisk *alloc_disk(int minors);
 extern void put_disk(struct gendisk *disk);
 
 /* will go away */