mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 05:31:15 +00:00
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>
This commit is contained in:
parent
18c03cfd40
commit
ba5bb14733
2 changed files with 53 additions and 21 deletions
|
@ -34,6 +34,7 @@ struct pipe_buffer {
|
|||
* @tmp_page: cached released page
|
||||
* @readers: number of current readers of this pipe
|
||||
* @writers: number of current writers of this pipe
|
||||
* @files: number of struct file refering this pipe (protected by ->i_lock)
|
||||
* @waiting_writers: number of writers blocked waiting for room
|
||||
* @r_counter: reader counter
|
||||
* @w_counter: writer counter
|
||||
|
@ -47,6 +48,7 @@ struct pipe_inode_info {
|
|||
unsigned int nrbufs, curbuf, buffers;
|
||||
unsigned int readers;
|
||||
unsigned int writers;
|
||||
unsigned int files;
|
||||
unsigned int waiting_writers;
|
||||
unsigned int r_counter;
|
||||
unsigned int w_counter;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue