From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Tejun Heo <tj@kernel.org>,
Taisuke Yamada <tai@rakugaki.org>,
Jeff Garzik <jgarzik@redhat.com>
Subject: [patch 12/26] libata: LBA28/LBA48 off-by-one bug in ata.h
Date: Sat, 18 Oct 2008 11:47:50 -0700 [thread overview]
Message-ID: <20081018184750.GM301@suse.de> (raw)
In-Reply-To: <20081018184708.GA301@suse.de>
[-- Attachment #1: libata-lba28-lba48-off-by-one-bug-in-ata.h.patch --]
[-- Type: text/plain, Size: 3373 bytes --]
2.6.26-stable review patch. If anyone has any objections, please let us
know.
------------------
From: Taisuke Yamada <tai@rakugaki.org>
commit 97b697a11b07e2ebfa69c488132596cc5eb24119 upstream
I recently bought 3 HGST P7K500-series 500GB SATA drives and
had trouble accessing the block right on the LBA28-LBA48 border.
Here's how it fails (same for all 3 drives):
# dd if=/dev/sdc bs=512 count=1 skip=268435455 > /dev/null
dd: reading `/dev/sdc': Input/output error
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.288033 seconds, 0.0 kB/s
# dmesg
ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ata1.00: BMDMA stat 0x25
ata1.00: cmd c8/00:08:f8:ff:ff/00:00:00:00:00/ef tag 0 dma 4096 in
res 51/04:08:f8:ff:ff/00:00:00:00:00/ef Emask 0x1 (device error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { ABRT }
ata1.00: configured for UDMA/33
ata1: EH complete
...
After some investigations, it turned out this seems to be caused
by misinterpretation of the ATA specification on LBA28 access.
Following part is the code in question:
=== include/linux/ata.h ===
static inline int lba_28_ok(u64 block, u32 n_block)
{
/* check the ending block number */
return ((block + n_block - 1) < ((u64)1 << 28)) && (n_block <= 256);
}
HGST drive (sometimes) fails with LBA28 access of {block = 0xfffffff,
n_block = 1}, and this behavior seems to be comformant. Other drives,
including other HGST drives are not that strict, through.
>From the ATA specification:
(http://www.t13.org/Documents/UploadedDocuments/project/d1410r3b-ATA-ATAPI-6.pdf)
8.15.29 Word (61:60): Total number of user addressable sectors
This field contains a value that is one greater than the total number
of user addressable sectors (see 6.2). The maximum value that shall
be placed in this field is 0FFFFFFFh.
So the driver shouldn't use the value of 0xfffffff for LBA28 request
as this exceeds maximum user addressable sector. The logical maximum
value for LBA28 is 0xffffffe.
The obvious fix is to cut "- 1" part, and the patch attached just do
that. I've been using the patched kernel for about a month now, and
the same fix is also floating on the net for some time. So I believe
this fix works reliably.
Just FYI, many Windows/Intel platform users also seems to be struck
by this, and HGST has issued a note pointing to Intel ICH8/9 driver.
"28-bit LBA command is being used to access LBAs 29-bits in length"
http://www.hitachigst.com/hddt/knowtree.nsf/cffe836ed7c12018862565b000530c74/b531b8bce8745fb78825740f00580e23
Also, *BSDs seems to have similar fix included sometime around ~2004,
through I have not checked out exact portion of the code.
Signed-off-by: Taisuke Yamada <tai@rakugaki.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Cc: Chuck Ebbert <cebbert@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/ata.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/include/linux/ata.h
+++ b/include/linux/ata.h
@@ -682,7 +682,7 @@ static inline int ata_ok(u8 status)
static inline int lba_28_ok(u64 block, u32 n_block)
{
/* check the ending block number */
- return ((block + n_block - 1) < ((u64)1 << 28)) && (n_block <= 256);
+ return ((block + n_block) < ((u64)1 << 28)) && (n_block <= 256);
}
static inline int lba_48_ok(u64 block, u32 n_block)
--
next prev parent reply other threads:[~2008-10-18 19:14 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20081018183853.004667035@mini.kroah.org>
2008-10-18 18:47 ` [patch 00/26] 2.6.26-stable review Greg KH
2008-10-18 18:47 ` [patch 01/26] x86: Reserve FIRST_DEVICE_VECTOR in used_vectors bitmap Greg KH
2008-10-18 18:47 ` [patch 02/26] x86: improve UP kernel when CPU-hotplug and SMP is enabled Greg KH
2008-10-18 18:47 ` [patch 03/26] x86, early_ioremap: fix fencepost error Greg KH
2008-10-18 18:47 ` [patch 04/26] tty: Termios locking - sort out real_tty confusions and lock reads Greg KH
2008-10-18 18:47 ` [patch 05/26] sched_rt.c: resch needed in rt_rq_enqueue() for the root rt_rq Greg KH
2008-10-18 18:47 ` [patch 06/26] CIFS: make sure we have the right resume info before calling CIFSFindNext Greg KH
2008-10-18 18:47 ` [patch 07/26] b43legacy: Fix failure in rate-adjustment mechanism Greg KH
2008-10-18 18:47 ` [patch 08/26] modules: fix module "notes" kobject leak Greg KH
2008-10-18 18:47 ` [patch 09/26] fbcon_set_all_vcs: fix kernel crash when switching the rotated consoles Greg KH
2008-10-18 18:47 ` [patch 10/26] libata: always do follow-up SRST if hardreset returned -EAGAIN Greg KH
2008-10-18 18:47 ` [patch 11/26] libata: fix EH action overwriting in ata_eh_reset() Greg KH
2008-10-18 18:47 ` Greg KH [this message]
2008-10-18 18:47 ` [patch 13/26] V4L: bttv: Prevent NULL pointer dereference in radio_open Greg KH
2008-10-18 18:47 ` [patch 14/26] V4L: zr36067: Fix RGBR pixel format Greg KH
2008-10-18 18:47 ` [patch 15/26] Dont allow splice() to files opened with O_APPEND Greg KH
2008-10-18 18:48 ` [patch 16/26] V4L/DVB (8498): uvcvideo: Return sensible min and max values when querying a boolean control Greg KH
2008-10-18 18:48 ` [patch 17/26] V4L/DVB (8617): uvcvideo: dont use stack-based buffers for USB transfers Greg KH
2008-10-18 18:48 ` [patch 19/26] PCI: disable ASPM per ACPI FADT setting Greg KH
2008-10-18 18:48 ` [patch 20/26] PCI: disable ASPM on pre-1.1 PCIe devices Greg KH
2008-10-18 18:48 ` [patch 18/26] V4L/DVB (9053): fix buffer overflow in uvc-video Greg KH
2008-10-18 18:48 ` [patch 21/26] x86: avoid dereferencing beyond stack + THREAD_SIZE Greg KH
2008-10-18 18:48 ` [patch 22/26] Check mapped ranges on sysfs resource files Greg KH
2008-10-18 18:48 ` [patch 23/26] hwmon: (it87) Prevent power-off on Shuttle SN68PT Greg KH
2008-10-18 18:48 ` [patch 24/26] ACPI: Ignore _BQC object when registering backlight device Greg KH
2008-10-18 18:48 ` [patch 25/26] drm/i915: fix ioremap of a user address for non-root (CVE-2008-3831) Greg KH
2008-10-18 18:48 ` [patch 26/26] DVB: au0828: add support for another USB id for Hauppauge HVR950Q Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081018184750.GM301@suse.de \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=eteo@redhat.com \
--cc=jake@lwn.net \
--cc=jgarzik@redhat.com \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=tai@rakugaki.org \
--cc=tj@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=w@1wt.eu \
--cc=zwane@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox