On Mon, Dec 01 2008, Mike Anderson wrote: > Tejun Heo <tj@xxxxxxxxxx> wrote: > > blkdev_dequeue_request() and elv_dequeue_request() are equivalent and > > both start the timeout timer. Barrier code dequeues the original > > barrier request but doesn't passes the request itself to lower level > > driver, only broken down proxy requests; however, as the original > > barrier code goes through the same dequeue path and timeout timer is > > started on it. If barrier sequence takes long enough, this timer > > expires but the low level driver has no idea about this request and > > oops follows. > > > > Timeout timer shouldn't have been started on the original barrier > > request as it never goes through actual IO. This patch unexports > > elv_dequeue_request(), which has no external user anyway, and makes it > > operate on elevator proper w/o adding the timer and make > > blkdev_dequeue_request() call elv_dequeue_request() and add timer. > > Internal users which don't pass the request to driver - barrier code > > and end_that_request_last() - are converted to use > > elv_dequeue_request(). > > > > Signed-off-by: Tejun Heo <tj@xxxxxxxxxx> > > Cc: Mike Anderson <andmike@xxxxxxxxxxxxxxxxxx> > > --- > > Mike, this should fix the problem you were seeing (blk_add_timer on > > requests w/o REQ_STARTED set). > > > > Yes this fixed the "w/o REQ_STARTED" error I was seeing on a distro kernel > and a mainline system. Thanks Tejun, this makes sense. I'll make sure it goes upstream asap. -- Jens Axboe -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html