SCSI fixes for 4.3-rc4
James Bottomley
maintainerThis is three essential bug fixes for various SCSI parts. The only affected users are SCSI multi-path via device handler (basically all the enterprise) and mvsas users. The dh bugs are an async entanglement in boot resulting in a serious WARN_ON trip and a use after free on remove leading to a crash with strict memory accounting. The mvsas bug manifests as a null deref oops but only on abort sequences; however, these can commonly occur with SATA attached devices, hence the fix.
The patch is available here:
git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git scsi-fixes
The short changelog is:
Christoph Hellwig (1):
scsi_dh: don't try to load a device handler during async probing
Dāvis Mosāns (1):
mvsas: Fix NULL pointer dereference in mvs_slot_task_free
Junichi Nomura (1):
scsi_dh: fix use-after-free when removing scsi device
And the diffstat:
drivers/scsi/mvsas/mv_sas.c | 2 ++ drivers/scsi/scsi_dh.c | 8 ++++++-- drivers/scsi/scsi_priv.h | 2 ++ drivers/scsi/scsi_sysfs.c | 2 ++ 4 files changed, 12 insertions(+), 2 deletions(-)
With full diff below.
James
---
drivers/scsi/mvsas/mv_sas.c +2 -0
@@ -887,6 +887,8 @@ static void mvs_slot_free(struct mvs_info *mvi, u32 rx_desc)static void mvs_slot_task_free (struct mvs_info *mvi,struct sas_task *task,struct mvs_slot_info *slot,u32 slot_idx) { +if (!slot) +return ;if (!slot->task)return ;if (!sas_protocol_ata (task->task_proto))
drivers/scsi/scsi_dh.c +6 -2
@@ -226,16 +226,20 @@ int scsi_dh_add_device(struct scsi_device *sdev) drv =scsi_dh_find_driver (sdev);if (drv) - devinfo =scsi_dh_lookup (drv); + devinfo =__scsi_dh_lookup (drv);if (devinfo) err =scsi_dh_handler_attach (sdev, devinfo);return err; } -void scsi_dh_remove_device (struct scsi_device *sdev) +void scsi_dh_release_device (struct scsi_device *sdev) {if (sdev->handler)scsi_dh_handler_detach (sdev); +} + +void scsi_dh_remove_device (struct scsi_device *sdev) +{device_remove_file (&sdev->sdev_gendev, &scsi_dh_state_attr); }
drivers/scsi/scsi_priv.h +2 -0
@@ -173,9 +173,11 @@ extern struct async_domain scsi_sd_probe_domain;/* scsi_dh.c */ #ifdef CONFIG_SCSI_DH int scsi_dh_add_device (struct scsi_device *sdev); +void scsi_dh_release_device (struct scsi_device *sdev);void scsi_dh_remove_device (struct scsi_device *sdev);#else static inline int scsi_dh_add_device (struct scsi_device *sdev) {return 0 ; } +static inline void scsi_dh_release_device (struct scsi_device *sdev) { }static inline void scsi_dh_remove_device (struct scsi_device *sdev) { }#endif
drivers/scsi/scsi_sysfs.c +2 -0
@@ -399,6 +399,8 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work) sdev = container_of(work, struct scsi_device, ew.work); +scsi_dh_release_device (sdev); + parent = sdev->sdev_gendev.parent;spin_lock_irqsave (sdev->host->host_lock, flags);
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html