[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20110709110538.35e1ea1e@stein>
Date: Sat, 9 Jul 2011 11:05:38 +0200
From: Stefan Richter <stefanr@...6.in-berlin.de>
To: Roland Dreier <roland@...nel.org>
Cc: Jens Axboe <axboe@...nel.dk>,
James Bottomley <James.Bottomley@...senpartnership.com>,
Alan Stern <stern@...land.harvard.edu>,
Heiko Carstens <heiko.carstens@...ibm.com>,
linux-scsi@...r.kernel.org,
Steffen Maier <maier@...ux.vnet.ibm.com>,
"Manvanthara B. Puttashankar" <manvanth@...ux.vnet.ibm.com>,
Tarak Reddy <tarak.reddy@...ibm.com>,
"Seshagiri N. Ippili" <sesh17@...ux.vnet.ibm.com>,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH] block: Check that queue is alive in
blk_insert_cloned_request()
On Jul 08 Roland Dreier wrote:
> This fixes crashes such as the below that I see when the storage
> underlying a dm-multipath device is hot-removed. The problem is that
> dm requeues a request to a device whose block queue has already been
> cleaned up, and blk_insert_cloned_request() doesn't check if the queue
> is alive, but rather goes ahead and tries to queue the request. This
> ends up dereferencing the elevator that was already freed in
> blk_cleanup_queue().
[...]
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -1706,6 +1706,9 @@ int blk_insert_cloned_request(struct request_queue *q, struct request *rq)
> return -EIO;
> #endif
>
> + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags)))
> + return -EIO;
> +
> spin_lock_irqsave(q->queue_lock, flags);
>
> /*
Not knowing the calling contexts or having tried to learn about them, I am
wondering: What prevents the elevator to be freed right after the flag
was checked?
--
Stefan Richter
-=====-==-== -=== -=--=
http://arcgraph.de/sr/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists