mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 05:41:55 +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/fs.h>
|
||||||
#include <linux/backing-file.h>
|
#include <linux/backing-file.h>
|
||||||
#include <linux/splice.h>
|
#include <linux/splice.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
|
||||||
#include "internal.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);
|
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)
|
static int __init backing_aio_init(void)
|
||||||
{
|
{
|
||||||
backing_aio_cachep = kmem_cache_create("backing_aio",
|
backing_aio_cachep = kmem_cache_create("backing_aio",
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include <linux/uio.h>
|
#include <linux/uio.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/backing-file.h>
|
#include <linux/backing-file.h>
|
||||||
#include "overlayfs.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)
|
static int ovl_mmap(struct file *file, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
struct file *realfile = file->private_data;
|
struct file *realfile = file->private_data;
|
||||||
const struct cred *old_cred;
|
struct backing_file_ctx ctx = {
|
||||||
int ret;
|
.cred = ovl_creds(file_inode(file)->i_sb),
|
||||||
|
.user_file = file,
|
||||||
|
.accessed = ovl_file_accessed,
|
||||||
|
};
|
||||||
|
|
||||||
if (!realfile->f_op->mmap)
|
return backing_file_mmap(realfile, vma, &ctx);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
|
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,
|
struct file *out, loff_t *ppos, size_t len,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
struct backing_file_ctx *ctx);
|
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 */
|
#endif /* _LINUX_BACKING_FILE_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user