On Tue, Aug 08, 2023 at 09:15:53AM -0700, Christoph Hellwig wrote: > 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@xxxxxx> > --- > fs/xfs/xfs_buf.c | 5 +++++ > fs/xfs/xfs_super.c | 12 ++---------- > 2 files changed, 7 insertions(+), 10 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 83b8702030f71d..c57e6e03dfa80c 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -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); > @@ -1945,6 +1947,9 @@ xfs_free_buftarg( > > blkdev_issue_flush(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->m_super); Hmm... I feel like this would be cleaner if the data dev buftarg could get its own refcount separate from super_block.s_bdev, but I looked through the code and couldn't identify a simple way to do that. Soo... Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > > kmem_free(btp); > } > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index f00d1162815d19..37b1b763a0bef0 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -399,18 +399,10 @@ STATIC void > xfs_close_devices( > struct xfs_mount *mp) > { > - if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) { > - struct block_device *logdev = mp->m_logdev_targp->bt_bdev; > - > + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) > xfs_free_buftarg(mp->m_logdev_targp); > - blkdev_put(logdev, mp->m_super); > - } > - if (mp->m_rtdev_targp) { > - struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev; > - > + if (mp->m_rtdev_targp) > xfs_free_buftarg(mp->m_rtdev_targp); > - blkdev_put(rtdev, mp->m_super); > - } > xfs_free_buftarg(mp->m_ddev_targp); > } > > -- > 2.39.2 >