244 lines
7.3 KiB
Diff
244 lines
7.3 KiB
Diff
From ecbb1b105f3616d4342dba0f840dcf9265dfbea0 Mon Sep 17 00:00:00 2001
|
|
From: Ondrej Mosnacek <omosnace@redhat.com>
|
|
Date: Wed, 3 Jun 2026 10:42:36 +0200
|
|
Subject: [PATCH] fs: prepare for stackable filesystems backing file helpers
|
|
|
|
JIRA: https://issues.redhat.com/browse/RHEL-179443
|
|
CVE: CVE-2026-46054
|
|
|
|
commit f91a704f7161c2cf0fcd41fa9fbec4355b813fff
|
|
Author: Amir Goldstein <amir73il@gmail.com>
|
|
Date: Mon Oct 2 17:19:46 2023 +0300
|
|
|
|
fs: prepare for stackable filesystems backing file helpers
|
|
|
|
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>
|
|
|
|
Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
|
|
|
|
diff --git a/MAINTAINERS b/MAINTAINERS
|
|
index f5dcab467670..3a29f2d3a2b1 100644
|
|
--- a/MAINTAINERS
|
|
+++ b/MAINTAINERS
|
|
@@ -7475,6 +7475,15 @@ F: fs/mnt_idmapping.c
|
|
F: include/linux/mnt_idmapping.*
|
|
F: tools/testing/selftests/mount_setattr/
|
|
|
|
+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
|
|
diff --git a/fs/Kconfig b/fs/Kconfig
|
|
index 5378e55f87d3..a9c6fa9cff1f 100644
|
|
--- a/fs/Kconfig
|
|
+++ b/fs/Kconfig
|
|
@@ -18,6 +18,10 @@ config VALIDATE_FS_PARSER
|
|
config FS_IOMAP
|
|
bool
|
|
|
|
+# Stackable filesystems
|
|
+config FS_STACK
|
|
+ bool
|
|
+
|
|
config BUFFER_HEAD
|
|
bool
|
|
|
|
diff --git a/fs/Makefile b/fs/Makefile
|
|
index 0da17ff145c6..716c9fe04dec 100644
|
|
--- a/fs/Makefile
|
|
+++ b/fs/Makefile
|
|
@@ -41,6 +41,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
|
|
index 000000000000..04b33036f709
|
|
--- /dev/null
|
|
+++ b/fs/backing-file.c
|
|
@@ -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);
|
|
diff --git a/fs/open.c b/fs/open.c
|
|
index 45547548a0e5..4260d61560d4 100644
|
|
--- a/fs/open.c
|
|
+++ b/fs/open.c
|
|
@@ -1141,44 +1141,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)
|
|
|
|
diff --git a/fs/overlayfs/Kconfig b/fs/overlayfs/Kconfig
|
|
index 6708e54b0e30..148d9567b5c3 100644
|
|
--- a/fs/overlayfs/Kconfig
|
|
+++ b/fs/overlayfs/Kconfig
|
|
@@ -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
|
|
diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
|
|
index cd0770bb3020..634a96a65bfd 100644
|
|
--- a/fs/overlayfs/file.c
|
|
+++ b/fs/overlayfs/file.c
|
|
@@ -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
|
|
index 000000000000..55c9e804f780
|
|
--- /dev/null
|
|
+++ b/include/linux/backing-file.h
|
|
@@ -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 */
|
|
diff --git a/include/linux/fs.h b/include/linux/fs.h
|
|
index 1927fcdad989..5f3ca25c77e5 100644
|
|
--- a/include/linux/fs.h
|
|
+++ b/include/linux/fs.h
|
|
@@ -2586,9 +2586,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);
|
|
|
|
/*
|
|
--
|
|
2.50.1 (Apple Git-155)
|
|
|