summaryrefslogtreecommitdiff
path: root/fs/btrfs/locking.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-03-21 10:21:19 +0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-04-09 22:12:59 +0400
commitba5bb147330a8737b6b5a812cc774c79c070704b (patch)
tree3043bd880634f47275a2083c53ed98ce2c1c70bc /fs/btrfs/locking.c
parent18c03cfd403b88852f75f200206983ee6df28423 (diff)
downloadlinux-ba5bb147330a8737b6b5a812cc774c79c070704b.tar.xz
pipe: take allocation and freeing of pipe_inode_info out of ->i_mutex
* new field - pipe->files; number of struct file over that pipe (all sharing the same inode, of course); protected by inode->i_lock. * pipe_release() decrements pipe->files, clears inode->i_pipe when if the counter has reached 0 (all under ->i_lock) and, in that case, frees pipe after having done pipe_unlock() * fifo_open() starts with grabbing ->i_lock, and either bumps pipe->files if ->i_pipe was non-NULL or allocates a new pipe (dropping and regaining ->i_lock) and rechecks ->i_pipe; if it's still NULL, inserts new pipe there, otherwise bumps ->i_pipe->files and frees the one we'd allocated. At that point we know that ->i_pipe is non-NULL and won't go away, so we can do pipe_lock() on it and proceed as we used to. If we end up failing, decrement pipe->files and if it reaches 0 clear ->i_pipe and free the sucker after pipe_unlock(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/btrfs/locking.c')
0 files changed, 0 insertions, 0 deletions