[RFC PATCH v2 0/2] block: fix backing_dev_info lifetime

From: Dan Williams
Date: Fri Jan 06 2017 - 20:07:09 EST


v1 of these changes [1] was a one line change to bdev_get_queue() to
prevent a shutdown crash when del_gendisk() races the final
__blkdev_put().

While it is known at del_gendisk() time that the queue is still alive,
Jan Kara points to other paths [2] that are racing __blkdev_put() where
the assumption that ->bd_queue, or inode->i_wb is valid does not hold.

Fix that broken assumption, make it the case that if you have a live
block_device, or block_device-inode that the corresponding queue and
inode-write-back data is still valid.

These changes survive a run of the libnvdimm unit test suite which puts
some stress on the block_device shutdown path.

---

Changes since v1 [1]:

* Introduce "block: fix lifetime of request_queue / backing_dev_info
relative to bdev" to keep the queue allocated and the inode attached
for writeback until ->destroy_inode() time.

* Rework the comments in "block: fix blk_get_backing_dev_info() crash,
use bdev->bd_queue" to reflect the assumptions about the liveness of
->bd_queue.

[1]: http://marc.info/?l=linux-block&m=148366637105761&w=2
[2]: http://www.spinics.net/lists/linux-fsdevel/msg105153.html

---

Dan Williams (2):
block: fix lifetime of request_queue / backing_dev_info relative to bdev
block: fix blk_get_backing_dev_info() crash, use bdev->bd_queue


block/blk-core.c | 7 ++++---
fs/block_dev.c | 25 +++++++++++++++----------
include/linux/blkdev.h | 6 +++++-
include/linux/fs.h | 1 +
4 files changed, 25 insertions(+), 14 deletions(-)