Commit 79d0f514 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz Committed by Linus Torvalds

[PATCH] ide: always store disk capacity in u64

From Andries.Brouwer@cwi.nl.

- always use drive->capacity48 and kill drive->capacity

I've changed drive->capacity48 to drive->capacity64 to avoid confusion.
parent 84fdbcf2
......@@ -1087,53 +1087,33 @@ static inline int idedisk_supports_lba48(const struct hd_driveid *id)
return (id->command_set_2 & 0x0400) && (id->cfs_enable_2 & 0x0400);
}
static inline void idedisk_check_hpa_lba28(ide_drive_t *drive)
static inline void idedisk_check_hpa(ide_drive_t *drive)
{
unsigned long capacity, set_max;
unsigned long long capacity, set_max;
int lba48 = idedisk_supports_lba48(drive->id);
capacity = drive->capacity;
set_max = idedisk_read_native_max_address(drive);
capacity = drive->capacity64;
if (lba48)
set_max = idedisk_read_native_max_address_ext(drive);
else
set_max = idedisk_read_native_max_address(drive);
if (set_max <= capacity)
return;
printk(KERN_INFO "%s: Host Protected Area detected.\n"
"\tcurrent capacity is %ld sectors (%ld MB)\n"
"\tnative capacity is %ld sectors (%ld MB)\n",
"\tcurrent capacity is %llu sectors (%llu MB)\n"
"\tnative capacity is %llu sectors (%llu MB)\n",
drive->name,
capacity, (capacity - capacity/625 + 974)/1950,
set_max, (set_max - set_max/625 + 974)/1950);
capacity, sectors_to_MB(capacity),
set_max, sectors_to_MB(set_max));
#ifdef CONFIG_IDEDISK_STROKE
set_max = idedisk_set_max_address(drive, set_max);
if (lba48)
set_max = idedisk_set_max_address_ext(drive, set_max);
else
set_max = idedisk_set_max_address(drive, set_max);
if (set_max) {
drive->capacity = set_max;
printk(KERN_INFO "%s: Host Protected Area disabled.\n",
drive->name);
}
#endif
}
static inline void idedisk_check_hpa_lba48(ide_drive_t *drive)
{
unsigned long long capacity_2, set_max_ext;
capacity_2 = drive->capacity48;
set_max_ext = idedisk_read_native_max_address_ext(drive);
if (set_max_ext <= capacity_2)
return;
printk(KERN_INFO "%s: Host Protected Area detected.\n"
"\tcurrent capacity is %lld sectors (%lld MB)\n"
"\tnative capacity is %lld sectors (%lld MB)\n",
drive->name,
capacity_2, sectors_to_MB(capacity_2),
set_max_ext, sectors_to_MB(set_max_ext));
#ifdef CONFIG_IDEDISK_STROKE
set_max_ext = idedisk_set_max_address_ext(drive, set_max_ext);
if (set_max_ext) {
drive->capacity48 = set_max_ext;
drive->capacity = (unsigned long) set_max_ext;
drive->capacity64 = set_max;
printk(KERN_INFO "%s: Host Protected Area disabled.\n",
drive->name);
}
......@@ -1166,27 +1146,24 @@ static void init_idedisk_capacity (ide_drive_t *drive)
if (idedisk_supports_lba48(id)) {
/* drive speaks 48-bit LBA */
drive->select.b.lba = 1;
drive->capacity48 = id->lba_capacity_2;
drive->capacity = (unsigned long) drive->capacity48;
drive->capacity64 = id->lba_capacity_2;
if (hpa)
idedisk_check_hpa_lba48(drive);
idedisk_check_hpa(drive);
} else if ((id->capability & 2) && lba_capacity_is_ok(id)) {
/* drive speaks 28-bit LBA */
drive->select.b.lba = 1;
drive->capacity = id->lba_capacity;
drive->capacity64 = id->lba_capacity;
if (hpa)
idedisk_check_hpa_lba28(drive);
idedisk_check_hpa(drive);
} else {
/* drive speaks boring old 28-bit CHS */
drive->capacity = drive->cyl * drive->head * drive->sect;
drive->capacity64 = drive->cyl * drive->head * drive->sect;
}
}
static sector_t idedisk_capacity (ide_drive_t *drive)
{
if (idedisk_supports_lba48(drive->id))
return (drive->capacity48 - drive->sect0);
return (drive->capacity - drive->sect0);
return drive->capacity64 - drive->sect0;
}
static ide_startstop_t idedisk_special (ide_drive_t *drive)
......
......@@ -766,8 +766,7 @@ typedef struct ide_drive_s {
unsigned int failures; /* current failure count */
unsigned int max_failures; /* maximum allowed failure count */
u32 capacity; /* total number of sectors */
u64 capacity48; /* total number of sectors */
u64 capacity64; /* total number of sectors */
int last_lun; /* last logical unit */
int forced_lun; /* if hdxlun was given at boot */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment