--- linux-2.4.18-14.2/drivers/scsi/sd.c.tera Wed Sep 18 11:55:53 2002 +++ linux-2.4.18-14.2/drivers/scsi/sd.c Wed Sep 18 12:42:36 2002 @@ -1018,8 +1018,16 @@ static int sd_init_onedisk(int i) * Jacques Gelinas (Jacques@solucorp.qc.ca) */ int m; - int hard_sector = sector_size; - int sz = rscsi_disks[i].capacity * (hard_sector/256); + unsigned hard_sector = sector_size; + unsigned sz = rscsi_disks[i].capacity * (hard_sector/256); + + /* Check for overflow. */ + if (sz < rscsi_disks[i].capacity) { + sz = (rscsi_disks[i].capacity/1950) * (hard_sector/256); + sz = sz/2 - sz/1250 + 974; + } + else + sz = (sz/2 - sz/1250 + 974)/1950; /* There are 16 minors allocated for each major device */ for (m = i << 4; m < ((i + 1) << 4); m++) { @@ -1027,9 +1035,9 @@ static int sd_init_onedisk(int i) } printk("SCSI device %s: " - "%d %d-byte hdwr sectors (%d MB)\n", + "%u %u-byte hdwr sectors (%u MB)\n", nbuff, rscsi_disks[i].capacity, - hard_sector, (sz/2 - sz/1250 + 974)/1950); + hard_sector, sz); } /* Rescale capacity to 512-byte units */