diff options
Diffstat (limited to 'block/blk-core.c')
| -rw-r--r-- | block/blk-core.c | 23 | 
1 files changed, 11 insertions, 12 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index ea70e6c80cd..15de223c7f9 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -366,7 +366,14 @@ void blk_drain_queue(struct request_queue *q, bool drain_all)  		if (drain_all)  			blk_throtl_drain(q); -		__blk_run_queue(q); +		/* +		 * This function might be called on a queue which failed +		 * driver init after queue creation.  Some drivers +		 * (e.g. fd) get unhappy in such cases.  Kick queue iff +		 * dispatch queue has something on it. +		 */ +		if (!list_empty(&q->queue_head)) +			__blk_run_queue(q);  		if (drain_all)  			nr_rqs = q->rq.count[0] + q->rq.count[1]; @@ -467,6 +474,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)  	q->backing_dev_info.state = 0;  	q->backing_dev_info.capabilities = BDI_CAP_MAP_COPY;  	q->backing_dev_info.name = "block"; +	q->node = node_id;  	err = bdi_init(&q->backing_dev_info);  	if (err) { @@ -551,7 +559,7 @@ blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id)  	if (!uninit_q)  		return NULL; -	q = blk_init_allocated_queue_node(uninit_q, rfn, lock, node_id); +	q = blk_init_allocated_queue(uninit_q, rfn, lock);  	if (!q)  		blk_cleanup_queue(uninit_q); @@ -563,18 +571,9 @@ struct request_queue *  blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn,  			 spinlock_t *lock)  { -	return blk_init_allocated_queue_node(q, rfn, lock, -1); -} -EXPORT_SYMBOL(blk_init_allocated_queue); - -struct request_queue * -blk_init_allocated_queue_node(struct request_queue *q, request_fn_proc *rfn, -			      spinlock_t *lock, int node_id) -{  	if (!q)  		return NULL; -	q->node = node_id;  	if (blk_init_free_list(q))  		return NULL; @@ -604,7 +603,7 @@ blk_init_allocated_queue_node(struct request_queue *q, request_fn_proc *rfn,  	return NULL;  } -EXPORT_SYMBOL(blk_init_allocated_queue_node); +EXPORT_SYMBOL(blk_init_allocated_queue);  int blk_get_queue(struct request_queue *q)  {  |