mirror of
https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
synced 2025-09-15 09:07:11 +10:00
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);
|
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
|
#ifdef CONFIG_BLOCK
|
||||||
/*
|
/*
|
||||||
* Lock a super block that the callers holds a reference to.
|
* 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);
|
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,
|
int setup_bdev_super(struct super_block *sb, int sb_flags,
|
||||||
struct fs_context *fc)
|
struct fs_context *fc)
|
||||||
{
|
{
|
||||||
@ -1525,8 +1552,7 @@ int get_tree_bdev(struct fs_context *fc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fc->sb_flags |= SB_NOSEC;
|
fc->sb_flags |= SB_NOSEC;
|
||||||
fc->sget_key = &dev;
|
s = sget_dev(fc, dev);
|
||||||
s = sget_fc(fc, test_bdev_super_fc, set_bdev_super_fc);
|
|
||||||
if (IS_ERR(s))
|
if (IS_ERR(s))
|
||||||
return PTR_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 (*test)(struct super_block *,void *),
|
||||||
int (*set)(struct super_block *,void *),
|
int (*set)(struct super_block *,void *),
|
||||||
int flags, void *data);
|
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 */
|
/* Alas, no aliases. Too much hassle with bringing module.h everywhere */
|
||||||
#define fops_get(fops) \
|
#define fops_get(fops) \
|
||||||
|
Loading…
Reference in New Issue
Block a user