From: Jan Kara <jack@suse.cz>
To: Christoph Hellwig <hch@lst.de>
Cc: Al Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
Chris Mason <clm@fb.com>, Josef Bacik <josef@toxicpanda.com>,
David Sterba <dsterba@suse.com>, Theodore Ts'o <tytso@mit.edu>,
Andreas Dilger <adilger.kernel@dilger.ca>,
Jaegeuk Kim <jaegeuk@kernel.org>, Chao Yu <chao@kernel.org>,
Ryusuke Konishi <konishi.ryusuke@gmail.com>,
"Darrick J. Wong" <djwong@kernel.org>,
Jens Axboe <axboe@kernel.dk>,
linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net,
linux-nilfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-xfs@vger.kernel.org, linux-block@vger.kernel.org
Subject: Re: [PATCH 02/12] nilfs2: use setup_bdev_super to de-duplicate the mount code
Date: Thu, 3 Aug 2023 13:46:51 +0200 [thread overview]
Message-ID: <20230803114651.ihtqqgthbdjjgxev@quack3> (raw)
In-Reply-To: <20230802154131.2221419-3-hch@lst.de>
On Wed 02-08-23 17:41:21, Christoph Hellwig wrote:
> Use the generic setup_bdev_super helper to open the main block device
> and do various bits of superblock setup instead of duplicating the
> logic. This includes moving to the new scheme implemented in common
> code that only opens the block device after the superblock has allocated.
>
> It does not yet convert nilfs2 to the new mount API, but doing so will
> become a bit simpler after this first step.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
AFAICS nilfs2 could *almost* use mount_bdev() directly and then just do its
snapshot thing after mount_bdev() returns. But it has this weird logic
that: "if the superblock is already mounted but we can shrink the whole
dcache, then do remount instead of ignoring mount options". Firstly, this
looks racy - what prevents someone from say opening a file on the sb just
after nilfs_tree_is_busy() shrinks dcache? Secondly, it is inconsistent
with any other filesystem so it's going to surprise sysadmins not
intimately knowing nilfs2. Thirdly, from userspace you cannot tell what
your mount call is going to do. Last but not least, what is it really good
for? Ryusuke, can you explain please?
Honza
> ---
> fs/nilfs2/super.c | 81 ++++++++++++++++++-----------------------------
> 1 file changed, 30 insertions(+), 51 deletions(-)
>
> diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
> index 0ef8c71bde8e5f..a5d1fa4e7552f6 100644
> --- a/fs/nilfs2/super.c
> +++ b/fs/nilfs2/super.c
> @@ -35,6 +35,7 @@
> #include <linux/writeback.h>
> #include <linux/seq_file.h>
> #include <linux/mount.h>
> +#include <linux/fs_context.h>
> #include "nilfs.h"
> #include "export.h"
> #include "mdt.h"
> @@ -1216,7 +1217,6 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data)
> }
>
> struct nilfs_super_data {
> - struct block_device *bdev;
> __u64 cno;
> int flags;
> };
> @@ -1283,64 +1283,49 @@ static int nilfs_identify(char *data, struct nilfs_super_data *sd)
>
> static int nilfs_set_bdev_super(struct super_block *s, void *data)
> {
> - s->s_bdev = data;
> - s->s_dev = s->s_bdev->bd_dev;
> + s->s_dev = *(dev_t *)data;
> return 0;
> }
>
> static int nilfs_test_bdev_super(struct super_block *s, void *data)
> {
> - return (void *)s->s_bdev == data;
> + return !(s->s_iflags & SB_I_RETIRED) && s->s_dev == *(dev_t *)data;
> }
>
> static struct dentry *
> nilfs_mount(struct file_system_type *fs_type, int flags,
> const char *dev_name, void *data)
> {
> - struct nilfs_super_data sd;
> + struct nilfs_super_data sd = { .flags = flags };
> struct super_block *s;
> - struct dentry *root_dentry;
> - int err, s_new = false;
> + dev_t dev;
> + int err;
>
> - sd.bdev = blkdev_get_by_path(dev_name, sb_open_mode(flags), fs_type,
> - NULL);
> - if (IS_ERR(sd.bdev))
> - return ERR_CAST(sd.bdev);
> + if (nilfs_identify(data, &sd))
> + return ERR_PTR(-EINVAL);
>
> - sd.cno = 0;
> - sd.flags = flags;
> - if (nilfs_identify((char *)data, &sd)) {
> - err = -EINVAL;
> - goto failed;
> - }
> + err = lookup_bdev(dev_name, &dev);
> + if (err)
> + return ERR_PTR(err);
>
> - /*
> - * once the super is inserted into the list by sget, s_umount
> - * will protect the lockfs code from trying to start a snapshot
> - * while we are mounting
> - */
> - mutex_lock(&sd.bdev->bd_fsfreeze_mutex);
> - if (sd.bdev->bd_fsfreeze_count > 0) {
> - mutex_unlock(&sd.bdev->bd_fsfreeze_mutex);
> - err = -EBUSY;
> - goto failed;
> - }
> s = sget(fs_type, nilfs_test_bdev_super, nilfs_set_bdev_super, flags,
> - sd.bdev);
> - mutex_unlock(&sd.bdev->bd_fsfreeze_mutex);
> - if (IS_ERR(s)) {
> - err = PTR_ERR(s);
> - goto failed;
> - }
> + &dev);
> + if (IS_ERR(s))
> + return ERR_CAST(s);
>
> if (!s->s_root) {
> - s_new = true;
> -
> - /* New superblock instance created */
> - snprintf(s->s_id, sizeof(s->s_id), "%pg", sd.bdev);
> - sb_set_blocksize(s, block_size(sd.bdev));
> -
> - err = nilfs_fill_super(s, data, flags & SB_SILENT ? 1 : 0);
> + /*
> + * We drop s_umount here because we need to open the bdev and
> + * bdev->open_mutex ranks above s_umount (blkdev_put() ->
> + * __invalidate_device()). It is safe because we have active sb
> + * reference and SB_BORN is not set yet.
> + */
> + up_write(&s->s_umount);
> + err = setup_bdev_super(s, flags, NULL);
> + down_write(&s->s_umount);
> + if (!err)
> + err = nilfs_fill_super(s, data,
> + flags & SB_SILENT ? 1 : 0);
> if (err)
> goto failed_super;
>
> @@ -1366,24 +1351,18 @@ nilfs_mount(struct file_system_type *fs_type, int flags,
> }
>
> if (sd.cno) {
> + struct dentry *root_dentry;
> +
> err = nilfs_attach_snapshot(s, sd.cno, &root_dentry);
> if (err)
> goto failed_super;
> - } else {
> - root_dentry = dget(s->s_root);
> + return root_dentry;
> }
>
> - if (!s_new)
> - blkdev_put(sd.bdev, fs_type);
> -
> - return root_dentry;
> + return dget(s->s_root);
>
> failed_super:
> deactivate_locked_super(s);
> -
> - failed:
> - if (!s_new)
> - blkdev_put(sd.bdev, fs_type);
> return ERR_PTR(err);
> }
>
> --
> 2.39.2
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
next prev parent reply other threads:[~2023-08-03 11:47 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-02 15:41 more blkdev_get and holder work Christoph Hellwig
2023-08-02 15:41 ` [PATCH 01/12] fs: export setup_bdev_super Christoph Hellwig
2023-08-03 18:04 ` Christian Brauner
2023-09-04 18:11 ` [f2fs-dev] " patchwork-bot+f2fs
2023-08-02 15:41 ` [PATCH 02/12] nilfs2: use setup_bdev_super to de-duplicate the mount code Christoph Hellwig
2023-08-03 11:46 ` Jan Kara [this message]
2023-08-04 2:01 ` Ryusuke Konishi
2023-08-10 11:05 ` Jan Kara
2023-08-10 16:39 ` Ryusuke Konishi
2023-08-10 18:14 ` Jan Kara
2023-08-04 5:04 ` Ryusuke Konishi
2023-08-02 15:41 ` [PATCH 03/12] btrfs: always open the device read-only in btrfs_scan_one_device Christoph Hellwig
2023-08-02 15:41 ` [PATCH 04/12] btrfs: open block devices after superblock creation Christoph Hellwig
2023-08-02 15:41 ` [PATCH 05/12] ext4: make the IS_EXT2_SB/IS_EXT3_SB checks more robust Christoph Hellwig
2023-08-03 11:21 ` Jan Kara
2023-08-03 18:10 ` Christian Brauner
2023-08-04 20:34 ` Theodore Ts'o
2023-08-02 15:41 ` [PATCH 06/12] fs: use the super_block as holder when mounting file systems Christoph Hellwig
2023-08-03 11:51 ` Jan Kara
2023-08-03 13:33 ` Jan Kara
2023-08-05 8:36 ` Christoph Hellwig
2023-08-03 18:11 ` Christian Brauner
2023-08-02 15:41 ` [PATCH 07/12] fs: stop using get_super in fs_mark_dead Christoph Hellwig
2023-08-03 13:12 ` Jan Kara
2023-08-03 18:15 ` Christian Brauner
2023-08-02 15:41 ` [PATCH 08/12] fs: export fs_holder_ops Christoph Hellwig
2023-08-03 13:16 ` Jan Kara
2023-08-03 18:15 ` Christian Brauner
2023-08-02 15:41 ` [PATCH 09/12] ext4: drop s_umount over opening the log device Christoph Hellwig
2023-08-03 13:25 ` Jan Kara
2023-08-03 18:16 ` Christian Brauner
2023-08-04 20:34 ` Theodore Ts'o
2023-08-02 15:41 ` [PATCH 10/12] ext4: use fs_holder_ops for " Christoph Hellwig
2023-08-03 13:26 ` Jan Kara
2023-08-02 15:41 ` [PATCH 11/12] xfs: drop s_umount over opening the log and RT devices Christoph Hellwig
2023-08-02 16:32 ` Darrick J. Wong
2023-08-05 8:32 ` Christoph Hellwig
2023-08-05 10:39 ` Christian Brauner
2023-08-05 16:19 ` Darrick J. Wong
2023-08-05 17:13 ` Christian Brauner
2023-08-02 15:41 ` [PATCH 12/12] xfs use fs_holder_ops for " Christoph Hellwig
2023-08-02 16:33 ` Darrick J. Wong
2023-08-14 10:58 ` Carlos Maiolino
2023-08-14 11:05 ` Carlos Maiolino
2023-08-04 15:39 ` more blkdev_get and holder work 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=20230803114651.ihtqqgthbdjjgxev@quack3 \
--to=jack@suse.cz \
--cc=adilger.kernel@dilger.ca \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=chao@kernel.org \
--cc=clm@fb.com \
--cc=djwong@kernel.org \
--cc=dsterba@suse.com \
--cc=hch@lst.de \
--cc=jaegeuk@kernel.org \
--cc=josef@toxicpanda.com \
--cc=konishi.ryusuke@gmail.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-nilfs@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).