pipe: don't use ->i_mutex
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 21 Mar 2013 06:32:24 +0000 (02:32 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 9 Apr 2013 18:13:00 +0000 (14:13 -0400)
now it can be done - put mutex into pipe_inode_info, use it instead
of ->i_mutex

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/ocfs2/file.c
fs/pipe.c
include/linux/pipe_fs_i.h

index 1c93e771e950ceb085b9aad7703e82e9a2df1c13..8a7509f9e6f5e0f49438876228a8e887ac2cdeb1 100644 (file)
@@ -2465,8 +2465,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
                        out->f_path.dentry->d_name.len,
                        out->f_path.dentry->d_name.name, len);
 
-       if (pipe->inode)
-               mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_PARENT);
+       pipe_lock(pipe);
 
        splice_from_pipe_begin(&sd);
        do {
@@ -2486,8 +2485,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
        } while (ret > 0);
        splice_from_pipe_end(pipe, &sd);
 
-       if (pipe->inode)
-               mutex_unlock(&pipe->inode->i_mutex);
+       pipe_unlock(pipe);
 
        if (sd.num_spliced)
                ret = sd.num_spliced;
index abaa9234d27b194a88232d87018ae2c9199a50f8..d4b97e4e37c56d0e6d74ea897870a69b6d7f7549 100644 (file)
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -56,7 +56,7 @@ unsigned int pipe_min_size = PAGE_SIZE;
 static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass)
 {
        if (pipe->inode)
-               mutex_lock_nested(&pipe->inode->i_mutex, subclass);
+               mutex_lock_nested(&pipe->mutex, subclass);
 }
 
 void pipe_lock(struct pipe_inode_info *pipe)
@@ -71,7 +71,7 @@ EXPORT_SYMBOL(pipe_lock);
 void pipe_unlock(struct pipe_inode_info *pipe)
 {
        if (pipe->inode)
-               mutex_unlock(&pipe->inode->i_mutex);
+               mutex_unlock(&pipe->mutex);
 }
 EXPORT_SYMBOL(pipe_unlock);
 
@@ -777,6 +777,7 @@ struct pipe_inode_info * alloc_pipe_info(struct inode *inode)
                        pipe->r_counter = pipe->w_counter = 1;
                        pipe->inode = inode;
                        pipe->buffers = PIPE_DEF_BUFFERS;
+                       mutex_init(&pipe->mutex);
                        return pipe;
                }
                kfree(pipe);
index 59778e1c9c08d4d42e09bb4dc3ef0b147ba66779..d803a85a64b6b9bb1abc002301ef027f2a7cb5de 100644 (file)
@@ -27,6 +27,7 @@ struct pipe_buffer {
 
 /**
  *     struct pipe_inode_info - a linux kernel pipe
+ *     @mutex: mutex protecting the whole thing
  *     @wait: reader/writer wait point in case of empty/full pipe
  *     @nrbufs: the number of non-empty pipe buffers in this pipe
  *     @buffers: total number of buffers (should be a power of 2)
@@ -44,6 +45,7 @@ struct pipe_buffer {
  *     @bufs: the circular array of pipe buffers
  **/
 struct pipe_inode_info {
+       struct mutex mutex;
        wait_queue_head_t wait;
        unsigned int nrbufs, curbuf, buffers;
        unsigned int readers;