]> git.hungrycats.org Git - linux/commitdiff
[PATCH] capacity related fixes
authorBartlomiej Zolnierkiewicz <b.zolnierkiewicz@elka.pw.edu.pl>
Thu, 7 Aug 2003 03:16:45 +0000 (20:16 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Thu, 7 Aug 2003 03:16:45 +0000 (20:16 -0700)
From Andries.Brouwer@cwi.nl:

- store capacities in sector_t
- add generic sectors_to_MB() helper to ide-disk.c
- fix drive->bios_cyls calculation (limiting it to 65535) for disks

drivers/ide/ide-cd.c
drivers/ide/ide-disk.c
drivers/ide/ide-floppy.c
drivers/ide/ide.c
include/linux/ide.h

index aa69a15d4bbcc27efaf98ee8f54f030250561e11..1e999b0a8df50c1612a8c8a64cb4d9c9f5467853 100644 (file)
@@ -3228,7 +3228,7 @@ int ide_cdrom_setup (ide_drive_t *drive)
 }
 
 static
-unsigned long ide_cdrom_capacity (ide_drive_t *drive)
+sector_t ide_cdrom_capacity (ide_drive_t *drive)
 {
        unsigned long capacity;
 
index 55435d039cc762c42f96cc690891f24e463a9bb8..cdaf4ce3352183b5b48c4d24485323a23d9065d6 100644 (file)
@@ -1066,6 +1066,13 @@ static unsigned long long idedisk_set_max_address_ext(ide_drive_t *drive, unsign
 
 #endif /* CONFIG_IDEDISK_STROKE */
 
+static unsigned long long sectors_to_MB(unsigned long long n)
+{
+       n <<= 9;                /* make it bytes */
+       do_div(n, 1000000);     /* make it MB */
+       return n;
+}
+
 /*
  * Tests if the drive supports Host Protected Area feature.
  * Returns true if supported, false otherwise.
@@ -1166,7 +1173,7 @@ static void init_idedisk_capacity (ide_drive_t  *drive)
        }
 }
 
-static unsigned long idedisk_capacity (ide_drive_t *drive)
+static sector_t idedisk_capacity (ide_drive_t *drive)
 {
        if (drive->id->cfs_enable_2 & 0x0400)
                return (drive->capacity48 - drive->sect0);
@@ -1565,7 +1572,7 @@ static ide_startstop_t idedisk_start_power_step (ide_drive_t *drive, struct requ
 static void idedisk_setup (ide_drive_t *drive)
 {
        struct hd_driveid *id = drive->id;
-       unsigned long capacity;
+       unsigned long long capacity;
 
        idedisk_add_settings(drive);
 
@@ -1629,14 +1636,23 @@ static void idedisk_setup (ide_drive_t *drive)
         * by correcting bios_cyls:
         */
        capacity = idedisk_capacity (drive);
-       if ((capacity >= (drive->bios_cyl * drive->bios_sect * drive->bios_head)) &&
-           (!drive->forced_geom) && drive->bios_sect && drive->bios_head)
-               drive->bios_cyl = (capacity / drive->bios_sect) / drive->bios_head;
-       printk (KERN_INFO "%s: %ld sectors", drive->name, capacity);
-
-       /* Give size in megabytes (MB), not mebibytes (MiB). */
-       /* We compute the exact rounded value, avoiding overflow. */
-       printk (" (%ld MB)", (capacity - capacity/625 + 974)/1950);
+       if (!drive->forced_geom && drive->bios_sect && drive->bios_head) {
+               unsigned int cap0 = capacity;   /* truncate to 32 bits */
+               unsigned int cylsz, cyl;
+
+               if (cap0 != capacity)
+                       drive->bios_cyl = 65535;
+               else {
+                       cylsz = drive->bios_sect * drive->bios_head;
+                       cyl = cap0 / cylsz;
+                       if (cyl > 65535)
+                               cyl = 65535;
+                       if (cyl > drive->bios_cyl)
+                               drive->bios_cyl = cyl;
+               }
+       }
+       printk(KERN_INFO "%s: %llu sectors (%llu MB)",
+                        drive->name, capacity, sectors_to_MB(capacity));
 
        /* Only print cache size when it was specified */
        if (id->buf_size)
index 2c14e13668bc10c2f2827375301a7babcfdf4a4c..112dc8b8676d9ba9c1ca3bf294ba0b2e128df4d1 100644 (file)
@@ -1626,7 +1626,7 @@ static int idefloppy_get_format_progress(ide_drive_t *drive, int *arg)
 /*
  *     Return the current floppy capacity to ide.c.
  */
-static unsigned long idefloppy_capacity (ide_drive_t *drive)
+static sector_t idefloppy_capacity (ide_drive_t *drive)
 {
        idefloppy_floppy_t *floppy = drive->driver_data;
        unsigned long capacity = floppy->blocks * floppy->bs_factor;
index 3bcb7b08ceca88d23cad5d106b21d2cd200cfe9e..b40f8b1822970da40ecd290bd15ee443a0db5423 100644 (file)
@@ -351,7 +351,7 @@ int ide_system_bus_speed (void)
  * current_capacity() returns the capacity (in sectors) of a drive
  * according to its current geometry/LBA settings.
  */
-unsigned long current_capacity (ide_drive_t *drive)
+sector_t current_capacity (ide_drive_t *drive)
 {
        if (!drive->present)
                return 0;
@@ -2410,7 +2410,7 @@ static void default_pre_reset (ide_drive_t *drive)
 {
 }
 
-static unsigned long default_capacity (ide_drive_t *drive)
+static sector_t default_capacity (ide_drive_t *drive)
 {
        return 0x7fffffff;
 }
index ae1459a53dd063f70b4ca439cd0c0e8150f43fae..5ef14369efd29c09d5464747bd4c94381f2c20fe 100644 (file)
@@ -1226,7 +1226,7 @@ typedef struct ide_driver_s {
        ide_startstop_t (*abort)(ide_drive_t *, const char *);
        int             (*ioctl)(ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long);
        void            (*pre_reset)(ide_drive_t *);
-       unsigned long   (*capacity)(ide_drive_t *);
+       sector_t        (*capacity)(ide_drive_t *);
        ide_startstop_t (*special)(ide_drive_t *);
        ide_proc_entry_t        *proc;
        int             (*attach)(ide_drive_t *);
@@ -1359,7 +1359,7 @@ extern int ide_wait_stat(ide_startstop_t *, ide_drive_t *, u8, u8, unsigned long
 /*
  * Return the current idea about the total capacity of this drive.
  */
-extern unsigned long current_capacity (ide_drive_t *drive);
+extern sector_t current_capacity (ide_drive_t *drive);
 
 /*
  * Start a reset operation for an IDE interface.