mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 13:22:23 +00:00
fs: factor out backing_file_mmap() helper
Assert that the file object is allocated in a backing_file container so that file_user_path() could be used to display the user path and not the backing file's path in /proc/<pid>/maps. Signed-off-by: Amir Goldstein <amir73il@gmail.com>
This commit is contained in:
parent
9b7e9e2f5d
commit
f567377e40
@ -11,6 +11,7 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/backing-file.h>
|
||||
#include <linux/splice.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
@ -296,6 +297,32 @@ ssize_t backing_file_splice_write(struct pipe_inode_info *pipe,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(backing_file_splice_write);
|
||||
|
||||
int backing_file_mmap(struct file *file, struct vm_area_struct *vma,
|
||||
struct backing_file_ctx *ctx)
|
||||
{
|
||||
const struct cred *old_cred;
|
||||
int ret;
|
||||
|
||||
if (WARN_ON_ONCE(!(file->f_mode & FMODE_BACKING)) ||
|
||||
WARN_ON_ONCE(ctx->user_file != vma->vm_file))
|
||||
return -EIO;
|
||||
|
||||
if (!file->f_op->mmap)
|
||||
return -ENODEV;
|
||||
|
||||
vma_set_file(vma, file);
|
||||
|
||||
old_cred = override_creds(ctx->cred);
|
||||
ret = call_mmap(vma->vm_file, vma);
|
||||
revert_creds(old_cred);
|
||||
|
||||
if (ctx->accessed)
|
||||
ctx->accessed(ctx->user_file);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(backing_file_mmap);
|
||||
|
||||
static int __init backing_aio_init(void)
|
||||
{
|
||||
backing_aio_cachep = kmem_cache_create("backing_aio",
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include <linux/uio.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/backing-file.h>
|
||||
#include "overlayfs.h"
|
||||
@ -415,23 +414,13 @@ static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
static int ovl_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
struct file *realfile = file->private_data;
|
||||
const struct cred *old_cred;
|
||||
int ret;
|
||||
struct backing_file_ctx ctx = {
|
||||
.cred = ovl_creds(file_inode(file)->i_sb),
|
||||
.user_file = file,
|
||||
.accessed = ovl_file_accessed,
|
||||
};
|
||||
|
||||
if (!realfile->f_op->mmap)
|
||||
return -ENODEV;
|
||||
|
||||
if (WARN_ON(file != vma->vm_file))
|
||||
return -EIO;
|
||||
|
||||
vma_set_file(vma, realfile);
|
||||
|
||||
old_cred = ovl_override_creds(file_inode(file)->i_sb);
|
||||
ret = call_mmap(vma->vm_file, vma);
|
||||
revert_creds(old_cred);
|
||||
ovl_file_accessed(file);
|
||||
|
||||
return ret;
|
||||
return backing_file_mmap(realfile, vma, &ctx);
|
||||
}
|
||||
|
||||
static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
|
||||
|
@ -36,5 +36,7 @@ ssize_t backing_file_splice_write(struct pipe_inode_info *pipe,
|
||||
struct file *out, loff_t *ppos, size_t len,
|
||||
unsigned int flags,
|
||||
struct backing_file_ctx *ctx);
|
||||
int backing_file_mmap(struct file *file, struct vm_area_struct *vma,
|
||||
struct backing_file_ctx *ctx);
|
||||
|
||||
#endif /* _LINUX_BACKING_FILE_H */
|
||||
|
Loading…
Reference in New Issue
Block a user