fix crash in scsi_dispatch_cmd() (bnc#707853).
authorJiri Slaby <jslaby@suse.cz>
Sun, 24 Jul 2011 06:15:18 +0000 (08:15 +0200)
committerJiri Slaby <jslaby@suse.cz>
Sun, 24 Jul 2011 06:15:18 +0000 (08:15 +0200)
suse-commit: dfe0dcf0437348de10d54887fb95ba9ab417439f

block/blk-core.c
block/blk-exec.c
drivers/scsi/scsi_lib.c

index d2f8f40..1d49e1c 100644 (file)
@@ -839,6 +839,9 @@ struct request *blk_get_request(struct request_queue *q, int rw, gfp_t gfp_mask)
 {
        struct request *rq;
 
+       if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags)))
+               return NULL;
+
        BUG_ON(rw != READ && rw != WRITE);
 
        spin_lock_irq(q->queue_lock);
index 8a0e7ec..a1ebceb 100644 (file)
@@ -50,6 +50,13 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk,
 {
        int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK;
 
+       if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) {
+               rq->errors = -ENXIO;
+               if (rq->end_io)
+                       rq->end_io(rq, rq->errors);
+               return;
+       }
+
        rq->rq_disk = bd_disk;
        rq->end_io = done;
        WARN_ON(irqs_disabled());
index 93748f1..b172999 100644 (file)
@@ -213,6 +213,8 @@ int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd,
        int ret = DRIVER_ERROR << 24;
 
        req = blk_get_request(sdev->request_queue, write, __GFP_WAIT);
+       if (!req)
+               return ret;
 
        if (bufflen &&  blk_rq_map_kern(sdev->request_queue, req,
                                        buffer, bufflen, __GFP_WAIT))