--- /dev/null
+Subject: [SCSI] scsi_lib: only call scsi_unprep_request() under queue lock
+From: James Bottomley <James.Bottomley@HansenPartnership.com>
+Date: Sat Dec 13 14:31:03 2008 -0600:
+Git: 02bd3499a3be984f1e88821c3ed252c8c49c498e
+References: bnc#464155
+
+It's called under that lock everywhere else and it does alter the
+request state, so it should be.
+
+This one occurance in scsi_requeue_command() could open a window where
+req->special is set to NULL while the requests is going through either
+timeout or completion processing leading to NULL pointer derefs of the
+sort complained of in bugzillas 12020 and 12195.
+
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index fa45a1a..148d3af 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -648,8 +648,8 @@ static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)
+ struct request *req = cmd->request;
+ unsigned long flags;
+
+- scsi_unprep_request(req);
+ spin_lock_irqsave(q->queue_lock, flags);
++ scsi_unprep_request(req);
+ blk_requeue_request(q, req);
+ spin_unlock_irqrestore(q->queue_lock, flags);
+