]> git.karo-electronics.de Git - karo-tx-linux.git/commit
reiserfs: fix deadlock with nfs racing on create/lookup
authorJeff Mahoney <jeffm@suse.com>
Fri, 31 May 2013 19:51:17 +0000 (15:51 -0400)
committerJan Kara <jack@suse.cz>
Fri, 31 May 2013 21:01:27 +0000 (23:01 +0200)
commitd3a3e0d91f581b62717b20e29dc5c815df4f75ba
tree7f6bf876f4e914ff4e589e4429a907f4616a178d
parentb380d8990a9628781d6db52a11a063f364568c15
reiserfs: fix deadlock with nfs racing on create/lookup

Reiserfs is currently able to be deadlocked by having two NFS clients
where one has removed and recreated a file and another is accessing the
file with an open file handle.

If one client deletes and recreates a file with timing such that the
recreated file obtains the same [dirid, objectid] pair as the original
file while another client accesses the file via file handle, the create
and lookup can race and deadlock if the lookup manages to create the
in-memory inode first.

The create thread, in insert_inode_locked4, will hold the write lock
while waiting on the other inode to be unlocked. The lookup thread,
anywhere in the iget path, will release and reacquire the write lock while
it schedules. If it needs to reacquire the lock while the create thread
has it, it will never be able to make forward progress because it needs
to reacquire the lock before ultimately unlocking the inode.

This patch drops the write lock across the insert_inode_locked4 call so
that the ordering of inode_wait -> write lock is retained. Since this
would have been the case before the BKL push-down, this is safe.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/reiserfs/inode.c