lkml.org 
[lkml]   [2014]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 3/7] proc: introduce proc_mem_open()
    Extract the mm_access() code from __mem_open() into the new helper,
    proc_mem_open(), the next patch will add another caller.

    Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    ---
    fs/proc/base.c | 36 +++++++++++++++++++++---------------
    fs/proc/internal.h | 2 ++
    2 files changed, 23 insertions(+), 15 deletions(-)

    diff --git a/fs/proc/base.c b/fs/proc/base.c
    index 2d696b0..9aef9ac 100644
    --- a/fs/proc/base.c
    +++ b/fs/proc/base.c
    @@ -667,29 +667,35 @@ static const struct file_operations proc_single_file_operations = {
    .release = single_release,
    };

    -static int __mem_open(struct inode *inode, struct file *file, unsigned int mode)
    +
    +struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode)
    {
    - struct task_struct *task = get_proc_task(file_inode(file));
    - struct mm_struct *mm;
    + struct task_struct *task = get_proc_task(inode);
    + struct mm_struct *mm = ERR_PTR(-ESRCH);

    - if (!task)
    - return -ESRCH;
    + if (task) {
    + mm = mm_access(task, mode);
    + put_task_struct(task);

    - mm = mm_access(task, mode);
    - put_task_struct(task);
    + if (!IS_ERR_OR_NULL(mm)) {
    + /* ensure this mm_struct can't be freed */
    + atomic_inc(&mm->mm_count);
    + /* but do not pin its memory */
    + mmput(mm);
    + }
    + }
    +
    + return mm;
    +}
    +
    +static int __mem_open(struct inode *inode, struct file *file, unsigned int mode)
    +{
    + struct mm_struct *mm = proc_mem_open(inode, mode);

    if (IS_ERR(mm))
    return PTR_ERR(mm);

    - if (mm) {
    - /* ensure this mm_struct can't be freed */
    - atomic_inc(&mm->mm_count);
    - /* but do not pin its memory */
    - mmput(mm);
    - }
    -
    file->private_data = mm;
    -
    return 0;
    }

    diff --git a/fs/proc/internal.h b/fs/proc/internal.h
    index 3ab6d14..ba0c1c1 100644
    --- a/fs/proc/internal.h
    +++ b/fs/proc/internal.h
    @@ -275,6 +275,8 @@ struct proc_maps_private {
    #endif
    };

    +struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode);
    +
    extern const struct file_operations proc_pid_maps_operations;
    extern const struct file_operations proc_tid_maps_operations;
    extern const struct file_operations proc_pid_numa_maps_operations;
    --
    1.5.5.1


    \
     
     \ /
      Last update: 2014-08-05 22:21    [W:2.709 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site