[PATCH] fix IO hangs

From: Nick Piggin
Date: Fri Sep 05 2003 - 01:58:20 EST


Hi, sorry for the hangs, everyone. I think I have it worked out, but
testers and an ack from Jens would be good.

The insert_here code now does as advertised. The big difference being
that regular blk_fs_requests will be subject to it (required for SCSI
requeue). Unfortunately ll_rw_blk.c misuses it and will sometimes try
to insert at requests which are not on the dispatch list, causing the
badness.

It looks like the code was maybe used to provide an insertion hint
for the elevator. The RB tree has now eliminated that requirement even
if the code did work. Which it doesn't.

I can't reproduce the hangs with this patch. Please test.


Aside, insert_here really seems to be quite dangerous to me. I think
combination of barriers and an "insert at start/end" flag would be
enough.

--- archs/linux-2.6/drivers/block/ll_rw_blk.c 2003-09-05 16:46:02.000000000 +1000
+++ linux-2.6/drivers/block/ll_rw_blk.c 2003-09-05 16:35:39.000000000 +1000
@@ -2060,7 +2060,7 @@ get_rq:
req->rq_disk = bio->bi_bdev->bd_disk;
req->start_time = jiffies;

- add_request(q, req, insert_here);
+ add_request(q, req, NULL);
out:
if (freereq)
__blk_put_request(q, freereq);