2003-08-17 06:18:26

by Erik Andersen

[permalink] [raw]
Subject: [PATCH] 8/8 Backport recent 2.6 IDE updates to 2.4.x

This patch limits drive capacity to 137GB if host doesn't support
LBA48. This fixes some serious problems (see the recent thread on
"uncorrectable ext2 errors").

This also kills the probe_lba_addressing() wrapper, and renames
"hwif->addressing" to "hwif->no_lba48". This is because
"hwif->addressing" is way too similar to "drive->addressing"
which has a totally different meaning.

-Erik

--
Erik B. Andersen http://codepoet-consulting.com/
--This message was written using 73% post-consumer electrons--

--- orig/drivers/ide/ide-disk.c 2003-08-16 21:37:43.000000000 -0600
+++ linux-2.4.21/drivers/ide/ide-disk.c 2003-08-16 21:37:43.000000000 -0600
@@ -1545,11 +1545,17 @@
return 0;
}

-static int probe_lba_addressing (ide_drive_t *drive, int arg)
+/*
+ * drive->addressing:
+ * 0: 28-bit
+ * 1: 48-bit
+ * 2: 48-bit capable doing 28-bit
+ */
+static int set_lba_addressing(ide_drive_t *drive, int arg)
{
drive->addressing = 0;

- if (HWIF(drive)->addressing)
+ if (HWIF(drive)->no_lba48)
return 0;

if (!idedisk_supports_lba48(drive->id))
@@ -1558,11 +1564,6 @@
return 0;
}

-static int set_lba_addressing (ide_drive_t *drive, int arg)
-{
- return (probe_lba_addressing(drive, arg));
-}
-
static void idedisk_add_settings(ide_drive_t *drive)
{
struct hd_driveid *id = drive->id;
@@ -1638,13 +1639,7 @@
break;
}

-#if 1
- (void) probe_lba_addressing(drive, 1);
-#else
- /* if using 48-bit addressing bump the request size up */
- if (probe_lba_addressing(drive, 1))
- blk_queue_max_sectors(&drive->queue, 2048);
-#endif
+ (void)set_lba_addressing(drive, 1);

