mirror of https://gitee.com/openkylin/linux.git
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: [SCSI] bsg: fix oops on remove [SCSI] fusion: default MSI to disabled for SPI and FC controllers [SCSI] ipr: Fix HDIO_GET_IDENTITY oops for SATA devices [SCSI] mptspi: fix oops in mptspi_dv_renegotiate_work() [SCSI] erase invalid data returned by device
This commit is contained in:
commit
de72aa4c2b
|
@ -709,11 +709,12 @@ static void bsg_kref_release_function(struct kref *kref)
|
||||||
{
|
{
|
||||||
struct bsg_class_device *bcd =
|
struct bsg_class_device *bcd =
|
||||||
container_of(kref, struct bsg_class_device, ref);
|
container_of(kref, struct bsg_class_device, ref);
|
||||||
|
struct device *parent = bcd->parent;
|
||||||
|
|
||||||
if (bcd->release)
|
if (bcd->release)
|
||||||
bcd->release(bcd->parent);
|
bcd->release(bcd->parent);
|
||||||
|
|
||||||
put_device(bcd->parent);
|
put_device(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bsg_put_device(struct bsg_device *bd)
|
static int bsg_put_device(struct bsg_device *bd)
|
||||||
|
|
|
@ -1686,9 +1686,14 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||||
ioc->bus_type = SAS;
|
ioc->bus_type = SAS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioc->bus_type == SAS && mpt_msi_enable == -1)
|
if (mpt_msi_enable == -1) {
|
||||||
ioc->msi_enable = 1;
|
/* Enable on SAS, disable on FC and SPI */
|
||||||
else
|
if (ioc->bus_type == SAS)
|
||||||
|
ioc->msi_enable = 1;
|
||||||
|
else
|
||||||
|
ioc->msi_enable = 0;
|
||||||
|
} else
|
||||||
|
/* follow flag: 0 - disable; 1 - enable */
|
||||||
ioc->msi_enable = mpt_msi_enable;
|
ioc->msi_enable = mpt_msi_enable;
|
||||||
|
|
||||||
if (ioc->errata_flag_1064)
|
if (ioc->errata_flag_1064)
|
||||||
|
|
|
@ -1266,13 +1266,18 @@ mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd)
|
||||||
static int
|
static int
|
||||||
mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
||||||
{
|
{
|
||||||
struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = mptscsih_ioc_reset(ioc, reset_phase);
|
rc = mptscsih_ioc_reset(ioc, reset_phase);
|
||||||
|
|
||||||
if (reset_phase == MPT_IOC_POST_RESET)
|
/* only try to do a renegotiation if we're properly set up
|
||||||
|
* if we get an ioc fault on bringup, ioc->sh will be NULL */
|
||||||
|
if (reset_phase == MPT_IOC_POST_RESET &&
|
||||||
|
ioc->sh) {
|
||||||
|
struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
|
||||||
|
|
||||||
mptspi_dv_renegotiate(hd);
|
mptspi_dv_renegotiate(hd);
|
||||||
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/libata.h>
|
#include <linux/libata.h>
|
||||||
|
#include <linux/hdreg.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
@ -4913,8 +4914,11 @@ static int ipr_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
|
||||||
struct ipr_resource_entry *res;
|
struct ipr_resource_entry *res;
|
||||||
|
|
||||||
res = (struct ipr_resource_entry *)sdev->hostdata;
|
res = (struct ipr_resource_entry *)sdev->hostdata;
|
||||||
if (res && ipr_is_gata(res))
|
if (res && ipr_is_gata(res)) {
|
||||||
|
if (cmd == HDIO_GET_IDENTITY)
|
||||||
|
return -ENOTTY;
|
||||||
return ata_scsi_ioctl(sdev, cmd, arg);
|
return ata_scsi_ioctl(sdev, cmd, arg);
|
||||||
|
}
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -207,6 +207,15 @@ int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd,
|
||||||
*/
|
*/
|
||||||
blk_execute_rq(req->q, NULL, req, 1);
|
blk_execute_rq(req->q, NULL, req, 1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some devices (USB mass-storage in particular) may transfer
|
||||||
|
* garbage data together with a residue indicating that the data
|
||||||
|
* is invalid. Prevent the garbage from being misinterpreted
|
||||||
|
* and prevent security leaks by zeroing out the excess data.
|
||||||
|
*/
|
||||||
|
if (unlikely(req->data_len > 0 && req->data_len <= bufflen))
|
||||||
|
memset(buffer + (bufflen - req->data_len), 0, req->data_len);
|
||||||
|
|
||||||
ret = req->errors;
|
ret = req->errors;
|
||||||
out:
|
out:
|
||||||
blk_put_request(req);
|
blk_put_request(req);
|
||||||
|
|
Loading…
Reference in New Issue