PATCH - change to blkdev->queue calling triggers BUG in md.c

From: Neil Brown (neilb@cse.unsw.edu.au)
Date: Sun Sep 01 2002 - 18:43:33 EST


Changeset 1.573 (just prior to 2.5.33 release) changed the calling
sequence for blk_dev[major].queue so that it is now called before the
bd_op->open function is called.
This triggers a BUG in md.c which checked that the device was open
whenever ->queue was called. Patch below removes the BUG.

I'm actually a little disappointed by this change. I was hoping that
the ->queue might get changed to be passed a 'struct block_device *'
instead of a 'kdev_t' so that the device driver would only have to
interpret the device number in one place: the open. But now that
->queue is called before ->open, that wouldn't help.

I don't suppose it would make sense to do the default:
        if (!bdev->bd_queue) {
                struct blk_dev_struct *p = blk_dev + major(dev);
                bdev->bd_queue = &p->request_queue;
        }
bit where it is now, and leave the:
                if (p->queue)
                        bdev->bd_queue = p->queue(dev);

bit until after the open? It would keep floppy happy, and make me
happy too, but I'm not sure that it is actually 'right'...

Anyway, here is the patch that stops md from BUGging out.

NeilBrown

### Comments for ChangeSet
Remove BUG in md.c that change in 2.5.33 triggers.

Since 2.5.33, the blk_dev[].queue is called without
the device open, so md_queue_proc can no-longer assume
that the device is open.

 ----------- Diffstat output ------------
 ./drivers/md/md.c | 10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)

--- ./drivers/md/md.c 2002/09/01 23:27:10 1.1
+++ ./drivers/md/md.c 2002/09/01 23:28:27 1.2
@@ -3157,11 +3157,11 @@ request_queue_t * md_queue_proc(kdev_t d
 {
         mddev_t *mddev = mddev_find(minor(dev));
         request_queue_t *q = BLK_DEFAULT_QUEUE(MAJOR_NR);
- if (!mddev || atomic_read(&mddev->active)<2)
- BUG();
- if (mddev->pers)
- q = &mddev->queue;
- mddev_put(mddev); /* the caller must hold a reference... */
+ if (mddev) {
+ if (mddev->pers)
+ q = &mddev->queue;
+ mddev_put(mddev);
+ }
         return q;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Sep 07 2002 - 22:00:14 EST