From: "Martin K. Petersen" <martin.petersen@oracle.com>
To: jaxboe@fusionio.com, James.Bottomley@hansenpartnership.com,
snitzer@redhat.com, linux-scsi@vger.kernel.org
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Subject: [PATCH 2/2] sd: Fix overflow with big physical blocks
Date: Mon, 27 Sep 2010 12:41:04 -0400 [thread overview]
Message-ID: <1285605664-27027-3-git-send-email-martin.petersen@oracle.com> (raw)
In-Reply-To: <1285605664-27027-1-git-send-email-martin.petersen@oracle.com>
The hw_sector_size variable could overflow if a device reported huge
physical blocks. Switch to the more accurate physical_block_size
terminology and make sure we use an unsigned int to match the range
permitted by READ CAPACITY(16).
Also print a warning of the physical block size exceeds the page size.
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
---
drivers/scsi/sd.c | 19 +++++++++++++------
drivers/scsi/sd.h | 2 +-
2 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index ffa0689..1c14436 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1554,7 +1554,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
}
/* Logical blocks per physical block exponent */
- sdkp->hw_sector_size = (1 << (buffer[13] & 0xf)) * sector_size;
+ sdkp->physical_block_size = (1 << (buffer[13] & 0xf)) * sector_size;
/* Lowest aligned logical block */
alignment = ((buffer[14] & 0x3f) << 8 | buffer[15]) * sector_size;
@@ -1567,7 +1567,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
struct request_queue *q = sdp->request_queue;
sdkp->thin_provisioning = 1;
- q->limits.discard_granularity = sdkp->hw_sector_size;
+ q->limits.discard_granularity = sdkp->physical_block_size;
q->limits.max_discard_sectors = 0xffffffff;
if (buffer[14] & 0x40) /* TPRZ */
@@ -1635,7 +1635,7 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp,
}
sdkp->capacity = lba + 1;
- sdkp->hw_sector_size = sector_size;
+ sdkp->physical_block_size = sector_size;
return sector_size;
}
@@ -1756,10 +1756,16 @@ got_data:
(unsigned long long)sdkp->capacity,
sector_size, cap_str_10, cap_str_2);
- if (sdkp->hw_sector_size != sector_size)
+ if (sdkp->physical_block_size != sector_size)
sd_printk(KERN_NOTICE, sdkp,
"%u-byte physical blocks\n",
- sdkp->hw_sector_size);
+ sdkp->physical_block_size);
+
+ if (sdkp->physical_block_size > PAGE_CACHE_SIZE)
+ sd_printk(KERN_WARNING, sdkp,
+ "physical block size %u is bigger "
+ "than system page size\n",
+ sdkp->physical_block_size);
}
}
@@ -1773,7 +1779,8 @@ got_data:
else if (sector_size == 256)
sdkp->capacity >>= 1;
- blk_queue_physical_block_size(sdp->request_queue, sdkp->hw_sector_size);
+ blk_queue_physical_block_size(sdp->request_queue,
+ sdkp->physical_block_size);
sdkp->device->sector_size = sector_size;
}
diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h
index f81a930..f947140 100644
--- a/drivers/scsi/sd.h
+++ b/drivers/scsi/sd.h
@@ -50,7 +50,7 @@ struct scsi_disk {
atomic_t openers;
sector_t capacity; /* size in 512-byte sectors */
u32 index;
- unsigned short hw_sector_size;
+ unsigned int physical_block_size;
u8 media_present;
u8 write_prot;
u8 protection_type;/* Data Integrity Field */
--
1.7.2.2
next prev parent reply other threads:[~2010-09-27 16:41 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-27 16:41 I/O topology fixes for big physical block size Martin K. Petersen
2010-09-27 16:41 ` [PATCH 1/2] block: Ensure physical block size is unsigned int Martin K. Petersen
2010-09-27 17:40 ` Mike Snitzer
2010-10-08 5:15 ` Martin K. Petersen
2010-10-13 19:12 ` Mike Snitzer
2010-10-13 19:15 ` Jens Axboe
2010-09-27 16:41 ` Martin K. Petersen [this message]
2010-09-27 17:42 ` [PATCH 2/2] sd: Fix overflow with big physical blocks Mike Snitzer
2010-09-27 18:13 ` [PATCH] block: eliminate potential for infinite loop in blkdev_issue_discard Mike Snitzer
2010-10-14 21:37 ` Mike Snitzer
2010-10-15 11:05 ` Jens Axboe
2010-09-27 16:54 ` I/O topology fixes for big physical block size Jens Axboe
2010-09-27 17:20 ` Martin K. Petersen
2010-09-27 22:21 ` Jens Axboe
2010-09-27 22:36 ` Martin K. Petersen
2010-09-27 23:15 ` Mike Snitzer
2010-09-28 4:30 ` Jens Axboe
2010-09-28 5:20 ` Eric Sandeen
2010-09-28 14:15 ` Mike Snitzer
2010-09-28 20:57 ` Ted Ts'o
2010-09-28 21:24 ` Martin K. Petersen
2010-09-28 21:36 ` Eric Sandeen
2010-09-30 16:30 ` Ted Ts'o
2010-09-30 17:07 ` Eric Sandeen
[not found] ` <4CA4C3B6.9000104@redhat.com>
2010-09-30 17:33 ` Mike Snitzer
2010-10-01 14:24 ` Ted Ts'o
2010-10-01 22:19 ` Martin K. Petersen
2010-10-02 2:31 ` Ted Ts'o
2010-10-04 19:49 ` Martin K. Petersen
2010-09-27 17:23 ` Mike Snitzer
2010-09-27 21:58 ` James Bottomley
2010-09-27 22:03 ` Jens Axboe
2010-09-27 22:14 ` Martin K. Petersen
2010-09-27 22:24 ` Jens Axboe
2010-09-28 18:48 ` Martin K. Petersen
2010-09-28 18:54 ` Mike Snitzer
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=1285605664-27027-3-git-send-email-martin.petersen@oracle.com \
--to=martin.petersen@oracle.com \
--cc=James.Bottomley@hansenpartnership.com \
--cc=jaxboe@fusionio.com \
--cc=linux-scsi@vger.kernel.org \
--cc=snitzer@redhat.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;
as well as URLs for NNTP newsgroup(s).