From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Al Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>,
Namjae Jeon <linkinjeon@kernel.org>,
Sungjong Seo <sj1557.seo@samsung.com>,
Theodore Ts'o <tytso@mit.edu>,
Andreas Dilger <adilger.kernel@dilger.ca>,
Konstantin Komarov <almaz.alexandrovich@paragon-software.com>,
linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org,
ntfs3@lists.linux.dev, linux-xfs@vger.kernel.org
Subject: Re: [PATCH 06/13] xfs: close the external block devices in xfs_mount_free
Date: Wed, 9 Aug 2023 15:34:01 -0700 [thread overview]
Message-ID: <20230809223401.GW11352@frogsfrogsfrogs> (raw)
In-Reply-To: <20230809220545.1308228-7-hch@lst.de>
On Wed, Aug 09, 2023 at 03:05:38PM -0700, Christoph Hellwig wrote:
> blkdev_put must not be called under sb->s_umount to avoid a lock order
> reversal with disk->open_mutex. Move closing the buftargs into ->kill_sb
> to archive that. Note that the flushing of the disk caches and
> block device mapping invalidated needs to stay in ->put_super as the main
> block device is closed in kill_block_super already.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Looks good!
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> ---
> fs/xfs/xfs_buf.c | 2 --
> fs/xfs/xfs_super.c | 36 ++++++++++++++++++++++++++----------
> 2 files changed, 26 insertions(+), 12 deletions(-)
>
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index e33eb17648dfed..3b903f6bce98d8 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -1945,8 +1945,6 @@ xfs_free_buftarg(
> percpu_counter_destroy(&btp->bt_io_count);
> list_lru_destroy(&btp->bt_lru);
>
> - 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)
> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> index 368c05a2dea5b9..4ae3b01ed038c7 100644
> --- a/fs/xfs/xfs_super.c
> +++ b/fs/xfs/xfs_super.c
> @@ -396,14 +396,19 @@ xfs_blkdev_get(
> }
>
> STATIC void
> -xfs_close_devices(
> +xfs_shutdown_devices(
> struct xfs_mount *mp)
> {
> - if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp)
> - xfs_free_buftarg(mp->m_logdev_targp);
> - if (mp->m_rtdev_targp)
> - xfs_free_buftarg(mp->m_rtdev_targp);
> - xfs_free_buftarg(mp->m_ddev_targp);
> + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
> + blkdev_issue_flush(mp->m_logdev_targp->bt_bdev);
> + invalidate_bdev(mp->m_logdev_targp->bt_bdev);
> + }
> + if (mp->m_rtdev_targp) {
> + blkdev_issue_flush(mp->m_rtdev_targp->bt_bdev);
> + invalidate_bdev(mp->m_rtdev_targp->bt_bdev);
> + }
> + blkdev_issue_flush(mp->m_ddev_targp->bt_bdev);
> + invalidate_bdev(mp->m_ddev_targp->bt_bdev);
> }
>
> /*
> @@ -741,6 +746,17 @@ static void
> xfs_mount_free(
> struct xfs_mount *mp)
> {
> + /*
> + * Free the buftargs here because blkdev_put needs to be called outside
> + * of sb->s_umount, which is held around the call to ->put_super.
> + */
> + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp)
> + xfs_free_buftarg(mp->m_logdev_targp);
> + if (mp->m_rtdev_targp)
> + xfs_free_buftarg(mp->m_rtdev_targp);
> + if (mp->m_ddev_targp)
> + xfs_free_buftarg(mp->m_ddev_targp);
> +
> kfree(mp->m_rtname);
> kfree(mp->m_logname);
> kmem_free(mp);
> @@ -1126,7 +1142,7 @@ xfs_fs_put_super(
> xfs_inodegc_free_percpu(mp);
> xfs_destroy_percpu_counters(mp);
> xfs_destroy_mount_workqueues(mp);
> - xfs_close_devices(mp);
> + xfs_shutdown_devices(mp);
> }
>
> static long
> @@ -1499,7 +1515,7 @@ xfs_fs_fill_super(
>
> error = xfs_init_mount_workqueues(mp);
> if (error)
> - goto out_close_devices;
> + goto out_shutdown_devices;
>
> error = xfs_init_percpu_counters(mp);
> if (error)
> @@ -1713,8 +1729,8 @@ xfs_fs_fill_super(
> xfs_destroy_percpu_counters(mp);
> out_destroy_workqueues:
> xfs_destroy_mount_workqueues(mp);
> - out_close_devices:
> - xfs_close_devices(mp);
> + out_shutdown_devices:
> + xfs_shutdown_devices(mp);
> return error;
>
> out_unmount:
> --
> 2.39.2
>
next prev parent reply other threads:[~2023-08-09 22:34 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-09 22:05 s_fs_info and ->kill_sb revisited v2 Christoph Hellwig
2023-08-09 22:05 ` [PATCH 01/13] xfs: reformat the xfs_fs_free prototype Christoph Hellwig
2023-08-10 8:53 ` Christian Brauner
2023-08-10 15:51 ` Christoph Hellwig
2023-08-11 7:24 ` Christian Brauner
2023-08-09 22:05 ` [PATCH 02/13] xfs: remove a superfluous s_fs_info NULL check in xfs_fs_put_super Christoph Hellwig
2023-08-09 22:05 ` [PATCH 03/13] xfs: free the xfs_mount in ->kill_sb Christoph Hellwig
2023-08-09 22:05 ` [PATCH 04/13] xfs: remove xfs_blkdev_put Christoph Hellwig
2023-08-09 22:05 ` [PATCH 05/13] xfs: close the RT and log block devices in xfs_free_buftarg Christoph Hellwig
2023-08-09 22:05 ` [PATCH 06/13] xfs: close the external block devices in xfs_mount_free Christoph Hellwig
2023-08-09 22:34 ` Darrick J. Wong [this message]
2023-08-09 22:05 ` [PATCH 07/13] xfs: document the invalidate_bdev call in invalidate_bdev Christoph Hellwig
2023-08-09 22:39 ` Darrick J. Wong
2023-08-10 8:20 ` Christian Brauner
2023-08-10 15:53 ` Christoph Hellwig
2023-08-10 15:22 ` Matthew Wilcox
2023-08-10 15:52 ` Christoph Hellwig
2023-08-10 16:00 ` Darrick J. Wong
2023-08-10 15:57 ` Darrick J. Wong
2023-08-09 22:05 ` [PATCH 08/13] ext4: close the external journal device in ->kill_sb Christoph Hellwig
2023-08-09 22:05 ` [PATCH 09/13] exfat: don't RCU-free the sbi Christoph Hellwig
2023-08-10 13:01 ` Namjae Jeon
2023-08-09 22:05 ` [PATCH 10/13] exfat: free the sbi and iocharset in ->kill_sb Christoph Hellwig
2023-08-10 13:02 ` Namjae Jeon
2023-08-09 22:05 ` [PATCH 11/13] ntfs3: rename put_ntfs ntfs3_free_sbi Christoph Hellwig
2023-08-09 22:05 ` [PATCH 12/13] ntfs3: don't call sync_blockdev in ntfs_put_super Christoph Hellwig
2023-08-09 22:05 ` [PATCH 13/13] ntfs3: free the sbi in ->kill_sb Christoph Hellwig
2023-09-07 13:05 ` Guenter Roeck
2023-09-07 13:54 ` Christian Brauner
2023-09-07 15:23 ` Guenter Roeck
2023-09-07 15:49 ` Christian Brauner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230809223401.GW11352@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=adilger.kernel@dilger.ca \
--cc=almaz.alexandrovich@paragon-software.com \
--cc=brauner@kernel.org \
--cc=hch@lst.de \
--cc=linkinjeon@kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=ntfs3@lists.linux.dev \
--cc=sj1557.seo@samsung.com \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.