• Jan Kara's avatar
    quota: improve inode list scanning in add_dquot_ref() · 941d2380
    Jan Kara authored
    We restarted scan of sb->s_inodes list whenever we had to drop inode_lock
    in add_dquot_ref().  This leads to overall quadratic running time and thus
    add_dquot_ref() can take several minutes when called on a life filesystem.
    We fix the problem by using the fact that inode cannot be removed from
    s_inodes list while we hold a reference to it and thus we can safely
    restart the scan if we don't drop the reference.  Here we use the fact that
    inodes freshly added to s_inodes list are already guaranteed to have quotas
    properly initialized and the ordering of inodes on s_inodes list does not
    change so we cannot skip any inode.
    
    Thanks goes to Nick <gentuu@gmail.com> for analyzing the problem and
    testing the fix.
    
    [akpm@linux-foundation.org: iput(NULL) is legal]
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Cc: Nick <gentuu@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    941d2380
dquot.c 55.9 KB