quota: Fix deadlock during path resolution
authorJan Kara <jack@suse.cz>
Wed, 15 Sep 2010 15:38:58 +0000 (17:38 +0200)
committerJan Kara <jack@suse.cz>
Wed, 12 Jan 2011 18:14:55 +0000 (19:14 +0100)
commitf00c9e44ad1a9660fe8cd3ca15b6cd9497172eab
treecbb47ae0d8aba9d8b3c44714b000156715cdf969
parent4162cf64973df51fc885825bc9ca4d055891c49f
quota: Fix deadlock during path resolution

As Al Viro pointed out path resolution during Q_QUOTAON calls to quotactl
is prone to deadlocks. We hold s_umount semaphore for reading during the
path resolution and resolution itself may need to acquire the semaphore
for writing when e. g. autofs mountpoint is passed.

Solve the problem by performing the resolution before we get hold of the
superblock (and thus s_umount semaphore). The whole thing is complicated
by the fact that some filesystems (OCFS2) ignore the path argument. So to
distinguish between filesystem which want the path and which do not we
introduce new .quota_on_meta callback which does not get the path. OCFS2
then uses this callback instead of old .quota_on.

CC: Al Viro <viro@ZenIV.linux.org.uk>
CC: Christoph Hellwig <hch@lst.de>
CC: Ted Ts'o <tytso@mit.edu>
CC: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/ext3/super.c
fs/ext4/super.c
fs/ocfs2/super.c
fs/quota/dquot.c
fs/quota/quota.c
fs/reiserfs/super.c
include/linux/quota.h
include/linux/quotaops.h