From: "Martin K. Petersen" <martin.petersen@oracle.com>
To: linux-scsi@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [PATCH 3 of 3] sd: Export preferred I/O sizes
Date: Thu, 05 Jun 2008 01:22:52 -0400 [thread overview]
Message-ID: <dba6ce5d97b8aa7d0e1c.1212643372@sermon.lab.mkp.net> (raw)
In-Reply-To: <patchbomb.1212643369@sermon.lab.mkp.net>
1 file changed, 67 insertions(+)
drivers/scsi/sd.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++
Make storage devices that support the Block Limits VPD export the
optimal transfer length granularity and the optimal transfer length to
the block layer.
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
---
diff -r c7132bad88f3 -r dba6ce5d97b8 drivers/scsi/sd.c
--- a/drivers/scsi/sd.c Thu Jun 05 01:07:51 2008 -0400
+++ b/drivers/scsi/sd.c Thu Jun 05 01:07:51 2008 -0400
@@ -1534,6 +1534,72 @@
sdkp->DPOFUA = 0;
}
+static int sd_vpd_inquiry(struct scsi_disk *sdkp, unsigned char *buffer, u8 page, u8 len)
+{
+ int result;
+ unsigned char cmd[16];
+ struct scsi_sense_hdr sshdr;
+
+ memset(cmd, 0, 16);
+ cmd[0] = INQUIRY;
+ cmd[1] = 1; /* EVPD */
+ cmd[2] = page; /* VPD page */
+ cmd[3] = len;
+
+ result = scsi_execute_req(sdkp->device, cmd, DMA_FROM_DEVICE, buffer,
+ len, &sshdr, SD_TIMEOUT, SD_MAX_RETRIES);
+
+ if (media_not_present(sdkp, &sshdr))
+ return -EIO;
+
+ if (result) {
+ sd_printk(KERN_ERR, sdkp, "EVPD Inquiry failed\n");
+ return -EIO;
+ }
+
+ if (buffer[1] != page) {
+ sd_printk(KERN_ERR, sdkp, "Page code not %2x (%2x)\n", page,
+ buffer[1]);
+ return -EIO;
+ }
+
+ return buffer[3];
+}
+
+/**
+ * sd_block_limits - Query disk device for preferred I/O sizes.
+ * @disk: disk to query
+ * @buffer: temporary buffer to store inquiry response in
+ */
+static void sd_block_limits(struct scsi_disk *sdkp, unsigned char *buffer)
+{
+ int result, i, bl_found;
+
+ bl_found = 0;
+ result = sd_vpd_inquiry(sdkp, buffer, 0x0, 32); /* Supported Pages list */
+
+ if (result < 0 || buffer[4] != 0)
+ return;
+
+ for (i = 0 ; i < buffer[3] ; i++)
+ if (buffer[4+i] == 0xb0)
+ bl_found = 1;
+
+ if (bl_found == 0)
+ return;
+
+ result = sd_vpd_inquiry(sdkp, buffer, 0xb0, 16); /* Block Limits VPD */
+
+ if (result < 0 || buffer[3] != 12)
+ return;
+
+ disk_set_io_hints(sdkp->disk, 0, ((buffer[6] << 8) | buffer[7])
+ * sdkp->device->sector_size,
+ ((buffer[12] << 24) | (buffer[13] << 16)
+ | (buffer[14] << 8) | buffer[15])
+ * sdkp->device->sector_size);
+}
+
/**
* sd_revalidate_disk - called the first time a new disk is seen,
* performs disk spin up, read_capacity, etc.
@@ -1579,6 +1645,7 @@
*/
if (sdkp->media_present) {
sd_read_capacity(sdkp, buffer);
+ sd_block_limits(sdkp, buffer);
sd_read_write_protect_flag(sdkp, buffer);
sd_read_cache_type(sdkp, buffer);
}
next prev parent reply other threads:[~2008-06-05 5:24 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-05 5:22 [PATCH 0 of 3] [RFC] I/O Hints Martin K. Petersen
2008-06-05 5:22 ` [PATCH 1 of 3] block: Export I/O hints for block devices and partitions Martin K. Petersen
2008-06-05 14:42 ` James Bottomley
2008-06-06 1:18 ` Martin K. Petersen
2008-06-06 14:21 ` Jamie Lokier
2008-06-05 5:22 ` [PATCH 2 of 3] md: Export preferred I/O sizes and physical alignment Martin K. Petersen
2008-06-05 5:22 ` Martin K. Petersen [this message]
2008-06-05 11:25 ` [PATCH 3 of 3] sd: Export preferred I/O sizes Boaz Harrosh
2008-06-05 6:27 ` [PATCH 0 of 3] [RFC] I/O Hints Andreas Dilger
2008-06-05 10:32 ` Jamie Lokier
2008-06-05 12:35 ` Matthew Wilcox
2008-06-05 17:02 ` Dan Williams
2008-06-06 1:03 ` Martin K. Petersen
2008-06-06 14:02 ` Jamie Lokier
2008-06-06 16:48 ` Martin K. Petersen
2008-06-09 10:47 ` Jamie Lokier
2008-06-10 2:17 ` Martin K. Petersen
2008-06-05 10:40 ` Jamie Lokier
2008-06-05 19:19 ` Andreas Dilger
2008-06-06 12:55 ` Jamie Lokier
2008-06-06 1:16 ` Martin K. Petersen
2008-06-06 4:51 ` Dave Chinner
2008-06-06 16:53 ` Martin K. Petersen
2008-06-07 20:54 ` Dave Chinner
2008-06-09 15:05 ` Martin K. Petersen
2008-06-06 12:52 ` Jamie Lokier
2008-06-06 14:26 ` Jamie Lokier
2008-06-06 16:56 ` Martin K. Petersen
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=dba6ce5d97b8aa7d0e1c.1212643372@sermon.lab.mkp.net \
--to=martin.petersen@oracle.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
/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).