]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs: prepare for stackable filesystems backing file helpers
authorAmir Goldstein <amir73il@gmail.com>
Mon, 2 Oct 2023 14:19:46 +0000 (17:19 +0300)
committerAmir Goldstein <amir73il@gmail.com>
Sat, 23 Dec 2023 14:35:08 +0000 (16:35 +0200)
In preparation for factoring out some backing file io helpers from
overlayfs, move backing_file_open() into a new file fs/backing-file.c
and header.

Add a MAINTAINERS entry for stackable filesystems and add a Kconfig
FS_STACK which stackable filesystems need to select.

For now, the backing_file struct, the backing_file alloc/free functions
and the backing_file_real_path() accessor remain internal to file_table.c.
We may change that in the future.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
MAINTAINERS
fs/Kconfig
fs/Makefile
fs/backing-file.c [new file with mode: 0644]
fs/open.c
fs/overlayfs/Kconfig
fs/overlayfs/file.c
include/linux/backing-file.h [new file with mode: 0644]
include/linux/fs.h

index 97f51d5ec1cfd715487a616c78afd40324082dfc..d9ae2688f5c893cb61dd4f9d31e36ddbdfea26cd 100644 (file)
@@ -8186,6 +8186,15 @@ S:       Supported
 F:     fs/iomap/
 F:     include/linux/iomap.h
 
+FILESYSTEMS [STACKABLE]
+M:     Miklos Szeredi <miklos@szeredi.hu>
+M:     Amir Goldstein <amir73il@gmail.com>
+L:     linux-fsdevel@vger.kernel.org
+L:     linux-unionfs@vger.kernel.org
+S:     Maintained
+F:     fs/backing-file.c
+F:     include/linux/backing-file.h
+
 FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
 M:     Riku Voipio <riku.voipio@iki.fi>
 L:     linux-hwmon@vger.kernel.org
index fd1f655b4f1ff38d20df8d939e750e9982d02147..c47fa4eb9282a37ab68ad2d3325aeebfa76d1ff2 100644 (file)
@@ -18,6 +18,10 @@ config VALIDATE_FS_PARSER
 config FS_IOMAP
        bool
 
+# Stackable filesystems
+config FS_STACK
+       bool
+
 config BUFFER_HEAD
        bool
 
index 75522f88e763670ca38010401975209c114fc67e..a6962c588962d0a50fdb11c1fe31da59fe19ee88 100644 (file)
@@ -39,6 +39,7 @@ obj-$(CONFIG_COMPAT_BINFMT_ELF)       += compat_binfmt_elf.o
 obj-$(CONFIG_BINFMT_ELF_FDPIC) += binfmt_elf_fdpic.o
 obj-$(CONFIG_BINFMT_FLAT)      += binfmt_flat.o
 
+obj-$(CONFIG_FS_STACK)         += backing-file.o
 obj-$(CONFIG_FS_MBCACHE)       += mbcache.o
 obj-$(CONFIG_FS_POSIX_ACL)     += posix_acl.o
 obj-$(CONFIG_NFS_COMMON)       += nfs_common/
diff --git a/fs/backing-file.c b/fs/backing-file.c
new file mode 100644 (file)
index 0000000..04b3303
--- /dev/null
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Common helpers for stackable filesystems and backing files.
+ *
+ * Copyright (C) 2023 CTERA Networks.
+ */
+
+#include <linux/fs.h>
+#include <linux/backing-file.h>
+
+#include "internal.h"
+
+/**
+ * backing_file_open - open a backing file for kernel internal use
+ * @user_path: path that the user reuqested to open
+ * @flags:     open flags
+ * @real_path: path of the backing file
+ * @cred:      credentials for open
+ *
+ * Open a backing file for a stackable filesystem (e.g., overlayfs).
+ * @user_path may be on the stackable filesystem and @real_path on the
+ * underlying filesystem.  In this case, we want to be able to return the
+ * @user_path of the stackable filesystem. This is done by embedding the
+ * returned file into a container structure that also stores the stacked
+ * file's path, which can be retrieved using backing_file_user_path().
+ */
+struct file *backing_file_open(const struct path *user_path, int flags,
+                              const struct path *real_path,
+                              const struct cred *cred)
+{
+       struct file *f;
+       int error;
+
+       f = alloc_empty_backing_file(flags, cred);
+       if (IS_ERR(f))
+               return f;
+
+       path_get(user_path);
+       *backing_file_user_path(f) = *user_path;
+       error = vfs_open(real_path, f);
+       if (error) {
+               fput(f);
+               f = ERR_PTR(error);
+       }
+
+       return f;
+}
+EXPORT_SYMBOL_GPL(backing_file_open);
index d877228d5939cc474643d4bb7fc310a6d1f9a59a..a7505423743797fa79d024e7581cffd04fe5ef8c 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -1184,44 +1184,6 @@ struct file *kernel_file_open(const struct path *path, int flags,
 }
 EXPORT_SYMBOL_GPL(kernel_file_open);
 
-/**
- * backing_file_open - open a backing file for kernel internal use
- * @user_path: path that the user reuqested to open
- * @flags:     open flags
- * @real_path: path of the backing file
- * @cred:      credentials for open
- *
- * Open a backing file for a stackable filesystem (e.g., overlayfs).
- * @user_path may be on the stackable filesystem and @real_path on the
- * underlying filesystem.  In this case, we want to be able to return the
- * @user_path of the stackable filesystem. This is done by embedding the
- * returned file into a container structure that also stores the stacked
- * file's path, which can be retrieved using backing_file_user_path().
- */
-struct file *backing_file_open(const struct path *user_path, int flags,
-                              const struct path *real_path,
-                              const struct cred *cred)
-{
-       struct file *f;
-       int error;
-
-       f = alloc_empty_backing_file(flags, cred);
-       if (IS_ERR(f))
-               return f;
-
-       path_get(user_path);
-       *backing_file_user_path(f) = *user_path;
-       f->f_path = *real_path;
-       error = do_dentry_open(f, d_inode(real_path->dentry), NULL);
-       if (error) {
-               fput(f);
-               f = ERR_PTR(error);
-       }
-
-       return f;
-}
-EXPORT_SYMBOL_GPL(backing_file_open);
-
 #define WILL_CREATE(flags)     (flags & (O_CREAT | __O_TMPFILE))
 #define O_PATH_FLAGS           (O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC)
 
index fec5020c3495039e0eda0c865aaf10b989779588..2ac67e04a6fbede386e3a8e0008a1ad1de2d3f9b 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 config OVERLAY_FS
        tristate "Overlay filesystem support"
+       select FS_STACK
        select EXPORTFS
        help
          An overlay filesystem combines two filesystems - an 'upper' filesystem
index 4e46420c8fdd621b9472111815a668d93c065712..a6da3eaf6d4f40aacdde8d0655245fa76c1ab838 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/security.h>
 #include <linux/mm.h>
 #include <linux/fs.h>
+#include <linux/backing-file.h>
 #include "overlayfs.h"
 
 #include "../internal.h"       /* for sb_init_dio_done_wq */
diff --git a/include/linux/backing-file.h b/include/linux/backing-file.h
new file mode 100644 (file)
index 0000000..55c9e80
--- /dev/null
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Common helpers for stackable filesystems and backing files.
+ *
+ * Copyright (C) 2023 CTERA Networks.
+ */
+
+#ifndef _LINUX_BACKING_FILE_H
+#define _LINUX_BACKING_FILE_H
+
+#include <linux/file.h>
+
+struct file *backing_file_open(const struct path *user_path, int flags,
+                              const struct path *real_path,
+                              const struct cred *cred);
+
+#endif /* _LINUX_BACKING_FILE_H */
index 900d0cd55b50ff26c3de6706cec0f772659c09f4..db5d07e6e02eeddaff205a407da8b6b362c8ddf8 100644 (file)
@@ -2575,9 +2575,6 @@ struct file *dentry_open(const struct path *path, int flags,
                         const struct cred *creds);
 struct file *dentry_create(const struct path *path, int flags, umode_t mode,
                           const struct cred *cred);
-struct file *backing_file_open(const struct path *user_path, int flags,
-                              const struct path *real_path,
-                              const struct cred *cred);
 struct path *backing_file_user_path(struct file *f);
 
 /*