* Description:
* blk_start_queue() will clear the stop flag on the queue, and call
* the request_fn for the queue if it was in a stopped state when
- * entered. Also see blk_stop_queue()
+ * entered. Also see blk_stop_queue(). Must not be called from driver
+ * request function due to recursion issues.
**/
void blk_start_queue(request_queue_t *q)
{
}
}
+/**
+ * __blk_stop_queue: see blk_stop_queue()
+ *
+ * Description:
+ * Like blk_stop_queue(), bust queue_lock must be held
+ **/
+void __blk_stop_queue(request_queue_t *q)
+{
+ blk_remove_plug(q);
+ set_bit(QUEUE_FLAG_STOPPED, &q->queue_flags);
+}
+
/**
* blk_stop_queue - stop a queue
* @q: The &request_queue_t in question
unsigned long flags;
spin_lock_irqsave(q->queue_lock, flags);
- blk_remove_plug(q);
+ __blk_stop_queue(q);
spin_unlock_irqrestore(q->queue_lock, flags);
-
- set_bit(QUEUE_FLAG_STOPPED, &q->queue_flags);
}
/**
EXPORT_SYMBOL(blk_start_queue);
EXPORT_SYMBOL(blk_stop_queue);
+EXPORT_SYMBOL(__blk_stop_queue);
EXPORT_SYMBOL(blk_run_queues);
extern int block_ioctl(struct block_device *, unsigned int, unsigned long);
extern void blk_start_queue(request_queue_t *q);
extern void blk_stop_queue(request_queue_t *q);
+extern void __blk_stop_queue(request_queue_t *q);
/*
* get ready for proper ref counting