[SCSI] mptfusion: sanity check for vdevice pointer is added
Added sanity checks before accessing vdevice and added vdevice->deleted setting for mptfc. Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
f8c23bde85
commit
08f5c5c23d
|
@ -1329,6 +1329,8 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
|
||||||
if (ioc->sh) {
|
if (ioc->sh) {
|
||||||
shost_for_each_device(sdev, ioc->sh) {
|
shost_for_each_device(sdev, ioc->sh) {
|
||||||
vdevice = sdev->hostdata;
|
vdevice = sdev->hostdata;
|
||||||
|
if (vdevice == NULL || vdevice->vtarget == NULL)
|
||||||
|
continue;
|
||||||
if (vdevice->vtarget->tflags &
|
if (vdevice->vtarget->tflags &
|
||||||
MPT_TARGET_FLAGS_RAID_COMPONENT)
|
MPT_TARGET_FLAGS_RAID_COMPONENT)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1450,6 +1452,8 @@ mptctl_gettargetinfo (unsigned long arg)
|
||||||
if (!maxWordsLeft)
|
if (!maxWordsLeft)
|
||||||
continue;
|
continue;
|
||||||
vdevice = sdev->hostdata;
|
vdevice = sdev->hostdata;
|
||||||
|
if (vdevice == NULL || vdevice->vtarget == NULL)
|
||||||
|
continue;
|
||||||
if (vdevice->vtarget->tflags &
|
if (vdevice->vtarget->tflags &
|
||||||
MPT_TARGET_FLAGS_RAID_COMPONENT)
|
MPT_TARGET_FLAGS_RAID_COMPONENT)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1978,6 +1982,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
|
||||||
struct scsi_target *starget = scsi_target(sdev);
|
struct scsi_target *starget = scsi_target(sdev);
|
||||||
VirtTarget *vtarget = starget->hostdata;
|
VirtTarget *vtarget = starget->hostdata;
|
||||||
|
|
||||||
|
if (vtarget == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
if ((pScsiReq->TargetID == vtarget->id) &&
|
if ((pScsiReq->TargetID == vtarget->id) &&
|
||||||
(pScsiReq->Bus == vtarget->channel) &&
|
(pScsiReq->Bus == vtarget->channel) &&
|
||||||
(vtarget->tflags & MPT_TARGET_FLAGS_Q_YES))
|
(vtarget->tflags & MPT_TARGET_FLAGS_Q_YES))
|
||||||
|
|
|
@ -482,6 +482,7 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0)
|
||||||
if (vtarget) {
|
if (vtarget) {
|
||||||
vtarget->id = pg0->CurrentTargetID;
|
vtarget->id = pg0->CurrentTargetID;
|
||||||
vtarget->channel = pg0->CurrentBus;
|
vtarget->channel = pg0->CurrentBus;
|
||||||
|
vtarget->deleted = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*((struct mptfc_rport_info **)rport->dd_data) = ri;
|
*((struct mptfc_rport_info **)rport->dd_data) = ri;
|
||||||
|
@ -1092,6 +1093,8 @@ mptfc_setup_reset(struct work_struct *work)
|
||||||
container_of(work, MPT_ADAPTER, fc_setup_reset_work);
|
container_of(work, MPT_ADAPTER, fc_setup_reset_work);
|
||||||
u64 pn;
|
u64 pn;
|
||||||
struct mptfc_rport_info *ri;
|
struct mptfc_rport_info *ri;
|
||||||
|
struct scsi_target *starget;
|
||||||
|
VirtTarget *vtarget;
|
||||||
|
|
||||||
/* reset about to happen, delete (block) all rports */
|
/* reset about to happen, delete (block) all rports */
|
||||||
list_for_each_entry(ri, &ioc->fc_rports, list) {
|
list_for_each_entry(ri, &ioc->fc_rports, list) {
|
||||||
|
@ -1099,6 +1102,12 @@ mptfc_setup_reset(struct work_struct *work)
|
||||||
ri->flags &= ~MPT_RPORT_INFO_FLAGS_REGISTERED;
|
ri->flags &= ~MPT_RPORT_INFO_FLAGS_REGISTERED;
|
||||||
fc_remote_port_delete(ri->rport); /* won't sleep */
|
fc_remote_port_delete(ri->rport); /* won't sleep */
|
||||||
ri->rport = NULL;
|
ri->rport = NULL;
|
||||||
|
starget = ri->starget;
|
||||||
|
if (starget) {
|
||||||
|
vtarget = starget->hostdata;
|
||||||
|
if (vtarget)
|
||||||
|
vtarget->deleted = 1;
|
||||||
|
}
|
||||||
|
|
||||||
pn = (u64)ri->pg0.WWPN.High << 32 |
|
pn = (u64)ri->pg0.WWPN.High << 32 |
|
||||||
(u64)ri->pg0.WWPN.Low;
|
(u64)ri->pg0.WWPN.Low;
|
||||||
|
@ -1119,6 +1128,8 @@ mptfc_rescan_devices(struct work_struct *work)
|
||||||
int ii;
|
int ii;
|
||||||
u64 pn;
|
u64 pn;
|
||||||
struct mptfc_rport_info *ri;
|
struct mptfc_rport_info *ri;
|
||||||
|
struct scsi_target *starget;
|
||||||
|
VirtTarget *vtarget;
|
||||||
|
|
||||||
/* start by tagging all ports as missing */
|
/* start by tagging all ports as missing */
|
||||||
list_for_each_entry(ri, &ioc->fc_rports, list) {
|
list_for_each_entry(ri, &ioc->fc_rports, list) {
|
||||||
|
@ -1146,6 +1157,12 @@ mptfc_rescan_devices(struct work_struct *work)
|
||||||
MPT_RPORT_INFO_FLAGS_MISSING);
|
MPT_RPORT_INFO_FLAGS_MISSING);
|
||||||
fc_remote_port_delete(ri->rport); /* won't sleep */
|
fc_remote_port_delete(ri->rport); /* won't sleep */
|
||||||
ri->rport = NULL;
|
ri->rport = NULL;
|
||||||
|
starget = ri->starget;
|
||||||
|
if (starget) {
|
||||||
|
vtarget = starget->hostdata;
|
||||||
|
if (vtarget)
|
||||||
|
vtarget->deleted = 1;
|
||||||
|
}
|
||||||
|
|
||||||
pn = (u64)ri->pg0.WWPN.High << 32 |
|
pn = (u64)ri->pg0.WWPN.High << 32 |
|
||||||
(u64)ri->pg0.WWPN.Low;
|
(u64)ri->pg0.WWPN.Low;
|
||||||
|
|
|
@ -2339,6 +2339,8 @@ mptscsih_slave_destroy(struct scsi_device *sdev)
|
||||||
starget = scsi_target(sdev);
|
starget = scsi_target(sdev);
|
||||||
vtarget = starget->hostdata;
|
vtarget = starget->hostdata;
|
||||||
vdevice = sdev->hostdata;
|
vdevice = sdev->hostdata;
|
||||||
|
if (!vdevice)
|
||||||
|
return;
|
||||||
|
|
||||||
mptscsih_search_running_cmds(hd, vdevice);
|
mptscsih_search_running_cmds(hd, vdevice);
|
||||||
vtarget->num_luns--;
|
vtarget->num_luns--;
|
||||||
|
|
Loading…
Reference in New Issue