mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 09:13:38 +00:00
fs/super.c: introduce get_tree_bdev_flags()
As Allison reported [1], currently get_tree_bdev() will store "Can't lookup blockdev" error message. Although it makes sense for pure bdev-based fses, this message may mislead users who try to use EROFS file-backed mounts since get_tree_nodev() is used as a fallback then. Add get_tree_bdev_flags() to specify extensible flags [2] and GET_TREE_BDEV_QUIET_LOOKUP to silence "Can't lookup blockdev" message since it's misleading to EROFS file-backed mounts now. [1] https://lore.kernel.org/r/CAOYeF9VQ8jKVmpy5Zy9DNhO6xmWSKMB-DO8yvBB0XvBE7=3Ugg@mail.gmail.com [2] https://lore.kernel.org/r/ZwUkJEtwIpUA4qMz@infradead.org Suggested-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20241009033151.2334888-1-hsiangkao@linux.alibaba.com Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
42f7652d3e
commit
4021e68513
24
fs/super.c
24
fs/super.c
@ -1596,13 +1596,14 @@ int setup_bdev_super(struct super_block *sb, int sb_flags,
|
|||||||
EXPORT_SYMBOL_GPL(setup_bdev_super);
|
EXPORT_SYMBOL_GPL(setup_bdev_super);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_tree_bdev - Get a superblock based on a single block device
|
* get_tree_bdev_flags - Get a superblock based on a single block device
|
||||||
* @fc: The filesystem context holding the parameters
|
* @fc: The filesystem context holding the parameters
|
||||||
* @fill_super: Helper to initialise a new superblock
|
* @fill_super: Helper to initialise a new superblock
|
||||||
|
* @flags: GET_TREE_BDEV_* flags
|
||||||
*/
|
*/
|
||||||
int get_tree_bdev(struct fs_context *fc,
|
int get_tree_bdev_flags(struct fs_context *fc,
|
||||||
int (*fill_super)(struct super_block *,
|
int (*fill_super)(struct super_block *sb,
|
||||||
struct fs_context *))
|
struct fs_context *fc), unsigned int flags)
|
||||||
{
|
{
|
||||||
struct super_block *s;
|
struct super_block *s;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
@ -1613,10 +1614,10 @@ int get_tree_bdev(struct fs_context *fc,
|
|||||||
|
|
||||||
error = lookup_bdev(fc->source, &dev);
|
error = lookup_bdev(fc->source, &dev);
|
||||||
if (error) {
|
if (error) {
|
||||||
|
if (!(flags & GET_TREE_BDEV_QUIET_LOOKUP))
|
||||||
errorf(fc, "%s: Can't lookup blockdev", fc->source);
|
errorf(fc, "%s: Can't lookup blockdev", fc->source);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
fc->sb_flags |= SB_NOSEC;
|
fc->sb_flags |= SB_NOSEC;
|
||||||
s = sget_dev(fc, dev);
|
s = sget_dev(fc, dev);
|
||||||
if (IS_ERR(s))
|
if (IS_ERR(s))
|
||||||
@ -1644,6 +1645,19 @@ int get_tree_bdev(struct fs_context *fc,
|
|||||||
fc->root = dget(s->s_root);
|
fc->root = dget(s->s_root);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(get_tree_bdev_flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_tree_bdev - Get a superblock based on a single block device
|
||||||
|
* @fc: The filesystem context holding the parameters
|
||||||
|
* @fill_super: Helper to initialise a new superblock
|
||||||
|
*/
|
||||||
|
int get_tree_bdev(struct fs_context *fc,
|
||||||
|
int (*fill_super)(struct super_block *,
|
||||||
|
struct fs_context *))
|
||||||
|
{
|
||||||
|
return get_tree_bdev_flags(fc, fill_super, 0);
|
||||||
|
}
|
||||||
EXPORT_SYMBOL(get_tree_bdev);
|
EXPORT_SYMBOL(get_tree_bdev);
|
||||||
|
|
||||||
static int test_bdev_super(struct super_block *s, void *data)
|
static int test_bdev_super(struct super_block *s, void *data)
|
||||||
|
@ -160,6 +160,12 @@ extern int get_tree_keyed(struct fs_context *fc,
|
|||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
#define GET_TREE_BDEV_QUIET_LOOKUP 0x0001
|
||||||
|
int get_tree_bdev_flags(struct fs_context *fc,
|
||||||
|
int (*fill_super)(struct super_block *sb,
|
||||||
|
struct fs_context *fc), unsigned int flags);
|
||||||
|
|
||||||
extern int get_tree_bdev(struct fs_context *fc,
|
extern int get_tree_bdev(struct fs_context *fc,
|
||||||
int (*fill_super)(struct super_block *sb,
|
int (*fill_super)(struct super_block *sb,
|
||||||
struct fs_context *fc));
|
struct fs_context *fc));
|
||||||
|
Loading…
Reference in New Issue
Block a user