/* Extract geometry if we did not already have one for the drive */
if (!drive->cyl || !drive->head || !drive->sect) {
@@ -1671,6 +1666,15 @@
/* calculate drive capacity, and select LBA if possible */
init_idedisk_capacity (drive);

+ /* limit drive capacity to 137GB if LBA48 cannot be used */
+ if (drive->addressing == 0 && drive->capacity64 > 1ULL << 28) {
+ printk("%s: cannot use LBA48 - full capacity "
+ "%llu sectors (%llu MB)\n",
+ drive->name,
+ drive->capacity64, sectors_to_MB(drive->capacity64));
+ drive->capacity64 = 1ULL << 28;
+ }
+
/*
* if possible, give fdisk access to more of the drive,
* by correcting bios_cyls:
--- orig/drivers/ide/ide-probe.c 2003-08-16 21:37:43.000000000 -0600
+++ linux-2.4.21/drivers/ide/ide-probe.c 2003-08-16 21:37:43.000000000 -0600
@@ -1196,6 +1196,8 @@
*bs++ = BLOCK_SIZE;
/*
* IDE can do up to 128K per request == 256
+ * TODO: should this change depending on the value
+ * of hwif->no_lba48?
*/
*max_sect++ = ((hwif->rqsize) ? hwif->rqsize : 128);
*max_ra++ = vm_max_readahead;
--- orig/drivers/ide/ide.c 2003-08-16 21:37:43.000000000 -0600
+++ linux-2.4.21/drivers/ide/ide.c 2003-08-16 21:37:43.000000000 -0600
@@ -872,7 +872,7 @@

hwif->mmio = old_hwif.mmio;
hwif->rqsize = old_hwif.rqsize;
- hwif->addressing = old_hwif.addressing;
+ hwif->no_lba48 = old_hwif.no_lba48;
#ifndef CONFIG_BLK_DEV_IDECS
hwif->irq = old_hwif.irq;
#endif /* CONFIG_BLK_DEV_IDECS */
--- orig/drivers/ide/legacy/pdc4030.c 2003-08-16 21:37:43.000000000 -0600
+++ linux-2.4.21/drivers/ide/legacy/pdc4030.c 2003-08-16 21:37:43.000000000 -0600
@@ -225,7 +225,7 @@
hwif2->mate = hwif;
hwif2->channel = 1;
hwif->rqsize = hwif2->rqsize = 127;
- hwif->addressing = hwif2->addressing = 1;
+ hwif->no_lba48 = hwif2->no_lba48 = 1;
hwif->selectproc = hwif2->selectproc = &promise_selectproc;
hwif->serialized = hwif2->serialized = 1;
/* DC4030 hosted drives need their own identify... */
--- orig/drivers/ide/pci/alim15x3.c 2003-08-16 21:37:43.000000000 -0600
+++ linux-2.4.21/drivers/ide/pci/alim15x3.c 2003-08-16 21:37:43.000000000 -0600
@@ -760,7 +760,7 @@
hwif->speedproc = &ali15x3_tune_chipset;

/* Don't use LBA48 on ALi devices before rev 0xC5 */
- hwif->addressing = (m5229_revision <= 0xC4) ? 1 : 0;
+ hwif->no_lba48 = (m5229_revision <= 0xC4) ? 1 : 0;

if (!hwif->dma_base) {
hwif->drives[0].autotune = 1;
--- orig/drivers/ide/pci/pdc202xx_old.c 2003-08-16 21:37:43.000000000 -0600
+++ linux-2.4.21/drivers/ide/pci/pdc202xx_old.c 2003-08-16 21:37:43.000000000 -0600
@@ -698,7 +698,7 @@
hwif->quirkproc = &pdc202xx_quirkproc;

if (hwif->pci_dev->device == PCI_DEVICE_ID_PROMISE_20265)
- hwif->addressing = (hwif->channel) ? 0 : 1;
+ hwif->no_lba48 = (hwif->channel) ? 0 : 1;

if (hwif->pci_dev->device != PCI_DEVICE_ID_PROMISE_20246) {
hwif->busproc = &pdc202xx_tristate;
--- orig/drivers/ide/pci/siimage.c 2003-08-16 21:37:43.000000000 -0600
+++ linux-2.4.21/drivers/ide/pci/siimage.c 2003-08-16 21:37:43.000000000 -0600
@@ -992,7 +992,7 @@
* use LBA48 mode.
*/
// base += 0x10;
-// hwif->addressing = 1;
+// hwif->no_lba48 = 1;

hw.io_ports[IDE_DATA_OFFSET] = base;
hw.io_ports[IDE_ERROR_OFFSET] = base + 1;
--- orig/drivers/ide/pci/trm290.c 2003-08-16 21:37:43.000000000 -0600
+++ linux-2.4.21/drivers/ide/pci/trm290.c 2003-08-16 21:37:43.000000000 -0600
@@ -309,7 +309,7 @@
u8 reg = 0;
struct pci_dev *dev = hwif->pci_dev;

- hwif->addressing = 1;
+ hwif->no_lba48 = 1;
hwif->chipset = ide_trm290;
cfgbase = pci_resource_start(dev, 4);
if ((dev->class & 5) && cfgbase) {
--- orig/include/linux/ide.h 2003-08-16 21:37:43.000000000 -0600
+++ linux-2.4.21/include/linux/ide.h 2003-08-16 21:37:43.000000000 -0600
@@ -971,7 +971,6 @@

int mmio; /* hosts iomio (0), mmio (1) or custom (2) select */
int rqsize; /* max sectors per request */
- int addressing; /* hosts addressing */
int irq; /* our irq number */
int initializing; /* set while initializing self */

@@ -1000,6 +999,7 @@
unsigned reset : 1; /* reset after probe */
unsigned autodma : 1; /* auto-attempt using DMA at boot */
unsigned udma_four : 1; /* 1=ATA-66 capable, 0=default */
+ unsigned no_lba48 : 1; /* 1 = cannot do LBA48 */
unsigned highmem : 1; /* can do full 32-bit dma */
unsigned no_dsc : 1; /* 0 default, 1 dsc_overlap disabled */


2003-08-17 08:52:45

by Alan

[permalink] [raw]
Subject: Re: [PATCH] 8/8 Backport recent 2.6 IDE updates to 2.4.x

On Sul, 2003-08-17 at 07:14, Erik Andersen wrote:
> This patch limits drive capacity to 137GB if host doesn't support
> LBA48. This fixes some serious problems (see the recent thread on
> "uncorrectable ext2 errors").

Already fixed in -ac, but this fix cleans up other stuff too

> This also kills the probe_lba_addressing() wrapper, and renames
> "hwif->addressing" to "hwif->no_lba48". This is because
> "hwif->addressing" is way too similar to "drive->addressing"
> which has a totally different meaning.

Partly ejected, see the FIXME note in the ac3 tree. When playing with
this I found we actually need two different hwif things for each size,
so that we can handle the fact most controllers are PIO capable for
LBA48 even if not DMA capable.

Its actually really important we do fix this properly because someone
using a disk in PIO mode will suddenely find that the update stops
them from using their filesystem any more.

no_lba48 is questionable given the existance of higher modes but either
way we definitely need both "lba48" "lba48_dma"

Other patches look fine and I'll merge them. I'd like to hear Andries
and Bartlomiej views on how we deal with the lba48 pio only case

Alan