All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] fs: simplify vfs_get_super
@ 2022-10-31 12:46 Christoph Hellwig
  2022-11-21  7:50 ` Christoph Hellwig
  2022-11-28 12:01 ` Christian Brauner
  0 siblings, 2 replies; 4+ messages in thread
From: Christoph Hellwig @ 2022-10-31 12:46 UTC (permalink / raw)
  To: viro; +Cc: linux-fsdevel

Remove the pointless keying argument and associated enum and pass the
fill_super callback and a "bool reconf" instead.  Also mark the function
static given that there are no users outside of super.c.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 Documentation/filesystems/mount_api.rst | 11 -----
 fs/super.c                              | 60 ++++---------------------
 include/linux/fs_context.h              | 14 ------
 3 files changed, 9 insertions(+), 76 deletions(-)

diff --git a/Documentation/filesystems/mount_api.rst b/Documentation/filesystems/mount_api.rst
index eb358a00be279..6114daf337978 100644
--- a/Documentation/filesystems/mount_api.rst
+++ b/Documentation/filesystems/mount_api.rst
@@ -562,17 +562,6 @@ or looking up of superblocks.
 
 The following helpers all wrap sget_fc():
 
-   * ::
-
-       int vfs_get_super(struct fs_context *fc,
-		         enum vfs_get_super_keying keying,
-		         int (*fill_super)(struct super_block *sb,
-					   struct fs_context *fc))
-
-     This creates/looks up a deviceless superblock.  The keying indicates how
-     many superblocks of this type may exist and in what manner they may be
-     shared:
-
 	(1) vfs_get_single_super
 
 	    Only one such superblock may exist in the system.  Any further
diff --git a/fs/super.c b/fs/super.c
index 8d39e4f11cfa3..12c08cb20405d 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1112,55 +1112,14 @@ static int test_single_super(struct super_block *s, struct fs_context *fc)
 	return 1;
 }
 
