On Thu, Sep 21 2000, ismael ripoll wrote:
> The problem seems to be originatied by the new block devices
> interface..  

Right

> The bug Is that in the function sbpcd_end_request
> the value of "req->q" is NULL.. and then:
> 
> list_add(&req->queue, &req->q->queue_head);  << FAILS >>

And I don't see why it should do this. It would make more sense
to just leave the current request in the queue, and let end_request
deal with dequeueing when it is done.

Could you try this patch? Completely untested and note even compiled :)

-- 
* Jens Axboe <[EMAIL PROTECTED]>
* SuSE Labs
--- /opt/kernel/linux-2.4.0-test9-pre5/drivers/cdrom/sbpcd.c    Mon Sep 11 02:49:27 
2000
+++ drivers/cdrom/sbpcd.c       Thu Sep 21 16:27:09 2000
@@ -4864,10 +4864,6 @@
  *
  */
 #undef DEBUG_GTL
-static inline void sbpcd_end_request(struct request *req, int uptodate) {
-       list_add(&req->queue, &req->q->queue_head);
-       end_request(uptodate);
-}
 /*==========================================================================*/
 /*
  *  I/O request routine, called from Linux kernel.
@@ -4902,12 +4898,11 @@
 #endif
        INIT_REQUEST;
        req=CURRENT;            /* take out our request so no other */
-       blkdev_dequeue_request(req);    /* task can fuck it up         GTL  */
        
        if (req->rq_status == RQ_INACTIVE)
-               sbpcd_end_request(req, 0);
+               end_request(req, 0);
        if (req -> sector == -1)
-               sbpcd_end_request(req, 0);
+               end_request(req, 0);
        spin_unlock_irq(&io_request_lock);
 
        down(&ioctl_read_sem);
@@ -4949,7 +4944,7 @@
 #endif
                up(&ioctl_read_sem);
                spin_lock_irq(&io_request_lock);
-               sbpcd_end_request(req, 1);
+               end_request(req, 1);
                goto request_loop;
        }
 
@@ -4990,7 +4985,7 @@
 #endif
                        up(&ioctl_read_sem);
                        spin_lock_irq(&io_request_lock);
-                       sbpcd_end_request(req, 1);
+                       end_request(req, 1);
                        goto request_loop;
                }
        }
@@ -5006,7 +5001,7 @@
        up(&ioctl_read_sem);
        sbp_sleep(0);    /* wait a bit, try again */
        spin_lock_irq(&io_request_lock);
-       sbpcd_end_request(req, 0);
+       end_request(req, 0);
        goto request_loop;
 }
 /*==========================================================================*/
@@ -5815,7 +5810,6 @@
 #endif MODULE
        }
        blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
-       blk_queue_headactive(BLK_DEFAULT_QUEUE(MAJOR_NR), 0);
        read_ahead[MAJOR_NR] = buffers * (CD_FRAMESIZE / 512);
        
        request_region(CDo_command,4,major_name);

Reply via email to