mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
fs: retire sget()
sget() and sget_fc() have lived side by side as near-duplicate
find-or-create-and-publish helpers for the legacy and fs_context mount
APIs. The three remaining in-tree callers (CIFS plus the ext4 extents
and mballoc KUnit tests) have all been moved to sget_fc(). Nothing
calls sget() anymore.
Delete sget() from fs/super.c and the prototype in <linux/fs.h>.
Update the two comments that referred to "sget()" or "sget{_fc}()" to
just say "sget_fc()".
This removes ~60 lines of code that only existed to be kept in
lockstep with sget_fc() on every superblock publish-path change.
Link: https://patch.msgid.link/20260529-work-sget-v2-4-57bbe08604e4@kernel.org
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
This commit is contained in:
parent
b50d895dfd
commit
12863b36bf
|
|
@ -2052,7 +2052,7 @@ static int btrfs_get_tree_subvol(struct fs_context *fc)
|
|||
* then open_ctree will properly initialize the file system specific
|
||||
* settings later. btrfs_init_fs_info initializes the static elements
|
||||
* of the fs_info (locks and such) to make cleanup easier if we find a
|
||||
* superblock with our given fs_devices later on at sget() time.
|
||||
* superblock with our given fs_devices later on at sget_fc() time.
|
||||
*/
|
||||
fs_info = kvzalloc_obj(struct btrfs_fs_info);
|
||||
if (!fs_info)
|
||||
|
|
|
|||
71
fs/super.c
71
fs/super.c
|
|
@ -328,7 +328,7 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags,
|
|||
init_rwsem(&s->s_umount);
|
||||
lockdep_set_class(&s->s_umount, &type->s_umount_key);
|
||||
/*
|
||||
* sget() can have s_umount recursion.
|
||||
* sget_fc() can have s_umount recursion.
|
||||
*
|
||||
* When it cannot find a suitable sb, it allocates a new
|
||||
* one (this one), and tries again to find a suitable old
|
||||
|
|
@ -439,7 +439,7 @@ static void kill_super_notify(struct super_block *sb)
|
|||
|
||||
/*
|
||||
* Remove it from @fs_supers so it isn't found by new
|
||||
* sget{_fc}() walkers anymore. Any concurrent mounter still
|
||||
* sget_fc() walkers anymore. Any concurrent mounter still
|
||||
* managing to grab a temporary reference is guaranteed to
|
||||
* already see SB_DYING and will wait until we notify them about
|
||||
* SB_DEAD.
|
||||
|
|
@ -517,7 +517,7 @@ EXPORT_SYMBOL(deactivate_super);
|
|||
* @sb: superblock to acquire
|
||||
*
|
||||
* Acquire a temporary reference on a superblock and try to trade it for
|
||||
* an active reference. This is used in sget{_fc}() to wait for a
|
||||
* an active reference. This is used in sget_fc() to wait for a
|
||||
* superblock to either become SB_BORN or for it to pass through
|
||||
* sb->kill() and be marked as SB_DEAD.
|
||||
*
|
||||
|
|
@ -673,11 +673,11 @@ void generic_shutdown_super(struct super_block *sb)
|
|||
/*
|
||||
* Broadcast to everyone that grabbed a temporary reference to this
|
||||
* superblock before we removed it from @fs_supers that the superblock
|
||||
* is dying. Every walker of @fs_supers outside of sget{_fc}() will now
|
||||
* is dying. Every walker of @fs_supers outside of sget_fc() will now
|
||||
* discard this superblock and treat it as dead.
|
||||
*
|
||||
* We leave the superblock on @fs_supers so it can be found by
|
||||
* sget{_fc}() until we passed sb->kill_sb().
|
||||
* sget_fc() until we passed sb->kill_sb().
|
||||
*/
|
||||
super_wake(sb, SB_DYING);
|
||||
super_unlock_excl(sb);
|
||||
|
|
@ -808,67 +808,6 @@ struct super_block *sget_fc(struct fs_context *fc,
|
|||
}
|
||||
EXPORT_SYMBOL(sget_fc);
|
||||
|
||||
/**
|
||||
* sget - find or create a superblock
|
||||
* @type: filesystem type superblock should belong to
|
||||
* @test: comparison callback
|
||||
* @set: setup callback
|
||||
* @flags: mount flags
|
||||
* @data: argument to each of them
|
||||
*/
|
||||
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 user_namespace *user_ns = current_user_ns();
|
||||
struct super_block *s = NULL;
|
||||
struct super_block *old;
|
||||
int err;
|
||||
|
||||
retry:
|
||||
spin_lock(&sb_lock);
|
||||
if (test) {
|
||||
hlist_for_each_entry(old, &type->fs_supers, s_instances) {
|
||||
if (!test(old, data))
|
||||
continue;
|
||||
if (user_ns != old->s_user_ns) {
|
||||
spin_unlock(&sb_lock);
|
||||
destroy_unused_super(s);
|
||||
return ERR_PTR(-EBUSY);
|
||||
}
|
||||
if (!grab_super(old))
|
||||
goto retry;
|
||||
destroy_unused_super(s);
|
||||
return old;
|
||||
}
|
||||
}
|
||||
if (!s) {
|
||||
spin_unlock(&sb_lock);
|
||||
s = alloc_super(type, flags, user_ns);
|
||||
if (!s)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
err = set(s, data);
|
||||
if (err) {
|
||||
spin_unlock(&sb_lock);
|
||||
destroy_unused_super(s);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
s->s_type = type;
|
||||
strscpy(s->s_id, type->name, sizeof(s->s_id));
|
||||
list_add_tail(&s->s_list, &super_blocks);
|
||||
hlist_add_head(&s->s_instances, &type->fs_supers);
|
||||
spin_unlock(&sb_lock);
|
||||
get_filesystem(type);
|
||||
shrinker_register(s->s_shrink);
|
||||
return s;
|
||||
}
|
||||
EXPORT_SYMBOL(sget);
|
||||
|
||||
void drop_super(struct super_block *sb)
|
||||
{
|
||||
super_unlock_shared(sb);
|
||||
|
|
|
|||
|
|
@ -2327,10 +2327,6 @@ void free_anon_bdev(dev_t);
|
|||
struct super_block *sget_fc(struct fs_context *fc,
|
||||
int (*test)(struct super_block *, struct fs_context *),
|
||||
int (*set)(struct super_block *, struct fs_context *));
|
||||
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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user