Re: 2.6.5-mm4

Andrew Morton
2004-04-12T08:29:07Z

Please do not edit people out of the Cc line.

Paul P Komkoff Jr <i@stingr.net> wrote:
>
> Replying to Andrew Morton:
> > I added a might_sleep() to generic_unplug_device(), because some drivers'
> > unplug functions can sleep.
> >
> > It appears that either the EVMS or the udm2 patch is calling
> > generic_unplug_device() under a lock. Probably spin_lock_irq(q->lock).
>
> can it be thisi (raid1.c):

Yes. The below locking is not correct.

> static void unplug_slaves(mddev_t *mddev)
> {
> conf_t *conf = mddev_to_conf(mddev);
> int i;
> unsigned long flags;
>
> spin_lock_irqsave(&conf->device_lock, flags);
> for (i=0; i<mddev->raid_disks; i++) {
> mdk_rdev_t *rdev = conf->mirrors[i].rdev;
> if (rdev && !rdev->faulty) {
> request_queue_t *r_queue = bdev_get_queue(rdev->bdev);
>
> if (r_queue->unplug_fn)
> r_queue->unplug_fn(r_queue);
> }
> }
> spin_unlock_irqrestore(&conf->device_lock, flags);
> }

I do not know which drivers insist on sleeping in their unplug functions,
but apparently they're out there.