• Jiaying Zhang's avatar
    quota: Fix possible deadlock during parallel quotaon and quotaoff · d01730d7
    Jiaying Zhang authored
    The following test script triggers a deadlock on ext2 filesystem:
    while true; do quotaon /dev/hda >&/dev/null; usleep $RANDOM; done &
    while true; do quotaoff /dev/hda >&/dev/null; usleep $RANDOM; done &
    
    I found there is a potential deadlock between quotaon and quotaoff (or
    quotasync). Basically, all of quotactl operations need to be protected by
    dqonoff_mutex. vfs_quota_off and vfs_quota_sync also call sb->s_op->quota_write
    that needs to grab the i_mutex of the quota file.  But in vfs_quota_on_inode
    (called from quotaon operation), the current code tries to grab  the i_mutex of
    the quota file first before getting quonoff_mutex.
    
    Reverse the order in which we take locks in vfs_quota_on_inode().
    
    Jan Kara: Changed changelog to be more readable, made lockdep happy with
      I_MUTEX_QUOTA.
    Signed-off-by: default avatarJiaying Zhang <jiayingz@google.com>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    d01730d7
dquot.c 70.9 KB