Re: /proc/partitions hosed in 2.4.9-ac10

From: Christoph Hellwig (hch@ns.caldera.de)
Date: Mon Sep 17 2001 - 17:40:47 EST


In article <20010917151957.A26615@codepoet.org> you wrote:
> [----------snip----------]
> [----------snip----------]

Could you please try the attached patch agains 2.4.10-pre10?

--- ../master/linux-2.4.10-pre10/drivers/scsi/sd.c Mon Sep 17 00:48:49 2001
+++ linux/drivers/scsi/sd.c Tue Sep 18 00:34:41 2001
@@ -557,22 +557,7 @@
         revalidate: fop_revalidate_scsidisk
 };
 
-/*
- * If we need more than one SCSI disk major (i.e. more than
- * 16 SCSI disks), we'll have to kmalloc() more gendisks later.
- */
-
-static struct gendisk sd_gendisk =
-{
- major: SCSI_DISK0_MAJOR,
- major_name: "sd",
- minor_shift: 4,
- max_p: 1 << 4,
- fops: &sd_fops,
-};
-
-static struct gendisk *sd_gendisks = &sd_gendisk;
-
+static struct gendisk *sd_gendisks;
 #define SD_GENDISK(i) sd_gendisks[(i) / SCSI_DISKS_PER_MAJOR]
 
 /*
@@ -1132,33 +1117,34 @@
                 goto cleanup_sd;
         memset(sd, 0, (sd_template.dev_max << 4) * sizeof(struct hd_struct));
 
- if (N_USED_SD_MAJORS > 1)
- sd_gendisks = kmalloc(N_USED_SD_MAJORS * sizeof(struct gendisk), GFP_ATOMIC);
- if (!sd_gendisks)
- goto cleanup_sd_gendisks;
+ sd_gendisks = kmalloc(N_USED_SD_MAJORS * sizeof(struct gendisk), GFP_ATOMIC);
+ if (!sd_gendisks)
+ goto cleanup_sd_gendisks;
+
         for (i = 0; i < N_USED_SD_MAJORS; i++) {
- sd_gendisks[i] = sd_gendisk;
- sd_gendisks[i].de_arr = kmalloc (SCSI_DISKS_PER_MAJOR * sizeof *sd_gendisks[i].de_arr,
- GFP_ATOMIC);
- if (!sd_gendisks[i].de_arr)
+ struct gendisk *g = &sd_gendisks[i];
+
+ g->de_arr = kmalloc(SCSI_DISKS_PER_MAJOR * sizeof(*g->de_arr),
+ GFP_ATOMIC);
+ if (!g->de_arr)
                         goto cleanup_gendisks_de_arr;
- memset (sd_gendisks[i].de_arr, 0,
- SCSI_DISKS_PER_MAJOR * sizeof *sd_gendisks[i].de_arr);
- sd_gendisks[i].flags = kmalloc (SCSI_DISKS_PER_MAJOR * sizeof *sd_gendisks[i].flags,
- GFP_ATOMIC);
- if (!sd_gendisks[i].flags)
+ memset(g->de_arr, 0, SCSI_DISKS_PER_MAJOR * sizeof(*g->de_arr));
+
+ g->flags = kmalloc(SCSI_DISKS_PER_MAJOR *
+ sizeof(*g->flags), GFP_ATOMIC);
+ if (!g->flags)
                         goto cleanup_gendisks_flags;
- memset (sd_gendisks[i].flags, 0,
- SCSI_DISKS_PER_MAJOR * sizeof *sd_gendisks[i].flags);
- sd_gendisks[i].major = SD_MAJOR(i);
- sd_gendisks[i].major_name = "sd";
- sd_gendisks[i].minor_shift = 4;
- sd_gendisks[i].max_p = 1 << 4;
- 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].real_devices =
- (void *) (rscsi_disks + i * SCSI_DISKS_PER_MAJOR);
+ memset(g->flags, 0, SCSI_DISKS_PER_MAJOR * sizeof(*g->flags));
+
+ g->major = SD_MAJOR(i);
+ g->major_name = "sd";
+ g->minor_shift = 4;
+ g->max_p = 1 << g->minor_shift;
+ g->part = sd + (i * SCSI_DISKS_PER_MAJOR << 4);
+ g->sizes = sd_sizes + (i * SCSI_DISKS_PER_MAJOR << 4);
+ g->nr_real = 0;
+ g->real_devices = (rscsi_disks + i * SCSI_DISKS_PER_MAJOR);
+ g->fops = &sd_fops;
         }
 
         return 0;
@@ -1348,8 +1334,8 @@
 
                         /* If we are disconnecting a disk driver, sync and invalidate
                          * everything */
- max_p = sd_gendisk.max_p;
- start = i << sd_gendisk.minor_shift;
+ max_p = sd_gendisks->max_p;
+ start = i << sd_gendisks->minor_shift;
 
                         for (j = max_p - 1; j >= 0; j--) {
                                 int index = start + j;
@@ -1403,8 +1389,7 @@
                 read_ahead[SD_MAJOR(i)] = 0;
         }
         sd_template.dev_max = 0;
- if (sd_gendisks != &sd_gendisk)
- kfree(sd_gendisks);
+ kfree(sd_gendisks);
 }
 
 module_init(init_sd);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Sep 23 2001 - 21:00:22 EST