fs: export sget_dev()
They will be used for mtd devices as well. Acked-by: Richard Weinberger <richard@nod.at> Reviewed-by: Jan Kara <jack@suse.cz> Message-Id: <20230829-vfs-super-mtd-v1-1-fecb572e5df3@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
b97d64c722
commit
69881be3d9
64
fs/super.c
64
fs/super.c
@ -1373,6 +1373,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.
|
||||
@ -1431,23 +1475,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)
|
||||
{
|
||||
@ -1525,8 +1552,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);
|
||||
|
||||
|
@ -2397,6 +2397,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) \
|
||||
|
Loading…
Reference in New Issue
Block a user