Message ID | 1423253831-23390-1-git-send-email-chris.j.arges@canonical.com |
---|---|
State | New |
Headers | show |
Looks ok, confirmed upstream and stable.
On Fri, Feb 06, 2015 at 02:17:11PM -0600, Chris J Arges wrote: > From: Brian King <brking@linux.vnet.ibm.com> > > BugLink: http://bugs.launchpad.net/bugs/1418339 > > The following patch fixes an issue observed with 4k sector disks > where the max_hw_sectors attribute was getting set too large in > sd_revalidate_disk. Since sdkp->max_xfer_blocks is in units > of SCSI logical blocks and queue_max_hw_sectors is in units of > 512 byte blocks, on a 4k sector disk, every time we went through > sd_revalidate_disk, we were taking the current value of > queue_max_hw_sectors and increasing it by a factor of 8. Fix > this by only shifting sdkp->max_xfer_blocks. > > Cc: stable@vger.kernel.org > Signed-off-by: Brian King <brking@linux.vnet.ibm.com> > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> > Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> > Signed-off-by: Christoph Hellwig <hch@lst.de> > (cherry picked from commit 3a9794d32984b67a6d8992226918618f0e51e5d5) > Signed-off-by: Chris J Arges <chris.j.arges@canonical.com> > --- > drivers/scsi/sd.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c > index cfba74c..dd8c8d6 100644 > --- a/drivers/scsi/sd.c > +++ b/drivers/scsi/sd.c > @@ -2818,9 +2818,11 @@ static int sd_revalidate_disk(struct gendisk *disk) > */ > sd_set_flush_flag(sdkp); > > - max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), > - sdkp->max_xfer_blocks); > + max_xfer = sdkp->max_xfer_blocks; > max_xfer <<= ilog2(sdp->sector_size) - 9; > + > + max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), > + max_xfer); > blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer); > set_capacity(disk, sdkp->capacity); > sd_config_write_same(sdkp); Looks to do something sane, and be upstream and stable. Acked-by: Andy Whitcroft <apw@canonical.com> -apw
This got picked up in Vivid with the v3.18.7 rebase currently on master-next. Thanks, Leann On Fri, 2015-02-06 at 14:17 -0600, Chris J Arges wrote: > From: Brian King <brking@linux.vnet.ibm.com> > > BugLink: http://bugs.launchpad.net/bugs/1418339 > > The following patch fixes an issue observed with 4k sector disks > where the max_hw_sectors attribute was getting set too large in > sd_revalidate_disk. Since sdkp->max_xfer_blocks is in units > of SCSI logical blocks and queue_max_hw_sectors is in units of > 512 byte blocks, on a 4k sector disk, every time we went through > sd_revalidate_disk, we were taking the current value of > queue_max_hw_sectors and increasing it by a factor of 8. Fix > this by only shifting sdkp->max_xfer_blocks. > > Cc: stable@vger.kernel.org > Signed-off-by: Brian King <brking@linux.vnet.ibm.com> > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> > Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> > Signed-off-by: Christoph Hellwig <hch@lst.de> > (cherry picked from commit 3a9794d32984b67a6d8992226918618f0e51e5d5) > Signed-off-by: Chris J Arges <chris.j.arges@canonical.com> > --- > drivers/scsi/sd.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c > index cfba74c..dd8c8d6 100644 > --- a/drivers/scsi/sd.c > +++ b/drivers/scsi/sd.c > @@ -2818,9 +2818,11 @@ static int sd_revalidate_disk(struct gendisk *disk) > */ > sd_set_flush_flag(sdkp); > > - max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), > - sdkp->max_xfer_blocks); > + max_xfer = sdkp->max_xfer_blocks; > max_xfer <<= ilog2(sdp->sector_size) - 9; > + > + max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), > + max_xfer); > blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer); > set_capacity(disk, sdkp->capacity); > sd_config_write_same(sdkp); > -- > 1.9.1 > >
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index cfba74c..dd8c8d6 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -2818,9 +2818,11 @@ static int sd_revalidate_disk(struct gendisk *disk) */ sd_set_flush_flag(sdkp); - max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), - sdkp->max_xfer_blocks); + max_xfer = sdkp->max_xfer_blocks; max_xfer <<= ilog2(sdp->sector_size) - 9; + + max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), + max_xfer); blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer); set_capacity(disk, sdkp->capacity); sd_config_write_same(sdkp);