nfsd4: fix null dereference creating nfsv4 callback client
[safe/jmp/linux-2.6] / drivers / cdrom / gdrom.c
index cab2b1f..b5621f2 100644 (file)
@@ -584,8 +584,8 @@ static void gdrom_readdisk_dma(struct work_struct *work)
        list_for_each_safe(elem, next, &gdrom_deferred) {
                req = list_entry(elem, struct request, queuelist);
                spin_unlock(&gdrom_lock);
-               block = req->sector/GD_TO_BLK + GD_SESSION_OFFSET;
-               block_cnt = req->nr_sectors/GD_TO_BLK;
+               block = blk_rq_pos(req)/GD_TO_BLK + GD_SESSION_OFFSET;
+               block_cnt = blk_rq_sectors(req)/GD_TO_BLK;
                ctrl_outl(PHYSADDR(req->buffer), GDROM_DMA_STARTADDR_REG);
                ctrl_outl(block_cnt * GDROM_HARD_SECTOR, GDROM_DMA_LENGTH_REG);
                ctrl_outl(1, GDROM_DMA_DIRECTION_REG);
@@ -638,33 +638,29 @@ static void gdrom_readdisk_dma(struct work_struct *work)
        kfree(read_command);
 }
 
-static void gdrom_request_handler_dma(struct request *req)
-{
-       /* dequeue, add to list of deferred work
-       * and then schedule workqueue */
-       blkdev_dequeue_request(req);
-       list_add_tail(&req->queuelist, &gdrom_deferred);
-       schedule_work(&work);
-}
-
 static void gdrom_request(struct request_queue *rq)
 {
        struct request *req;
 
-       while ((req = elv_next_request(rq)) != NULL) {
+       while ((req = blk_fetch_request(rq)) != NULL) {
                if (!blk_fs_request(req)) {
                        printk(KERN_DEBUG "GDROM: Non-fs request ignored\n");
-                       __blk_end_request_cur(req, -EIO);
+                       __blk_end_request_all(req, -EIO);
+                       continue;
                }
                if (rq_data_dir(req) != READ) {
                        printk(KERN_NOTICE "GDROM: Read only device -");
                        printk(" write request ignored\n");
-                       __blk_end_request_cur(req, -EIO);
+                       __blk_end_request_all(req, -EIO);
+                       continue;
                }
-               if (req->nr_sectors)
-                       gdrom_request_handler_dma(req);
-               else
-                       __blk_end_request_cur(req, -EIO);
+
+               /*
+                * Add to list of deferred work and then schedule
+                * workqueue.
+                */
+               list_add_tail(&req->queuelist, &gdrom_deferred);
+               schedule_work(&work);
        }
 }
 
@@ -743,7 +739,7 @@ static void __devinit probe_gdrom_setupdisk(void)
 
 static int __devinit probe_gdrom_setupqueue(void)
 {
-       blk_queue_hardsect_size(gd.gdrom_rq, GDROM_HARD_SECTOR);
+       blk_queue_logical_block_size(gd.gdrom_rq, GDROM_HARD_SECTOR);
        /* using DMA so memory will need to be contiguous */
        blk_queue_max_hw_segments(gd.gdrom_rq, 1);
        /* set a large max size to get most from DMA */