public inbox for linux-kernel@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox