mirror of
https://github.com/torvalds/linux
synced 2024-07-21 10:41:44 +00:00
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>
This commit is contained in:
parent
d9e5d31084
commit
f91a704f71
|
@ -8186,6 +8186,15 @@ S: Supported
|
||||||
F: fs/iomap/
|
F: fs/iomap/
|
||||||
F: include/linux/iomap.h
|
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
|
FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
|
||||||
M: Riku Voipio <riku.voipio@iki.fi>
|
M: Riku Voipio <riku.voipio@iki.fi>
|
||||||
L: linux-hwmon@vger.kernel.org
|
L: linux-hwmon@vger.kernel.org
|
||||||
|
|
|
@ -18,6 +18,10 @@ config VALIDATE_FS_PARSER
|
||||||
config FS_IOMAP
|
config FS_IOMAP
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
# Stackable filesystems
|
||||||
|
config FS_STACK
|
||||||
|
bool
|
||||||
|
|
||||||
config BUFFER_HEAD
|
config BUFFER_HEAD
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
|
|
@ -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_ELF_FDPIC) += binfmt_elf_fdpic.o
|
||||||
obj-$(CONFIG_BINFMT_FLAT) += binfmt_flat.o
|
obj-$(CONFIG_BINFMT_FLAT) += binfmt_flat.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_FS_STACK) += backing-file.o
|
||||||
obj-$(CONFIG_FS_MBCACHE) += mbcache.o
|
obj-$(CONFIG_FS_MBCACHE) += mbcache.o
|
||||||
obj-$(CONFIG_FS_POSIX_ACL) += posix_acl.o
|
obj-$(CONFIG_FS_POSIX_ACL) += posix_acl.o
|
||||||
obj-$(CONFIG_NFS_COMMON) += nfs_common/
|
obj-$(CONFIG_NFS_COMMON) += nfs_common/
|
||||||
|
|
48
fs/backing-file.c
Normal file
48
fs/backing-file.c
Normal file
|
@ -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);
|
38
fs/open.c
38
fs/open.c
|
@ -1184,44 +1184,6 @@ struct file *kernel_file_open(const struct path *path, int flags,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kernel_file_open);
|
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 WILL_CREATE(flags) (flags & (O_CREAT | __O_TMPFILE))
|
||||||
#define O_PATH_FLAGS (O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC)
|
#define O_PATH_FLAGS (O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0-only
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
config OVERLAY_FS
|
config OVERLAY_FS
|
||||||
tristate "Overlay filesystem support"
|
tristate "Overlay filesystem support"
|
||||||
|
select FS_STACK
|
||||||
select EXPORTFS
|
select EXPORTFS
|
||||||
help
|
help
|
||||||
An overlay filesystem combines two filesystems - an 'upper' filesystem
|
An overlay filesystem combines two filesystems - an 'upper' filesystem
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
#include <linux/backing-file.h>
|
||||||
#include "overlayfs.h"
|
#include "overlayfs.h"
|
||||||
|
|
||||||
#include "../internal.h" /* for sb_init_dio_done_wq */
|
#include "../internal.h" /* for sb_init_dio_done_wq */
|
||||||
|
|
17
include/linux/backing-file.h
Normal file
17
include/linux/backing-file.h
Normal file
|
@ -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 */
|
|
@ -2575,9 +2575,6 @@ struct file *dentry_open(const struct path *path, int flags,
|
||||||
const struct cred *creds);
|
const struct cred *creds);
|
||||||
struct file *dentry_create(const struct path *path, int flags, umode_t mode,
|
struct file *dentry_create(const struct path *path, int flags, umode_t mode,
|
||||||
const struct cred *cred);
|
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);
|
struct path *backing_file_user_path(struct file *f);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue