xfs: close the RT and log block devices in xfs_free_buftarg
authorChristoph Hellwig <hch@lst.de>
Wed, 9 Aug 2023 22:05:37 +0000 (15:05 -0700)
committerChristian Brauner <brauner@kernel.org>
Thu, 10 Aug 2023 08:34:54 +0000 (10:34 +0200)
Closing the block devices logically belongs into xfs_free_buftarg,  So
instead of open coding it in the caller move it there and add a check
for the s_bdev so that the main device isn't close as that's done by the
VFS helper.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Message-Id: <20230809220545.1308228-6-hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xfs/xfs_buf.c

index 15d1e5a..65110df 100644 (file)
@@ -1938,6 +1938,8 @@ void
 xfs_free_buftarg(
        struct xfs_buftarg      *btp)
 {
+       struct block_device     *bdev = btp->bt_bdev;
+
        unregister_shrinker(&btp->bt_shrinker);
        ASSERT(percpu_counter_sum(&btp->bt_io_count) == 0);
        percpu_counter_destroy(&btp->bt_io_count);
@@ -1946,6 +1948,9 @@ xfs_free_buftarg(
        blkdev_issue_flush(btp->bt_bdev);
        invalidate_bdev(btp->bt_bdev);
        fs_put_dax(btp->bt_daxdev, btp->bt_mount);
+       /* the main block device is closed by kill_block_super */
+       if (bdev != btp->bt_mount->m_super->s_bdev)
+               blkdev_put(bdev, btp->bt_mount);
 
        kmem_free(btp);
 }