[DRBD-user] drbd on virtio: WARNING: at block/blk-core.c

Lars Ellenberg lars.ellenberg at linbit.com
Sat Nov 13 23:32:47 CET 2010

Note: "permalinks" may not be as permanent as we would like,
direct links of old sources may well be a few messages off.


On Sat, Nov 13, 2010 at 02:24:05PM +0000, Stefan Hajnoczi wrote:
> Does this fix the issue?  Compiled but not tested.
> 
> Subject: [PATCH] drbd: Use irqsave/irqrestore for req_mod() in drbd_endio_pri()
> 
> It is not safe to call req_mod() from drbd_endio_pri() since it uses
> spin_lock_irq()/spin_unlock_irq().  Instead use irqsave/irqrestore and
> call __req_mod() so that local irq mode is preserved.

Right, thanks for your work.

See also my other post.

I previously only "fixed" req_mod(),
wondering why that would show up only now.
But then found the other commit that broke it, back in August, which
contained a chunk that basically looks like your below patch, reversed
  :(

So it's fixed in our internal git already,
the fix should show up in public git early next week.

> Signed-off-by: Stefan Hajnoczi <stefanha at linux.vnet.ibm.com>
> ---
>  drivers/block/drbd/drbd_worker.c |    9 ++++++++-
>  1 files changed, 8 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c
> index b0551ba..b136fb8 100644
> --- a/drivers/block/drbd/drbd_worker.c
> +++ b/drivers/block/drbd/drbd_worker.c
> @@ -197,6 +197,8 @@ void drbd_endio_pri(struct bio *bio, int error)
>  	struct drbd_request *req = bio->bi_private;
>  	struct drbd_conf *mdev = req->mdev;
>  	enum drbd_req_event what;
> +	struct bio_and_error m;
> +	unsigned long flags;
>  	int uptodate = bio_flagged(bio, BIO_UPTODATE);
>  
>  	if (!error && !uptodate) {
> @@ -221,7 +223,12 @@ void drbd_endio_pri(struct bio *bio, int error)
>  	bio_put(req->private_bio);
>  	req->private_bio = ERR_PTR(error);
>  
> -	req_mod(req, what);
> +	spin_lock_irqsave(&mdev->req_lock, flags);
> +	__req_mod(req, what, &m);
> +	spin_unlock_irqrestore(&mdev->req_lock, flags);
> +
> +	if (m.bio)
> +		complete_master_bio(mdev, &m);
>  }
>  
>  int w_read_retry_remote(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
> -- 
> 1.7.2.3
> 

-- 
: Lars Ellenberg
: LINBIT | Your Way to High Availability
: DRBD/HA support and consulting http://www.linbit.com

DRBD® and LINBIT® are registered trademarks of LINBIT, Austria.
__
please don't Cc me, but send to list   --   I'm subscribed



More information about the drbd-user mailing list