From e648ab04645893db2224972b7dc181426086fb04 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Tue, 14 Apr 2009 19:48:37 +0200 Subject: [PATCH] --- yaml --- r: 143333 b: refs/heads/master c: 2933970b960223076d6affcf7a77e2bc546b8102 h: refs/heads/master i: 143331: 5a77f5860e563df1da55bc383d1a1389732233d1 v: v3 --- [refs] | 2 +- trunk/fs/splice.c | 18 ++---------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index 29a145d2fe61..8c3dc139f8d7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b3c2d2ddd63944ef2a1e4a43077b602288107e01 +refs/heads/master: 2933970b960223076d6affcf7a77e2bc546b8102 diff --git a/trunk/fs/splice.c b/trunk/fs/splice.c index fd6b278d447b..349576b2c75a 100644 --- a/trunk/fs/splice.c +++ b/trunk/fs/splice.c @@ -784,7 +784,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(). * */ @@ -793,7 +793,6 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, splice_actor *actor) { ssize_t ret; - struct inode *inode = out->f_mapping->host; struct splice_desc sd = { .total_len = len, .flags = flags, @@ -801,24 +800,11 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, .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; }