• Al Viro's avatar
    pipe: take allocation and freeing of pipe_inode_info out of ->i_mutex · ba5bb147
    Al Viro authored
    * 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: default avatarAl Viro <viro@zeniv.linux.org.uk>
    ba5bb147
pipe.c 29 KB