[PATCH] sd: preserve sysfs updates to max_sectors_kb

Don Brace
2017-08-18T21:00:32Z

prevent systemd-udevd from changing a device's sysfs entry
max_sectors_kb back to the default value.
- max_sectors_kb can be tweaked for better performance.
- udev can be triggered by sg_logs -t or scsi_temperature, ...
- sd_revalidate_disk is called from udev by ioctl BLKRRPART

Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/sd.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index bea36ad..457dc7c 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -3055,6 +3055,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
sector_t old_capacity = sdkp->capacity;
unsigned char *buffer;
unsigned int dev_max, rw_max;
+ unsigned int max_sectors;

SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp,
"sd_revalidate_disk\n"));
@@ -3128,9 +3129,14 @@ static int sd_revalidate_disk(struct gendisk *disk)
rw_max = min_not_zero(logical_to_sectors(sdp, dev_max),
(sector_t)BLK_DEF_MAX_SECTORS);

- /* Combine with controller limits */
- q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q));
+ /* Check for max_sectors_kb update through sysfs */
+ if (q->limits.max_sectors < min(rw_max, queue_max_hw_sectors(q)))
+ max_sectors = q->limits.max_sectors;
+ else
+ max_sectors = min(rw_max, queue_max_hw_sectors(q));

+ /* Combine with controller limits */
+ q->limits.max_sectors = max_sectors;
set_capacity(disk, logical_to_sectors(sdp, sdkp->capacity));
sd_config_write_same(sdkp);
kfree(buffer);