diskio: expand most fields; cache the number of total tracks
authorH. Peter Anvin <hpa@linux.intel.com>
Fri, 16 Jul 2010 23:33:39 +0000 (16:33 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Fri, 16 Jul 2010 23:33:39 +0000 (16:33 -0700)
Expand most fields in struct disk to 32 bits -- it makes the code
smaller in general, and struct disk is not a common data element.

Add a field for the number of tracks (number of heads*sectors).

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
core/fs/diskio.c
core/include/disk.h

index 51f2f39..55a9df4 100644 (file)
@@ -11,7 +11,7 @@
 
 static inline sector_t chs_max(const struct disk *disk)
 {
-    return (disk->h * disk->s) << 10;
+    return disk->t << 10;
 }
 
 static int chs_rdwr_sectors(struct disk *disk, void *buf,
@@ -393,6 +393,7 @@ struct disk *disk_init(uint8_t devno, bool cdrom, sector_t part_start,
     disk.sector_size   = sector_size;
     disk.sector_shift  = ilog2(sector_size);
     disk.part_start    = part_start;
+    disk.t             = disk.h * disk.s;
     disk.rdwr_sectors  = ebios ? edd_rdwr_sectors : chs_rdwr_sectors;
 
     if (!MaxTransfer || MaxTransfer > hard_max_transfer)
index df0476a..f433fa9 100644 (file)
@@ -13,17 +13,16 @@ typedef uint64_t block_t;
  * contains the I/O function.
  */
 struct disk {
-    uint8_t  disk_number;  /* in BIOS style */
-    uint8_t  type;         /* CHS or EDD */
-    uint16_t sector_size;  /* gener512B or 2048B */
-    uint8_t  sector_shift;
+    unsigned int disk_number;  /* in BIOS style */
+    unsigned int type;         /* CHS or EDD */
+    unsigned int sector_size;  /* gener512B or 2048B */
+    unsigned int sector_shift;
     
-    uint8_t h, s;          /* CHS geometry */
-    uint8_t pad;
+    unsigned int h, s;         /* CHS geometry */
+    unsigned int t;           /* h*s */
+    uint32_t maxtransfer;      /* Max sectors per transfer */
 
     sector_t part_start;   /* the start address of this partition(in sectors) */
-    
-    uint32_t maxtransfer;      /* Max sectors per transfer */
 
     int (*rdwr_sectors)(struct disk *, void *, sector_t, size_t, bool);
 };