From: "Steven J. Magnani" <steve.magnani@digidescorp.com>
To: "'James E . J . Bottomley'" <jejb@linux.vnet.ibm.com>,
"'Martin K . Petersen'" <martin.petersen@oracle.com>
Cc: linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org,
"Steven J . Magnani" <steve@digidescorp.com>
Subject: [PATCH] sd: close hole in > 2T device rejection when !CONFIG_LBDAF
Date: Mon, 27 Feb 2017 09:22:29 -0600 [thread overview]
Message-ID: <1488208949-3811-1-git-send-email-steve@digidescorp.com> (raw)
When the kernel is compiled _without_ support for large (>= 2TiB) block
devices, code in the sd driver's read_capacity() routines rejects devices
whose count of native-sized blocks does not fit in the 32 bit sector_t
type. A device reporting 4294967296 512-byte blocks will be rejected, but
a device of equal capacity reporting 2147483648 1024-byte blocks will not.
The latter case causes problems, for example misreporting of device
capacity by BLKGETSIZE64. This is because the kernel converts a device's
capacity in native-sized blocks to an equivalent number of 512-byte units
and stores the result in a sector_t - which is too small for devices such
as those noted above.
To prevent this, when the kernel is compiled without support for large
block devices, the read_capacity() routines must reject any device whose
capacity is 2 TiB or greater regardless of its count of native-sized
blocks.
Signed-off-by: Steven J. Magnani <steve@digidescorp.com>
---
--- a/drivers/scsi/sd.c 2017-02-24 20:29:44.510036363 -0600
+++ b/drivers/scsi/sd.c 2017-02-27 08:19:37.864786958 -0600
@@ -2066,7 +2066,7 @@ static int read_capacity_16(struct scsi_
int the_result;
int retries = 3, reset_retries = READ_CAPACITY_RETRIES_ON_RESET;
unsigned int alignment;
- unsigned long long lba;
+ unsigned long long lba, lba_in_sectors;
unsigned sector_size;
if (sdp->no_read_capacity_16)
@@ -2122,7 +2122,10 @@ static int read_capacity_16(struct scsi_
return -ENODEV;
}
- if ((sizeof(sdkp->capacity) == 4) && (lba >= 0xffffffffULL)) {
+ /* Make sure logical_to_sectors() won't overflow */
+ lba_in_sectors = lba << (ilog2(sector_size) - 9);
+ if ((sizeof(sdkp->capacity) == 4) &&
+ ((lba >= 0xffffffffULL) || (lba_in_sectors >= 0xffffffffULL))) {
sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
"kernel compiled with support for large block "
"devices.\n");
@@ -2162,6 +2165,7 @@ static int read_capacity_10(struct scsi_
int the_result;
int retries = 3, reset_retries = READ_CAPACITY_RETRIES_ON_RESET;
sector_t lba;
+ unsigned long long lba_in_sectors;
unsigned sector_size;
do {
@@ -2208,7 +2212,10 @@ static int read_capacity_10(struct scsi_
return sector_size;
}
- if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) {
+ /* Make sure logical_to_sectors() won't overflow */
+ lba_in_sectors = ((unsigned long long) lba) << (ilog2(sector_size) - 9);
+ if ((sizeof(sdkp->capacity) == 4) &&
+ (lba_in_sectors >= 0xffffffffULL)) {
sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
"kernel compiled with support for large block "
"devices.\n");
next reply other threads:[~2017-02-27 15:32 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-27 15:22 Steven J. Magnani [this message]
2017-02-27 16:13 ` Bart Van Assche
2017-02-27 17:13 ` Steve Magnani
2017-02-27 18:57 ` Bart Van Assche
2017-02-28 3:18 ` Martin K. Petersen
2017-02-28 13:53 ` Steve Magnani
2017-04-04 23:35 ` Martin K. Petersen
2017-04-04 23:54 ` Bart Van Assche
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=1488208949-3811-1-git-send-email-steve@digidescorp.com \
--to=steve.magnani@digidescorp.com \
--cc=jejb@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=steve@digidescorp.com \
/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
Powered by JetHome