mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 23:23:03 +00:00
f91a704f71
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>
49 lines
1.3 KiB
C
49 lines
1.3 KiB
C
// 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);
|