All of lore.kernel.org
 help / color / mirror / Atom feed
* Turning off LBA48
@ 2004-05-03  1:19 Brad Nelson
  0 siblings, 0 replies; only message in thread
From: Brad Nelson @ 2004-05-03  1:19 UTC (permalink / raw)
  To: linux-kernel

I'm running kernel 2.4.26, and I have a specific need to be able to turn 
off LBA48 support on a per-device basis. Specifically, I need such 
drives to appear with a capacity of ~137GB as they would if there were 
no LBA48 support. Below is a small patch that I applied to this kernel 
to accomplish the goal. Some cursory tests indicate that it works in my 
configuration, but I may have broken some taboos. I didn't know if there 
were non-obvious side effects to increasing the size of the ide_drive_t 
struct, so I renamed an existing and (apparently) unused flag. I also 
exposed a new kernel command line option ("hdx=nolba48"); this seems to 
add to a very small list, so obviously additions aren't taken lightly.

Does anyone else see value (or danger!) in this or a similar patch? The 
reason I need it: I use this machine to manipulate hard drives for other 
machines that aren't LBA48 aware. In the case of a >137GB, it's fine to 
let the machine (TiVo) just see the first 137GB.

Thanks!

Brad

diff -ru -X /root/Xkernel linux-2.4.26.stock/drivers/ide/ide-disk.c 
linux-2.4.26/drivers/ide/ide-disk.c
--- linux-2.4.26.stock/drivers/ide/ide-disk.c   2004-04-30 
18:29:50.000000000 -0500
+++ linux-2.4.26/drivers/ide/ide-disk.c 2004-05-01 12:20:42.000000000 -0500
@@ -1567,6 +1567,9 @@
        if (HWIF(drive)->addressing)
                return 0;

+       if (drive->nolba48)
+               return 0;
+
        if (!(drive->id->cfs_enable_2 & 0x0400))
                 return -EIO;
        drive->addressing = arg;
diff -ru -X /root/Xkernel linux-2.4.26.stock/drivers/ide/ide.c 
linux-2.4.26/drivers/ide/ide.c
--- linux-2.4.26.stock/drivers/ide/ide.c        2004-04-30 
18:29:50.000000000 -0500
+++ linux-2.4.26/drivers/ide/ide.c      2004-05-01 00:50:48.000000000 -0500
@@ -1821,7 +1821,7 @@

                case HDIO_GET_NICE:
                        return put_user(drive->dsc_overlap      <<      
IDE_NICE_DSC_OVERLAP    |
-                                       drive->atapi_overlap    <<      
IDE_NICE_ATAPI_OVERLAP  |
+                                       /* drive->atapi_overlap <<      
IDE_NICE_ATAPI_OVERLAP  | */
                                        drive->nice0            <<      
IDE_NICE_0              |
                                        drive->nice1            <<      
IDE_NICE_1              |
                                        drive->nice2            <<      
IDE_NICE_2,
@@ -2070,6 +2070,7 @@
  * "hdx=cdrom"         : drive is present, and is a cdrom drive
  * "hdx=cyl,head,sect" : disk drive is present, with specified geometry
  * "hdx=noremap"       : do not remap 0->1 even though EZD was detected
+ * "hdx=nolba48"       : do not use lba48 even if hardware supports it
  * "hdx=autotune"      : driver will attempt to tune interface speed
  *                             to the fastest PIO mode supported,
  *                             if possible for this drive only.
@@ -2188,7 +2189,7 @@
                const char *hd_words[] = {"none", "noprobe", "nowerr", 
"cdrom",
                                "serialize", "autotune", "noautotune",
                                "slow", "swapdata", "bswap", "flash",
-                               "remap", "noremap", "scsi", NULL};
+                               "remap", "noremap", "scsi", "nolba48", 
NULL};
                unit = s[2] - 'a';
                hw   = unit / MAX_DRIVES;
                unit = unit % MAX_DRIVES;
@@ -2254,6 +2255,9 @@
                        case -14: /* "scsi" */
                                drive->scsi = 1;
                                goto done;
+                       case -15: /* "nolba48" */
+                               drive->nolba48 = 1;
+                               goto done;
                        case 3: /* cyl,head,sect */
                                drive->media    = ide_disk;
                                drive->cyl      = drive->bios_cyl  = 
vals[0];
diff -ru -X /root/Xkernel linux-2.4.26.stock/include/linux/ide.h 
linux-2.4.26/include/linux/ide.h
--- linux-2.4.26.stock/include/linux/ide.h      2004-04-30 
20:33:22.000000000 -0500
+++ linux-2.4.26/include/linux/ide.h    2004-05-01 12:58:13.000000000 -0500
@@ -738,7 +738,7 @@
        unsigned no_io_32bit    : 1;    /* disallow enabling 32bit I/O */
        unsigned nobios         : 1;    /* do not probe bios for drive */
        unsigned revalidate     : 1;    /* request revalidation */
-       unsigned atapi_overlap  : 1;    /* ATAPI overlap (not supported) */
+       unsigned nolba48        : 1;    /* force lba48 off even if 
hardware supports it */
        unsigned nice0          : 1;    /* give obvious excess bandwidth */
        unsigned nice2          : 1;    /* give a share in our own 
bandwidth */
        unsigned doorlocking    : 1;    /* for removable only: door 
lock/unlock works */


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-05-03  1:19 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-05-03  1:19 Turning off LBA48 Brad Nelson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.