--- 2.4/drivers/block/ll_rw_blk.c Mon Apr 1 10:53:25 2002 +++ build-2.4/drivers/block/ll_rw_blk.c Mon Apr 1 11:00:21 2002 @@ -336,14 +336,17 @@ */ int blk_grow_request_list(request_queue_t *q, int nr_requests) { - spin_lock_irq(&io_request_lock); + unsigned long flags; + /* Several broken drivers assume that this function doesn't sleep, + * this causes system hangs during boot. + * As a temporary fix, make the the function non-blocking. + */ + spin_lock_irqsave(&io_request_lock, flags); while (q->nr_requests < nr_requests) { struct request *rq; int rw; - spin_unlock_irq(&io_request_lock); - rq = kmem_cache_alloc(request_cachep, SLAB_KERNEL); - spin_lock_irq(&io_request_lock); + rq = kmem_cache_alloc(request_cachep, SLAB_ATOMIC); if (rq == NULL) break; memset(rq, 0, sizeof(*rq)); @@ -356,7 +359,7 @@ q->batch_requests = q->nr_requests / 4; if (q->batch_requests > 32) q->batch_requests = 32; - spin_unlock_irq(&io_request_lock); + spin_unlock_irqrestore(&io_request_lock, flags); return q->nr_requests; }