Message ID | 20170324123621.5227-5-tom.leiming@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, 2017-03-24 at 20:36 +0800, Ming Lei wrote: > + /* block new I/O coming */ > + blk_freeze_queue_start(q); As I have already mentioned two times, the comment above blk_freeze_queue_start() should be made more clear. It should mention that without that call blk_queue_enter() won't check the "dying" flag after it has been set. If that is not mentioned in a comment the next person who reads the blk_set_queue_dying() function will wonder why the blk_freeze_queue_start() call is really needed and whether it can be removed. > /* > * read pair of barrier in blk_freeze_queue_start(), > * we need to order reading DEAD flag of .q_usage_counter > - * and reading .mq_freeze_depth, otherwise the following > - * wait may never return if the two read are reordered. > + * and reading .mq_freeze_depth or dying flag, otherwise > + * the following wait may never return if the two read > + * are reordered. > */ > smp_rmb(); Please fix the spelling in the above comment ("two read"). Thanks, Bart.
diff --git a/block/blk-core.c b/block/blk-core.c index 5901133d105f..f0dd9b0054ed 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -500,6 +500,9 @@ void blk_set_queue_dying(struct request_queue *q) queue_flag_set(QUEUE_FLAG_DYING, q); spin_unlock_irq(q->queue_lock); + /* block new I/O coming */ + blk_freeze_queue_start(q); + if (q->mq_ops) blk_mq_wake_waiters(q); else { @@ -672,8 +675,9 @@ int blk_queue_enter(struct request_queue *q, bool nowait) /* * read pair of barrier in blk_freeze_queue_start(), * we need to order reading DEAD flag of .q_usage_counter - * and reading .mq_freeze_depth, otherwise the following - * wait may never return if the two read are reordered. + * and reading .mq_freeze_depth or dying flag, otherwise + * the following wait may never return if the two read + * are reordered. */ smp_rmb();