lkml.org 
[lkml]   [2015]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 1/1] mm: move ->mremap() from file_operations to vm_operations_struct
    vma->vm_ops->mremap() looks more natural and clean in move_vma(),
    and this way ->mremap() can have more users. Say, vdso.

    Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    ---
    fs/aio.c | 25 ++++++++++++++++---------
    include/linux/fs.h | 1 -
    include/linux/mm.h | 1 +
    mm/mremap.c | 4 ++--
    4 files changed, 19 insertions(+), 12 deletions(-)

    diff --git a/fs/aio.c b/fs/aio.c
    index 9bc1335..6fe662a 100644
    --- a/fs/aio.c
    +++ b/fs/aio.c
    @@ -308,15 +308,9 @@ static void aio_free_ring(struct kioctx *ctx)
    }
    }

    -static int aio_ring_mmap(struct file *file, struct vm_area_struct *vma)
    -{
    - vma->vm_flags |= VM_DONTEXPAND;
    - vma->vm_ops = &generic_file_vm_ops;
    - return 0;
    -}
    -
    -static int aio_ring_remap(struct file *file, struct vm_area_struct *vma)
    +static int aio_ring_remap(struct vm_area_struct *vma)
    {
    + struct file *file = vma->vm_file;
    struct mm_struct *mm = vma->vm_mm;
    struct kioctx_table *table;
    int i, res = -EINVAL;
    @@ -339,9 +333,22 @@ static int aio_ring_remap(struct file *file, struct vm_area_struct *vma)
    return res;
    }

    +static const struct vm_operations_struct aio_ring_vm_ops = {
    + .mremap = aio_ring_remap,
    + .fault = filemap_fault,
    + .map_pages = filemap_map_pages,
    + .page_mkwrite = filemap_page_mkwrite,
    +};
    +
    +static int aio_ring_mmap(struct file *file, struct vm_area_struct *vma)
    +{
    + vma->vm_flags |= VM_DONTEXPAND;
    + vma->vm_ops = &aio_ring_vm_ops;
    + return 0;
    +}
    +
    static const struct file_operations aio_ring_fops = {
    .mmap = aio_ring_mmap,
    - .mremap = aio_ring_remap,
    };

    #if IS_ENABLED(CONFIG_MIGRATION)
    diff --git a/include/linux/fs.h b/include/linux/fs.h
    index 35ec87e..42aac09 100644
    --- a/include/linux/fs.h
    +++ b/include/linux/fs.h
    @@ -1582,7 +1582,6 @@ struct file_operations {
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
    long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
    int (*mmap) (struct file *, struct vm_area_struct *);
    - int (*mremap)(struct file *, struct vm_area_struct *);
    int (*open) (struct inode *, struct file *);
    int (*flush) (struct file *, fl_owner_t id);
    int (*release) (struct inode *, struct file *);
    diff --git a/include/linux/mm.h b/include/linux/mm.h
    index a0fe3d3..0295b4a 100644
    --- a/include/linux/mm.h
    +++ b/include/linux/mm.h
    @@ -244,6 +244,7 @@ struct vm_fault {
    struct vm_operations_struct {
    void (*open)(struct vm_area_struct * area);
    void (*close)(struct vm_area_struct * area);
    + int (*mremap)(struct vm_area_struct * area);
    int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf);
    void (*map_pages)(struct vm_area_struct *vma, struct vm_fault *vmf);

    diff --git a/mm/mremap.c b/mm/mremap.c
    index ed1b13a..aeba807 100644
    --- a/mm/mremap.c
    +++ b/mm/mremap.c
    @@ -276,8 +276,8 @@ static unsigned long move_vma(struct vm_area_struct *vma,
    need_rmap_locks);
    if (moved_len < old_len) {
    err = -ENOMEM;
    - } else if (vma->vm_file && vma->vm_file->f_op->mremap) {
    - err = vma->vm_file->f_op->mremap(vma->vm_file, new_vma);
    + } else if (vma->vm_ops && vma->vm_ops->mremap) {
    + err = vma->vm_ops->mremap(new_vma);
    }

    if (unlikely(err)) {
    --
    1.5.5.1



    \
     
     \ /
      Last update: 2015-06-23 20:21    [W:2.876 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site