lkml.org 
[lkml]   [2009]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 48/51] splice: fix i_mutex locking in generic_splice_write()
    2.6.29-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Miklos Szeredi <miklos@szeredi.hu>

    commit eb443e5a25d43996deb62b9bcee1a4ce5dea2ead upstream.

    Rearrange locking of i_mutex on destination so it's only held while
    buffers are copied with the pipe_to_file() actor, and not while
    waiting for more data on the pipe.

    Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
    Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    fs/splice.c | 34 +++++++++++++++++++++++-----------
    1 file changed, 23 insertions(+), 11 deletions(-)

    --- a/fs/splice.c
    +++ b/fs/splice.c
    @@ -894,17 +894,29 @@ generic_file_splice_write(struct pipe_in
    };
    ssize_t ret;

    - WARN_ON(S_ISFIFO(inode->i_mode));
    - mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
    - ret = file_remove_suid(out);
    - if (likely(!ret)) {
    - if (pipe->inode)
    - mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
    - ret = __splice_from_pipe(pipe, &sd, pipe_to_file);
    - if (pipe->inode)
    - mutex_unlock(&pipe->inode->i_mutex);
    - }
    - mutex_unlock(&inode->i_mutex);
    + if (pipe->inode)
    + mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_PARENT);
    +
    + splice_from_pipe_begin(&sd);
    + do {
    + ret = splice_from_pipe_next(pipe, &sd);
    + if (ret <= 0)
    + break;
    +
    + mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD);
    + ret = file_remove_suid(out);
    + if (!ret)
    + ret = splice_from_pipe_feed(pipe, &sd, pipe_to_file);
    + mutex_unlock(&inode->i_mutex);
    + } while (ret > 0);
    + splice_from_pipe_end(pipe, &sd);
    +
    + if (pipe->inode)
    + mutex_unlock(&pipe->inode->i_mutex);
    +
    + if (sd.num_spliced)
    + ret = sd.num_spliced;
    +
    if (ret > 0) {
    unsigned long nr_pages;




    \
     
     \ /
      Last update: 2009-05-15 01:01    [W:4.352 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site