-/**
- * vfs_get_super - Get a superblock with a search key set in s_fs_info.
- * @fc: The filesystem context holding the parameters
- * @keying: How to distinguish superblocks
- * @fill_super: Helper to initialise a new superblock
- *
- * Search for a superblock and create a new one if not found.  The search
- * criterion is controlled by @keying.  If the search fails, a new superblock
- * is created and @fill_super() is called to initialise it.
- *
- * @keying can take one of a number of values:
- *
- * (1) vfs_get_single_super - Only one superblock of this type may exist on the
- *     system.  This is typically used for special system filesystems.
- *
- * (2) vfs_get_keyed_super - Multiple superblocks may exist, but they must have
- *     distinct keys (where the key is in s_fs_info).  Searching for the same
- *     key again will turn up the superblock for that key.
- *
- * (3) vfs_get_independent_super - Multiple superblocks may exist and are
- *     unkeyed.  Each call will get a new superblock.
- *
- * A permissions check is made by sget_fc() unless we're getting a superblock
- * for a kernel-internal mount or a submount.
- */
-int vfs_get_super(struct fs_context *fc,
-		  enum vfs_get_super_keying keying,
-		  int (*fill_super)(struct super_block *sb,
-				    struct fs_context *fc))
+static int vfs_get_super(struct fs_context *fc, bool reconf,
+		int (*test)(struct super_block *, struct fs_context *),
+		int (*fill_super)(struct super_block *sb,
+				  struct fs_context *fc))
 {
-	int (*test)(struct super_block *, struct fs_context *);
 	struct super_block *sb;
 	int err;
 
-	switch (keying) {
-	case vfs_get_single_super:
-	case vfs_get_single_reconf_super:
-		test = test_single_super;
-		break;
-	case vfs_get_keyed_super:
-		test = test_keyed_super;
-		break;
-	case vfs_get_independent_super:
-		test = NULL;
-		break;
-	default:
-		BUG();
-	}
-
 	sb = sget_fc(fc, test, set_anon_super_fc);
 	if (IS_ERR(sb))
 		return PTR_ERR(sb);
@@ -1174,7 +1133,7 @@ int vfs_get_super(struct fs_context *fc,
 		fc->root = dget(sb->s_root);
 	} else {
 		fc->root = dget(sb->s_root);
-		if (keying == vfs_get_single_reconf_super) {
+		if (reconf) {
 			err = reconfigure_super(fc);
 			if (err < 0) {
 				dput(fc->root);
@@ -1190,13 +1149,12 @@ int vfs_get_super(struct fs_context *fc,
 	deactivate_locked_super(sb);
 	return err;
 }
-EXPORT_SYMBOL(vfs_get_super);
 
 int get_tree_nodev(struct fs_context *fc,
 		  int (*fill_super)(struct super_block *sb,
 				    struct fs_context *fc))
 {
-	return vfs_get_super(fc, vfs_get_independent_super, fill_super);
+	return vfs_get_super(fc, false, NULL, fill_super);
 }
 EXPORT_SYMBOL(get_tree_nodev);
 
@@ -1204,7 +1162,7 @@ int get_tree_single(struct fs_context *fc,
 		  int (*fill_super)(struct super_block *sb,
 				    struct fs_context *fc))
 {
-	return vfs_get_super(fc, vfs_get_single_super, fill_super);
+	return vfs_get_super(fc, false, test_single_super, fill_super);
 }
 EXPORT_SYMBOL(get_tree_single);
 
@@ -1212,7 +1170,7 @@ int get_tree_single_reconf(struct fs_context *fc,
 		  int (*fill_super)(struct super_block *sb,
 				    struct fs_context *fc))
 {
-	return vfs_get_super(fc, vfs_get_single_reconf_super, fill_super);
+	return vfs_get_super(fc, true, test_single_super, fill_super);
 }
 EXPORT_SYMBOL(get_tree_single_reconf);
 
@@ -1222,7 +1180,7 @@ int get_tree_keyed(struct fs_context *fc,
 		void *key)
 {
 	fc->s_fs_info = key;
-	return vfs_get_super(fc, vfs_get_keyed_super, fill_super);
+	return vfs_get_super(fc, false, test_keyed_super, fill_super);
 }
 EXPORT_SYMBOL(get_tree_keyed);
 
diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h
index 13fa6f3df8e46..87a34f2fa68de 100644
--- a/include/linux/fs_context.h
+++ b/include/linux/fs_context.h
@@ -145,20 +145,6 @@ extern void fc_drop_locked(struct fs_context *fc);
 int reconfigure_single(struct super_block *s,
 		       int flags, void *data);
 
-/*
- * sget() wrappers to be called from the ->get_tree() op.
- */
-enum vfs_get_super_keying {
-	vfs_get_single_super,	/* Only one such superblock may exist */
-	vfs_get_single_reconf_super, /* As above, but reconfigure if it exists */
-	vfs_get_keyed_super,	/* Superblocks with different s_fs_info keys may exist */
-	vfs_get_independent_super, /* Multiple independent superblocks may exist */
-};
-extern int vfs_get_super(struct fs_context *fc,
-			 enum vfs_get_super_keying keying,
-			 int (*fill_super)(struct super_block *sb,
-					   struct fs_context *fc));
-
 extern int get_tree_nodev(struct fs_context *fc,
 			 int (*fill_super)(struct super_block *sb,
 					   struct fs_context *fc));
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] fs: simplify vfs_get_super
  2022-10-31 12:46 [PATCH] fs: simplify vfs_get_super Christoph Hellwig
@ 2022-11-21  7:50 ` Christoph Hellwig
  2022-11-25  4:32   ` Al Viro
  2022-11-28 12:01 ` Christian Brauner
  1 sibling, 1 reply; 4+ messages in thread
From: Christoph Hellwig @ 2022-11-21  7:50 UTC (permalink / raw)
  To: viro; +Cc: linux-fsdevel

On Mon, Oct 31, 2022 at 01:46:26PM +0100, Christoph Hellwig wrote:
> Remove the pointless keying argument and associated enum and pass the
> fill_super callback and a "bool reconf" instead.  Also mark the function
> static given that there are no users outside of super.c.

Al, can you pick this one up?

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] fs: simplify vfs_get_super
  2022-11-21  7:50 ` Christoph Hellwig
@ 2022-11-25  4:32   ` Al Viro
  0 siblings, 0 replies; 4+ messages in thread
From: Al Viro @ 2022-11-25  4:32 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-fsdevel

On Mon, Nov 21, 2022 at 08:50:32AM +0100, Christoph Hellwig wrote:
> On Mon, Oct 31, 2022 at 01:46:26PM +0100, Christoph Hellwig wrote:
> > Remove the pointless keying argument and associated enum and pass the
> > fill_super callback and a "bool reconf" instead.  Also mark the function
> > static given that there are no users outside of super.c.
> 
> Al, can you pick this one up?

Applied, even though I want to see if we can lift sget_fc() out of that
thing and turn it into something that would just handle the "here's
a superblock, here's fc, here's fill_super callback, do the right
thing" part and hopefully might be reused in bdev part...

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] fs: simplify vfs_get_super
  2022-10-31 12:46 [PATCH] fs: simplify vfs_get_super Christoph Hellwig
  2022-11-21  7:50 ` Christoph Hellwig
@ 2022-11-28 12:01 ` Christian Brauner
  1 sibling, 0 replies; 4+ messages in thread
From: Christian Brauner @ 2022-11-28 12:01 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: viro, linux-fsdevel

On Mon, Oct 31, 2022 at 01:46:26PM +0100, Christoph Hellwig wrote:
> Remove the pointless keying argument and associated enum and pass the
> fill_super callback and a "bool reconf" instead.  Also mark the function
> static given that there are no users outside of super.c.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---

Looks good,
Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-11-28 12:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-31 12:46 [PATCH] fs: simplify vfs_get_super Christoph Hellwig
2022-11-21  7:50 ` Christoph Hellwig
2022-11-25  4:32   ` Al Viro
2022-11-28 12:01 ` Christian Brauner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.