mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
fs: use a helper for opening kernel internal files
cachefiles uses kernel_open_tmpfile() to open kernel internal tmpfile without accounting for nr_files. cachefiles uses open_with_fake_path() for the same reason without the need for a fake path. Fork open_with_fake_path() to kernel_file_open() which only does the noaccount part and use it in cachefiles. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Message-Id: <20230615112229.2143178-3-amir73il@gmail.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
d56e0ddb8f
commit
cbb0b9d4bb
3 changed files with 37 additions and 2 deletions
|
@ -560,8 +560,8 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
|
||||||
*/
|
*/
|
||||||
path.mnt = cache->mnt;
|
path.mnt = cache->mnt;
|
||||||
path.dentry = dentry;
|
path.dentry = dentry;
|
||||||
file = open_with_fake_path(&path, O_RDWR | O_LARGEFILE | O_DIRECT,
|
file = kernel_file_open(&path, O_RDWR | O_LARGEFILE | O_DIRECT,
|
||||||
d_backing_inode(dentry), cache->cache_cred);
|
d_backing_inode(dentry), cache->cache_cred);
|
||||||
if (IS_ERR(file)) {
|
if (IS_ERR(file)) {
|
||||||
trace_cachefiles_vfs_error(object, d_backing_inode(dentry),
|
trace_cachefiles_vfs_error(object, d_backing_inode(dentry),
|
||||||
PTR_ERR(file),
|
PTR_ERR(file),
|
||||||
|
|
33
fs/open.c
33
fs/open.c
|
@ -1116,6 +1116,39 @@ struct file *dentry_create(const struct path *path, int flags, umode_t mode,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dentry_create);
|
EXPORT_SYMBOL(dentry_create);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_file_open - open a file for kernel internal use
|
||||||
|
* @path: path of the file to open
|
||||||
|
* @flags: open flags
|
||||||
|
* @inode: the inode
|
||||||
|
* @cred: credentials for open
|
||||||
|
*
|
||||||
|
* Open a file for use by in-kernel consumers. The file is not accounted
|
||||||
|
* against nr_files and must not be installed into the file descriptor
|
||||||
|
* table.
|
||||||
|
*
|
||||||
|
* Return: Opened file on success, an error pointer on failure.
|
||||||
|
*/
|
||||||
|
struct file *kernel_file_open(const struct path *path, int flags,
|
||||||
|
struct inode *inode, const struct cred *cred)
|
||||||
|
{
|
||||||
|
struct file *f;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
f = alloc_empty_file_noaccount(flags, cred);
|
||||||
|
if (IS_ERR(f))
|
||||||
|
return f;
|
||||||
|
|
||||||
|
f->f_path = *path;
|
||||||
|
error = do_dentry_open(f, inode, NULL);
|
||||||
|
if (error) {
|
||||||
|
fput(f);
|
||||||
|
f = ERR_PTR(error);
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(kernel_file_open);
|
||||||
|
|
||||||
struct file *open_with_fake_path(const struct path *path, int flags,
|
struct file *open_with_fake_path(const struct path *path, int flags,
|
||||||
struct inode *inode, const struct cred *cred)
|
struct inode *inode, const struct cred *cred)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1676,6 +1676,8 @@ struct file *kernel_tmpfile_open(struct mnt_idmap *idmap,
|
||||||
const struct path *parentpath,
|
const struct path *parentpath,
|
||||||
umode_t mode, int open_flag,
|
umode_t mode, int open_flag,
|
||||||
const struct cred *cred);
|
const struct cred *cred);
|
||||||
|
struct file *kernel_file_open(const struct path *path, int flags,
|
||||||
|
struct inode *inode, const struct cred *cred);
|
||||||
|
|
||||||
int vfs_mkobj(struct dentry *, umode_t,
|
int vfs_mkobj(struct dentry *, umode_t,
|
||||||
int (*f)(struct dentry *, umode_t, void *),
|
int (*f)(struct dentry *, umode_t, void *),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue