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 47/51] splice: remove i_mutex locking in splice_from_pipe()
    2.6.29-stable review patch.  If anyone has any objections, please let us know.

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

    From: Miklos Szeredi <miklos@szeredi.hu>

    commit 2933970b960223076d6affcf7a77e2bc546b8102 upstream.

    splice_from_pipe() is only called from two places:

    - generic_splice_sendpage()
    - splice_write_null()

    Neither of these require i_mutex to be taken on the destination inode.

    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 | 18 ++----------------
    1 file changed, 2 insertions(+), 16 deletions(-)

    --- a/fs/splice.c
    +++ b/fs/splice.c
    @@ -783,7 +783,7 @@ EXPORT_SYMBOL(__splice_from_pipe);
    * @actor: handler that splices the data
    *
    * Description:
    - * See __splice_from_pipe. This function locks the input and output inodes,
    + * See __splice_from_pipe. This function locks the pipe inode,
    * otherwise it's identical to __splice_from_pipe().
    *
    */
    @@ -792,7 +792,6 @@ ssize_t splice_from_pipe(struct pipe_ino
    splice_actor *actor)
    {
    ssize_t ret;
    - struct inode *inode = out->f_mapping->host;
    struct splice_desc sd = {
    .total_len = len,
    .flags = flags,
    @@ -800,24 +799,11 @@ ssize_t splice_from_pipe(struct pipe_ino
    .u.file = out,
    };

    - /*
    - * The actor worker might be calling ->write_begin and
    - * ->write_end. Most of the time, these expect i_mutex to
    - * be held. Since this may result in an ABBA deadlock with
    - * pipe->inode, we have to order lock acquiry here.
    - *
    - * Outer lock must be inode->i_mutex, as pipe_wait() will
    - * release and reacquire pipe->inode->i_mutex, AND inode must
    - * never be a pipe.
    - */
    - WARN_ON(S_ISFIFO(inode->i_mode));
    - mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
    if (pipe->inode)
    - mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
    + mutex_lock(&pipe->inode->i_mutex);
    ret = __splice_from_pipe(pipe, &sd, actor);
    if (pipe->inode)
    mutex_unlock(&pipe->inode->i_mutex);
    - mutex_unlock(&inode->i_mutex);

    return ret;
    }



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