projects
/
profile
/
ivi
/
kernel-x86-ivi.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
a0c1241
)
[SCSI] scsi_dh: check queuedata pointer before proceeding further
author
Moger, Babu
<Babu.Moger@netapp.com>
Wed, 26 Oct 2011 18:29:38 +0000
(14:29 -0400)
committer
James Bottomley
<JBottomley@Parallels.com>
Mon, 31 Oct 2011 09:10:36 +0000
(13:10 +0400)
This patch validates sdev pointer in scsi_dh_activate before proceeding further.
Without this check we might see the panic as below. I have seen this
panic multiple times..
Call trace:
#0 [
ffff88007d647b50
] machine_kexec at
ffffffff81020902
#1 [
ffff88007d647ba0
] crash_kexec at
ffffffff810875b0
#2 [
ffff88007d647c70
] oops_end at
ffffffff8139c650
#3 [
ffff88007d647c90
] __bad_area_nosemaphore at
ffffffff8102dd15
#4 [
ffff88007d647d50
] page_fault at
ffffffff8139b8cf
[exception RIP: scsi_dh_activate+0x82]
RIP:
ffffffffa0041922
RSP:
ffff88007d647e00
RFLAGS:
00010046
RAX:
0000000000000000
RBX:
0000000000000000
RCX:
00000000000093c5
RDX:
00000000000093c5
RSI:
ffffffffa02e6640
RDI:
ffff88007cc88988
RBP:
000000000000000f
R8:
ffff88007d646000
R9:
0000000000000000
R10:
ffff880082293790
R11:
00000000ffffffff
R12:
ffff88007cc88988
R13:
0000000000000000
R14:
0000000000000286
R15:
ffff880037b845e0
ORIG_RAX:
ffffffffffffffff
CS: 0010 SS: 0000
#5 [
ffff88007d647e38
] run_workqueue at
ffffffff81060268
#6 [
ffff88007d647e78
] worker_thread at
ffffffff81060386
#7 [
ffff88007d647ee8
] kthread at
ffffffff81064436
#8 [
ffff88007d647f48
] kernel_thread at
ffffffff81003fba
Signed-off-by: Babu Moger <babu.moger@netapp.com>
Cc: stable@kernel.org
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/device_handler/scsi_dh.c
patch
|
blob
|
history
diff --git
a/drivers/scsi/device_handler/scsi_dh.c
b/drivers/scsi/device_handler/scsi_dh.c
index 7c05fd9dccfd1259133adaa1691df648cff56521..339ea23a8675011365957214987b5edc10654380 100644
(file)
--- a/
drivers/scsi/device_handler/scsi_dh.c
+++ b/
drivers/scsi/device_handler/scsi_dh.c
@@
-441,7
+441,15
@@
int scsi_dh_activate(struct request_queue *q, activate_complete fn, void *data)
spin_lock_irqsave(q->queue_lock, flags);
sdev = q->queuedata;
- if (sdev && sdev->scsi_dh_data)
+ if (!sdev) {
+ spin_unlock_irqrestore(q->queue_lock, flags);
+ err = SCSI_DH_NOSYS;
+ if (fn)
+ fn(data, err);
+ return err;
+ }
+
+ if (sdev->scsi_dh_data)
scsi_dh = sdev->scsi_dh_data->scsi_dh;
dev = get_device(&sdev->sdev_gendev);
if (!scsi_dh || !dev ||