Commit 35bb670d authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
 "Two fixes: one in the ufs driver fixing an obvious memory leak and the
  other (with a core flag based update) trying to prevent USB crashes by
  stopping the core from issuing a request for the I/O Hints mode page"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: usb: uas: Do not query the IO Advice Hints Grouping mode page for USB/UAS devices
  scsi: core: Introduce the BLIST_SKIP_IO_HINTS flag
  scsi: ufs: core: Free memory allocated for model before reinit
parents d6c94157 57619f3c
...@@ -63,6 +63,7 @@ ...@@ -63,6 +63,7 @@
#include <scsi/scsi_cmnd.h> #include <scsi/scsi_cmnd.h>
#include <scsi/scsi_dbg.h> #include <scsi/scsi_dbg.h>
#include <scsi/scsi_device.h> #include <scsi/scsi_device.h>
#include <scsi/scsi_devinfo.h>
#include <scsi/scsi_driver.h> #include <scsi/scsi_driver.h>
#include <scsi/scsi_eh.h> #include <scsi/scsi_eh.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
...@@ -3118,6 +3119,9 @@ static void sd_read_io_hints(struct scsi_disk *sdkp, unsigned char *buffer) ...@@ -3118,6 +3119,9 @@ static void sd_read_io_hints(struct scsi_disk *sdkp, unsigned char *buffer)
struct scsi_mode_data data; struct scsi_mode_data data;
int res; int res;
if (sdp->sdev_bflags & BLIST_SKIP_IO_HINTS)
return;
res = scsi_mode_sense(sdp, /*dbd=*/0x8, /*modepage=*/0x0a, res = scsi_mode_sense(sdp, /*dbd=*/0x8, /*modepage=*/0x0a,
/*subpage=*/0x05, buffer, SD_BUF_SIZE, SD_TIMEOUT, /*subpage=*/0x05, buffer, SD_BUF_SIZE, SD_TIMEOUT,
sdkp->max_retries, &data, &sshdr); sdkp->max_retries, &data, &sshdr);
......
...@@ -8787,6 +8787,7 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool init_dev_params) ...@@ -8787,6 +8787,7 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool init_dev_params)
(hba->quirks & UFSHCD_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH)) { (hba->quirks & UFSHCD_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH)) {
/* Reset the device and controller before doing reinit */ /* Reset the device and controller before doing reinit */
ufshcd_device_reset(hba); ufshcd_device_reset(hba);
ufs_put_device_desc(hba);
ufshcd_hba_stop(hba); ufshcd_hba_stop(hba);
ufshcd_vops_reinit_notify(hba); ufshcd_vops_reinit_notify(hba);
ret = ufshcd_hba_enable(hba); ret = ufshcd_hba_enable(hba);
......
...@@ -79,6 +79,12 @@ static int slave_alloc (struct scsi_device *sdev) ...@@ -79,6 +79,12 @@ static int slave_alloc (struct scsi_device *sdev)
if (us->protocol == USB_PR_BULK && us->max_lun > 0) if (us->protocol == USB_PR_BULK && us->max_lun > 0)
sdev->sdev_bflags |= BLIST_FORCELUN; sdev->sdev_bflags |= BLIST_FORCELUN;
/*
* Some USB storage devices reset if the IO advice hints grouping mode
* page is queried. Hence skip that mode page.
*/
sdev->sdev_bflags |= BLIST_SKIP_IO_HINTS;
return 0; return 0;
} }
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <scsi/scsi.h> #include <scsi/scsi.h>
#include <scsi/scsi_eh.h> #include <scsi/scsi_eh.h>
#include <scsi/scsi_dbg.h> #include <scsi/scsi_dbg.h>
#include <scsi/scsi_devinfo.h>
#include <scsi/scsi_cmnd.h> #include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h> #include <scsi/scsi_device.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
...@@ -820,6 +821,12 @@ static int uas_slave_alloc(struct scsi_device *sdev) ...@@ -820,6 +821,12 @@ static int uas_slave_alloc(struct scsi_device *sdev)
struct uas_dev_info *devinfo = struct uas_dev_info *devinfo =
(struct uas_dev_info *)sdev->host->hostdata; (struct uas_dev_info *)sdev->host->hostdata;
/*
* Some USB storage devices reset if the IO advice hints grouping mode
* page is queried. Hence skip that mode page.
*/
sdev->sdev_bflags |= BLIST_SKIP_IO_HINTS;
sdev->hostdata = devinfo; sdev->hostdata = devinfo;
return 0; return 0;
} }
......
...@@ -69,8 +69,10 @@ ...@@ -69,8 +69,10 @@
#define BLIST_RETRY_ITF ((__force blist_flags_t)(1ULL << 32)) #define BLIST_RETRY_ITF ((__force blist_flags_t)(1ULL << 32))
/* Always retry ABORTED_COMMAND with ASC 0xc1 */ /* Always retry ABORTED_COMMAND with ASC 0xc1 */
#define BLIST_RETRY_ASC_C1 ((__force blist_flags_t)(1ULL << 33)) #define BLIST_RETRY_ASC_C1 ((__force blist_flags_t)(1ULL << 33))
/* Do not query the IO Advice Hints Grouping mode page */
#define BLIST_SKIP_IO_HINTS ((__force blist_flags_t)(1ULL << 34))
#define __BLIST_LAST_USED BLIST_RETRY_ASC_C1 #define __BLIST_LAST_USED BLIST_SKIP_IO_HINTS
#define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \ #define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \
(__force blist_flags_t) \ (__force blist_flags_t) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment