Message ID | 20240612203735.4108690-4-bvanassche@acm.org |
---|---|
State | New |
Headers | show |
Series | Do not read the IO hints VPD page from USB storage devices | expand |
On Wed, Jun 12, 2024 at 01:37:34PM -0700, Bart Van Assche wrote: > Recently it was reported that the following USB storage devices are unusable > with Linux kernel 6.9: > * Kingston DataTraveler G2 > * Garmin FR35 > > This is because attempting to read the IO hint VPD page causes these devices > to reset. Hence do not read the IO hint VPD page from USB storage devices. > > Cc: Alan Stern <stern@rowland.harvard.edu> > Cc: linux-usb@vger.kernel.org > Cc: Joao Machado <jocrismachado@gmail.com> > Cc: Andy Shevchenko <andy.shevchenko@gmail.com> > Cc: Christian Heusel <christian@heusel.eu> > Cc: stable@vger.kernel.org > Fixes: 4f53138fffc2 ("scsi: sd: Translate data lifetime information") > Reported-by: Joao Machado <jocrismachado@gmail.com> > Closes: https://lore.kernel.org/linux-scsi/20240130214911.1863909-1-bvanassche@acm.org/T/#mf4e3410d8f210454d7e4c3d1fb5c0f41e651b85f > Tested-by: Andy Shevchenko <andy.shevchenko@gmail.com> > Bisected-by: Christian Heusel <christian@heusel.eu> > Reported-by: Andy Shevchenko <andy.shevchenko@gmail.com> > Closes: https://lore.kernel.org/linux-scsi/CACLx9VdpUanftfPo2jVAqXdcWe8Y43MsDeZmMPooTzVaVJAh2w@mail.gmail.com/ > Signed-off-by: Bart Van Assche <bvanassche@acm.org> > --- Acked-by: Alan Stern <stern@rowland.harvard.edu> > drivers/usb/storage/scsiglue.c | 6 ++++++ > drivers/usb/storage/uas.c | 7 +++++++ > 2 files changed, 13 insertions(+) > > diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c > index b31464740f6c..b4cf0349fd0d 100644 > --- a/drivers/usb/storage/scsiglue.c > +++ b/drivers/usb/storage/scsiglue.c > @@ -79,6 +79,12 @@ static int slave_alloc (struct scsi_device *sdev) > if (us->protocol == USB_PR_BULK && us->max_lun > 0) > sdev->sdev_bflags |= BLIST_FORCELUN; > > + /* > + * Some USB storage devices reset if the IO hints VPD page is queried. > + * Hence skip that VPD page. > + */ > + sdev->sdev_bflags |= BLIST_SKIP_IO_HINTS; > + > return 0; > } > > diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c > index a48870a87a29..77fdfb6a90c8 100644 > --- a/drivers/usb/storage/uas.c > +++ b/drivers/usb/storage/uas.c > @@ -21,6 +21,7 @@ > #include <scsi/scsi.h> > #include <scsi/scsi_eh.h> > #include <scsi/scsi_dbg.h> > +#include <scsi/scsi_devinfo.h> > #include <scsi/scsi_cmnd.h> > #include <scsi/scsi_device.h> > #include <scsi/scsi_host.h> > @@ -820,6 +821,12 @@ static int uas_slave_alloc(struct scsi_device *sdev) > struct uas_dev_info *devinfo = > (struct uas_dev_info *)sdev->host->hostdata; > > + /* > + * Some USB storage devices reset if the IO hints VPD page is queried. > + * Hence skip that VPD page. > + */ > + sdev->sdev_bflags |= BLIST_SKIP_IO_HINTS; > + > sdev->hostdata = devinfo; > return 0; > }
On Wed, Jun 12, 2024 at 10:37 PM Bart Van Assche <bvanassche@acm.org> wrote: > > Recently it was reported that the following USB storage devices are unusable > with Linux kernel 6.9: > * Kingston DataTraveler G2 > * Garmin FR35 > > This is because attempting to read the IO hint VPD page causes these devices > to reset. Hence do not read the IO hint VPD page from USB storage devices. I have commented on v1, same applicable here. Not that it's a big deal for this change, but in general can you follow the advice given there?
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index b31464740f6c..b4cf0349fd0d 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -79,6 +79,12 @@ static int slave_alloc (struct scsi_device *sdev) if (us->protocol == USB_PR_BULK && us->max_lun > 0) sdev->sdev_bflags |= BLIST_FORCELUN; + /* + * Some USB storage devices reset if the IO hints VPD page is queried. + * Hence skip that VPD page. + */ + sdev->sdev_bflags |= BLIST_SKIP_IO_HINTS; + return 0; } diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index a48870a87a29..77fdfb6a90c8 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c @@ -21,6 +21,7 @@ #include <scsi/scsi.h> #include <scsi/scsi_eh.h> #include <scsi/scsi_dbg.h> +#include <scsi/scsi_devinfo.h> #include <scsi/scsi_cmnd.h> #include <scsi/scsi_device.h> #include <scsi/scsi_host.h> @@ -820,6 +821,12 @@ static int uas_slave_alloc(struct scsi_device *sdev) struct uas_dev_info *devinfo = (struct uas_dev_info *)sdev->host->hostdata; + /* + * Some USB storage devices reset if the IO hints VPD page is queried. + * Hence skip that VPD page. + */ + sdev->sdev_bflags |= BLIST_SKIP_IO_HINTS; + sdev->hostdata = devinfo; return 0; }