On Wed 30-08-23 12:02:47, Christian Brauner wrote: > > Yeah, good point. Done. > > From fe40c7fe1a87814f92f9b1d0b9fb78ac69404c33 Mon Sep 17 00:00:00 2001 > From: Christian Brauner <brauner@xxxxxxxxxx> > Date: Tue, 29 Aug 2023 15:05:28 +0200 > Subject: [PATCH 1/2] fs: export sget_dev() > > They will be used for mtd devices as well. > > Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/super.c | 64 ++++++++++++++++++++++++++++++++-------------- > include/linux/fs.h | 1 + > 2 files changed, 46 insertions(+), 19 deletions(-) > > diff --git a/fs/super.c b/fs/super.c > index ad7ac3a24d38..d27d80bf7c43 100644 > --- a/fs/super.c > +++ b/fs/super.c > @@ -1371,6 +1371,50 @@ int get_tree_keyed(struct fs_context *fc, > } > EXPORT_SYMBOL(get_tree_keyed); > > +static int set_bdev_super(struct super_block *s, void *data) > +{ > + s->s_dev = *(dev_t *)data; > + return 0; > +} > + > +static int super_s_dev_set(struct super_block *s, struct fs_context *fc) > +{ > + return set_bdev_super(s, fc->sget_key); > +} > + > +static int super_s_dev_test(struct super_block *s, struct fs_context *fc) > +{ > + return !(s->s_iflags & SB_I_RETIRED) && > + s->s_dev == *(dev_t *)fc->sget_key; > +} > + > +/** > + * sget_dev - Find or create a superblock by device number > + * @fc: Filesystem context. > + * @dev: device number > + * > + * Find or create a superblock using the provided device number that > + * will be stored in fc->sget_key. > + * > + * If an extant superblock is matched, then that will be returned with > + * an elevated reference count that the caller must transfer or discard. > + * > + * If no match is made, a new superblock will be allocated and basic > + * initialisation will be performed (s_type, s_fs_info, s_id, s_dev will > + * be set). The superblock will be published and it will be returned in > + * a partially constructed state with SB_BORN and SB_ACTIVE as yet > + * unset. > + * > + * Return: an existing or newly created superblock on success, an error > + * pointer on failure. > + */ > +struct super_block *sget_dev(struct fs_context *fc, dev_t dev) > +{ > + fc->sget_key = &dev; > + return sget_fc(fc, super_s_dev_test, super_s_dev_set); > +} > +EXPORT_SYMBOL(sget_dev); > + > #ifdef CONFIG_BLOCK > /* > * Lock a super block that the callers holds a reference to. > @@ -1429,23 +1473,6 @@ const struct blk_holder_ops fs_holder_ops = { > }; > EXPORT_SYMBOL_GPL(fs_holder_ops); > > -static int set_bdev_super(struct super_block *s, void *data) > -{ > - s->s_dev = *(dev_t *)data; > - return 0; > -} > - > -static int set_bdev_super_fc(struct super_block *s, struct fs_context *fc) > -{ > - return set_bdev_super(s, fc->sget_key); > -} > - > -static int test_bdev_super_fc(struct super_block *s, struct fs_context *fc) > -{ > - return !(s->s_iflags & SB_I_RETIRED) && > - s->s_dev == *(dev_t *)fc->sget_key; > -} > - > int setup_bdev_super(struct super_block *sb, int sb_flags, > struct fs_context *fc) > { > @@ -1523,8 +1550,7 @@ int get_tree_bdev(struct fs_context *fc, > } > > fc->sb_flags |= SB_NOSEC; > - fc->sget_key = &dev; > - s = sget_fc(fc, test_bdev_super_fc, set_bdev_super_fc); > + s = sget_dev(fc, dev); > if (IS_ERR(s)) > return PTR_ERR(s); > > diff --git a/include/linux/fs.h b/include/linux/fs.h > index ca8ceccde3d6..8a8d1cd5b0a9 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -2274,6 +2274,7 @@ struct super_block *sget(struct file_system_type *type, > int (*test)(struct super_block *,void *), > int (*set)(struct super_block *,void *), > int flags, void *data); > +struct super_block *sget_dev(struct fs_context *fc, dev_t dev); > > /* Alas, no aliases. Too much hassle with bringing module.h everywhere */ > #define fops_get(fops) \ > -- > 2.34.1 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR