mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 22:21:21 +00:00
splice: add helpers for locking pipe inode
There are lots of sequences like this, especially in splice code: if (pipe->inode) mutex_lock(&pipe->inode->i_mutex); /* do something */ if (pipe->inode) mutex_unlock(&pipe->inode->i_mutex); so introduce helpers which do the conditional locking and unlocking. Also replace the inode_double_lock() call with a pipe_double_lock() helper to avoid spreading the use of this functionality beyond the pipe code. This patch is just a cleanup, and should cause no behavioral changes. Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
f8cc774ce4
commit
61e0d47c33
5 changed files with 64 additions and 72 deletions
42
fs/pipe.c
42
fs/pipe.c
|
@ -37,6 +37,42 @@
|
|||
* -- Manfred Spraul <manfred@colorfullife.com> 2002-05-09
|
||||
*/
|
||||
|
||||
static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass)
|
||||
{
|
||||
if (pipe->inode)
|
||||
mutex_lock_nested(&pipe->inode->i_mutex, subclass);
|
||||
}
|
||||
|
||||
void pipe_lock(struct pipe_inode_info *pipe)
|
||||
{
|
||||
/*
|
||||
* pipe_lock() nests non-pipe inode locks (for writing to a file)
|
||||
*/
|
||||
pipe_lock_nested(pipe, I_MUTEX_PARENT);
|
||||
}
|
||||
EXPORT_SYMBOL(pipe_lock);
|
||||
|
||||
void pipe_unlock(struct pipe_inode_info *pipe)
|
||||
{
|
||||
if (pipe->inode)
|
||||
mutex_unlock(&pipe->inode->i_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(pipe_unlock);
|
||||
|
||||
void pipe_double_lock(struct pipe_inode_info *pipe1,
|
||||
struct pipe_inode_info *pipe2)
|
||||
{
|
||||
BUG_ON(pipe1 == pipe2);
|
||||
|
||||
if (pipe1 < pipe2) {
|
||||
pipe_lock_nested(pipe1, I_MUTEX_PARENT);
|
||||
pipe_lock_nested(pipe2, I_MUTEX_CHILD);
|
||||
} else {
|
||||
pipe_lock_nested(pipe2, I_MUTEX_CHILD);
|
||||
pipe_lock_nested(pipe1, I_MUTEX_PARENT);
|
||||
}
|
||||
}
|
||||
|
||||
/* Drop the inode semaphore and wait for a pipe event, atomically */
|
||||
void pipe_wait(struct pipe_inode_info *pipe)
|
||||
{
|
||||
|
@ -47,12 +83,10 @@ void pipe_wait(struct pipe_inode_info *pipe)
|
|||
* is considered a noninteractive wait:
|
||||
*/
|
||||
prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE);
|
||||
if (pipe->inode)
|
||||
mutex_unlock(&pipe->inode->i_mutex);
|
||||
pipe_unlock(pipe);
|
||||
schedule();
|
||||
finish_wait(&pipe->wait, &wait);
|
||||
if (pipe->inode)
|
||||
mutex_lock(&pipe->inode->i_mutex);
|
||||
pipe_lock(pipe);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue