1
0
Fork 0
remarkable-linux/fs/fuse
Miklos Szeredi 73ce8355c2 [fuse] fix deadlock between fuse_put_super() and request_end()
A deadlock was possible, when the last reference to the superblock was
held due to a background request containing a file reference.

Releasing the file would release the vfsmount which in turn would
release the superblock.  Since sbput_sem is held during the fput() and
fuse_put_super() tries to acquire this same semaphore, a deadlock
results.

The chosen soltuion is to get rid of sbput_sem, and instead use the
spinlock to ensure the referenced inodes/file are released only once.
Since the actual release may sleep, defer these outside the locked
region, but using local variables instead of the structure members.

This is a much more rubust solution.

Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
2006-04-11 21:14:26 +02:00
..
Makefile [PATCH] FUSE - file operations 2005-09-09 14:03:45 -07:00
dev.c [fuse] fix deadlock between fuse_put_super() and request_end() 2006-04-11 21:14:26 +02:00
dir.c [PATCH] fuse: clean up request accounting 2006-04-11 06:18:49 -07:00
file.c [PATCH] fuse: clean up request accounting 2006-04-11 06:18:49 -07:00
fuse_i.h [fuse] fix deadlock between fuse_put_super() and request_end() 2006-04-11 21:14:26 +02:00
inode.c [fuse] fix deadlock between fuse_put_super() and request_end() 2006-04-11 21:14:26 +02:00