From: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> This patch (as1347) makes some adjustments to the way usb-storage handles the request-queue parameters. USB host controllers are able to handle arbitrarily long scatter-gather lists, since they are limited only by main memory and not by the controller hardware. Hence the sg_tablesize field in the host template can be increased to the maximum value. Drivers like usb-storage aren't supposed to touch the queue's max_sectors parameter; instead they are supposed to use the max_hw_sectors value. Accordingly, the patch replaces calls of queue_max_sectors() with calls of queue_max_hw_sectors(). Oddly enough, the blk_queue_max_sectors() routine is nevertheless still appropriate. The existing code imposes a limit of SCSI_DEFAULT_MAX_SECTORS (1024) on the values accepted by the max_sectors attribute file. There's no reason not to accept larger values, so the limit is removed. (It would be nice to change the file's name to max_hw_sectors, but the old name is already a well-established API.) Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> CC: Matthew Dharm <mdharm-usb@xxxxxxxxxxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx> --- drivers/usb/storage/scsiglue.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index aadc16b..4cc0355 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -133,7 +133,7 @@ static int slave_configure(struct scsi_device *sdev) if (us->fflags & US_FL_MAX_SECTORS_MIN) max_sectors = PAGE_CACHE_SIZE >> 9; - if (queue_max_sectors(sdev->request_queue) > max_sectors) + if (queue_max_hw_sectors(sdev->request_queue) > max_sectors) blk_queue_max_hw_sectors(sdev->request_queue, max_sectors); } else if (sdev->type == TYPE_TAPE) { @@ -484,7 +484,7 @@ static ssize_t show_max_sectors(struct device *dev, struct device_attribute *att { struct scsi_device *sdev = to_scsi_device(dev); - return sprintf(buf, "%u\n", queue_max_sectors(sdev->request_queue)); + return sprintf(buf, "%u\n", queue_max_hw_sectors(sdev->request_queue)); } /* Input routine for the sysfs max_sectors file */ @@ -494,9 +494,9 @@ static ssize_t store_max_sectors(struct device *dev, struct device_attribute *at struct scsi_device *sdev = to_scsi_device(dev); unsigned short ms; - if (sscanf(buf, "%hu", &ms) > 0 && ms <= SCSI_DEFAULT_MAX_SECTORS) { + if (sscanf(buf, "%hu", &ms) > 0) { blk_queue_max_hw_sectors(sdev->request_queue, ms); - return strlen(buf); + return count; } return -EINVAL; } @@ -539,7 +539,7 @@ struct scsi_host_template usb_stor_host_template = { .slave_configure = slave_configure, /* lots of sg segments can be handled */ - .sg_tablesize = SG_ALL, + .sg_tablesize = SCSI_MAX_SG_CHAIN_SEGMENTS, /* limit the total size of a transfer to 120 KB */ .max_sectors = 240, -- 1.7.0.1 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html