Commit d67e9111 authored by Linus Torvalds's avatar Linus Torvalds

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] a100u2w: fix bitmap lookup routine
  [SCSI] fix media change events for polled devices
  [SCSI] sd, sr: do not emit change event at device add
  [SCSI] mpt fusion: Power Management fixes for MPT SAS PCI-E controllers
  [SCSI] gdth: Allocate sense_buffer to prevent NULL pointer dereference
  [SCSI] arcmsr: fix iounmap error for Type B adapter
  [SCSI] isd200: Allocate sense_buffer for hacked up scsi_cmnd
  [SCSI] fix bsg queue oops with iscsi logout
  [SCSI] Fix dependency problems in SCSI drivers
  [SCSI] advansys: Fix bug in AdvLoadMicrocode
parents 00c04db9 28aef2f7
This diff is collapsed.
...@@ -1170,6 +1170,10 @@ mptscsih_shutdown(struct pci_dev *pdev) ...@@ -1170,6 +1170,10 @@ mptscsih_shutdown(struct pci_dev *pdev)
int int
mptscsih_suspend(struct pci_dev *pdev, pm_message_t state) mptscsih_suspend(struct pci_dev *pdev, pm_message_t state)
{ {
MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
scsi_block_requests(ioc->sh);
flush_scheduled_work();
mptscsih_shutdown(pdev); mptscsih_shutdown(pdev);
return mpt_suspend(pdev,state); return mpt_suspend(pdev,state);
} }
...@@ -1183,7 +1187,12 @@ mptscsih_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -1183,7 +1187,12 @@ mptscsih_suspend(struct pci_dev *pdev, pm_message_t state)
int int
mptscsih_resume(struct pci_dev *pdev) mptscsih_resume(struct pci_dev *pdev)
{ {
return mpt_resume(pdev); MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
int rc;
rc = mpt_resume(pdev);
scsi_unblock_requests(ioc->sh);
return rc;
} }
#endif #endif
......
...@@ -325,7 +325,7 @@ menuconfig SCSI_LOWLEVEL ...@@ -325,7 +325,7 @@ menuconfig SCSI_LOWLEVEL
depends on SCSI!=n depends on SCSI!=n
default y default y
if SCSI_LOWLEVEL if SCSI_LOWLEVEL && SCSI
config ISCSI_TCP config ISCSI_TCP
tristate "iSCSI Initiator over TCP/IP" tristate "iSCSI Initiator over TCP/IP"
......
...@@ -674,12 +674,13 @@ static struct orc_scb *__orc_alloc_scb(struct orc_host * host) ...@@ -674,12 +674,13 @@ static struct orc_scb *__orc_alloc_scb(struct orc_host * host)
for (index = 0; index < 32; index++) { for (index = 0; index < 32; index++) {
if ((host->allocation_map[channel][i] >> index) & 0x01) { if ((host->allocation_map[channel][i] >> index) & 0x01) {
host->allocation_map[channel][i] &= ~(1 << index); host->allocation_map[channel][i] &= ~(1 << index);
break; idx = index + 32 * i;
/*
* Translate the index to a structure instance
*/
return host->scb_virt + idx;
} }
} }
idx = index + 32 * i;
/* Translate the index to a structure instance */
return (struct orc_scb *) ((unsigned long) host->scb_virt + (idx * sizeof(struct orc_scb)));
} }
return NULL; return NULL;
} }
......
...@@ -6439,7 +6439,7 @@ static int AdvLoadMicrocode(AdvPortAddr iop_base, unsigned char *buf, int size, ...@@ -6439,7 +6439,7 @@ static int AdvLoadMicrocode(AdvPortAddr iop_base, unsigned char *buf, int size,
i += 2; i += 2;
len += 2; len += 2;
} else { } else {
unsigned char off = buf[i] * 2; unsigned int off = buf[i] * 2;
unsigned short word = (buf[off + 1] << 8) | buf[off]; unsigned short word = (buf[off + 1] << 8) | buf[off];
AdvWriteWordAutoIncLram(iop_base, word); AdvWriteWordAutoIncLram(iop_base, word);
len += 2; len += 2;
......
...@@ -341,13 +341,13 @@ struct MessageUnit_B ...@@ -341,13 +341,13 @@ struct MessageUnit_B
uint32_t done_qbuffer[ARCMSR_MAX_HBB_POSTQUEUE]; uint32_t done_qbuffer[ARCMSR_MAX_HBB_POSTQUEUE];
uint32_t postq_index; uint32_t postq_index;
uint32_t doneq_index; uint32_t doneq_index;
uint32_t __iomem *drv2iop_doorbell_reg; void __iomem *drv2iop_doorbell_reg;
uint32_t __iomem *drv2iop_doorbell_mask_reg; void __iomem *drv2iop_doorbell_mask_reg;
uint32_t __iomem *iop2drv_doorbell_reg; void __iomem *iop2drv_doorbell_reg;
uint32_t __iomem *iop2drv_doorbell_mask_reg; void __iomem *iop2drv_doorbell_mask_reg;
uint32_t __iomem *msgcode_rwbuffer_reg; void __iomem *msgcode_rwbuffer_reg;
uint32_t __iomem *ioctl_wbuffer_reg; void __iomem *ioctl_wbuffer_reg;
uint32_t __iomem *ioctl_rbuffer_reg; void __iomem *ioctl_rbuffer_reg;
}; };
/* /*
......
...@@ -493,6 +493,12 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, ...@@ -493,6 +493,12 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,
if (!scp) if (!scp)
return -ENOMEM; return -ENOMEM;
scp->sense_buffer = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_KERNEL);
if (!scp->sense_buffer) {
kfree(scp);
return -ENOMEM;
}
scp->device = sdev; scp->device = sdev;
memset(&cmndinfo, 0, sizeof(cmndinfo)); memset(&cmndinfo, 0, sizeof(cmndinfo));
...@@ -513,6 +519,7 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, ...@@ -513,6 +519,7 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,
rval = cmndinfo.status; rval = cmndinfo.status;
if (info) if (info)
*info = cmndinfo.info; *info = cmndinfo.info;
kfree(scp->sense_buffer);
kfree(scp); kfree(scp);
return rval; return rval;
} }
......
...@@ -2162,10 +2162,15 @@ void sdev_evt_send(struct scsi_device *sdev, struct scsi_event *evt) ...@@ -2162,10 +2162,15 @@ void sdev_evt_send(struct scsi_device *sdev, struct scsi_event *evt)
{ {
unsigned long flags; unsigned long flags;
#if 0
/* FIXME: currently this check eliminates all media change events
* for polled devices. Need to update to discriminate between AN
* and polled events */
if (!test_bit(evt->evt_type, sdev->supported_events)) { if (!test_bit(evt->evt_type, sdev->supported_events)) {
kfree(evt); kfree(evt);
return; return;
} }
#endif
spin_lock_irqsave(&sdev->list_lock, flags); spin_lock_irqsave(&sdev->list_lock, flags);
list_add_tail(&evt->node, &sdev->event_list); list_add_tail(&evt->node, &sdev->event_list);
......
...@@ -294,6 +294,7 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work) ...@@ -294,6 +294,7 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work)
} }
if (sdev->request_queue) { if (sdev->request_queue) {
bsg_unregister_queue(sdev->request_queue);
sdev->request_queue->queuedata = NULL; sdev->request_queue->queuedata = NULL;
/* user context needed to free queue */ /* user context needed to free queue */
scsi_free_queue(sdev->request_queue); scsi_free_queue(sdev->request_queue);
...@@ -857,7 +858,6 @@ void __scsi_remove_device(struct scsi_device *sdev) ...@@ -857,7 +858,6 @@ void __scsi_remove_device(struct scsi_device *sdev)
if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0)
return; return;
bsg_unregister_queue(sdev->request_queue);
class_device_unregister(&sdev->sdev_classdev); class_device_unregister(&sdev->sdev_classdev);
transport_remove_device(dev); transport_remove_device(dev);
device_del(dev); device_del(dev);
......
...@@ -1654,6 +1654,7 @@ static int sd_probe(struct device *dev) ...@@ -1654,6 +1654,7 @@ static int sd_probe(struct device *dev)
sdkp->disk = gd; sdkp->disk = gd;
sdkp->index = index; sdkp->index = index;
sdkp->openers = 0; sdkp->openers = 0;
sdkp->previous_state = 1;
if (!sdp->timeout) { if (!sdp->timeout) {
if (sdp->type != TYPE_MOD) if (sdp->type != TYPE_MOD)
......
...@@ -623,6 +623,7 @@ static int sr_probe(struct device *dev) ...@@ -623,6 +623,7 @@ static int sr_probe(struct device *dev)
cd->disk = disk; cd->disk = disk;
cd->capacity = 0x1fffff; cd->capacity = 0x1fffff;
cd->device->changed = 1; /* force recheck CD type */ cd->device->changed = 1; /* force recheck CD type */
cd->previous_state = 1;
cd->use = 1; cd->use = 1;
cd->readcd_known = 0; cd->readcd_known = 0;
cd->readcd_cdda = 0; cd->readcd_cdda = 0;
......
...@@ -1469,6 +1469,7 @@ static void isd200_free_info_ptrs(void *info_) ...@@ -1469,6 +1469,7 @@ static void isd200_free_info_ptrs(void *info_)
if (info) { if (info) {
kfree(info->id); kfree(info->id);
kfree(info->RegsBuf); kfree(info->RegsBuf);
kfree(info->srb.sense_buffer);
} }
} }
...@@ -1494,7 +1495,9 @@ static int isd200_init_info(struct us_data *us) ...@@ -1494,7 +1495,9 @@ static int isd200_init_info(struct us_data *us)
kzalloc(sizeof(struct hd_driveid), GFP_KERNEL); kzalloc(sizeof(struct hd_driveid), GFP_KERNEL);
info->RegsBuf = (unsigned char *) info->RegsBuf = (unsigned char *)
kmalloc(sizeof(info->ATARegs), GFP_KERNEL); kmalloc(sizeof(info->ATARegs), GFP_KERNEL);
if (!info->id || !info->RegsBuf) { info->srb.sense_buffer =
kmalloc(SCSI_SENSE_BUFFERSIZE, GFP_KERNEL);
if (!info->id || !info->RegsBuf || !info->srb.sense_buffer) {
isd200_free_info_ptrs(info); isd200_free_info_ptrs(info);
kfree(info); kfree(info);
retStatus = ISD200_ERROR; retStatus = ISD200_ERROR;
......
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