• Mateusz Guzik's avatar
    vfs: partially sanitize i_state zeroing on inode creation · 5a9b911b
    Mateusz Guzik authored
    new_inode used to have the following:
    	spin_lock(&inode_lock);
    	inodes_stat.nr_inodes++;
    	list_add(&inode->i_list, &inode_in_use);
    	list_add(&inode->i_sb_list, &sb->s_inodes);
    	inode->i_ino = ++last_ino;
    	inode->i_state = 0;
    	spin_unlock(&inode_lock);
    
    over time things disappeared, got moved around or got replaced (global
    inode lock with a per-inode lock), eventually this got reduced to:
    	spin_lock(&inode->i_lock);
    	inode->i_state = 0;
    	spin_unlock(&inode->i_lock);
    
    But the lock acquire here does not synchronize against anyone.
    
    Additionally iget5_locked performs i_state = 0 assignment without any
    locks to begin with, the two combined look confusing at best.
    
    It looks like the current state is a leftover which was not cleaned up.
    
    Ideally it would be an invariant that i_state == 0 to begin with, but
    achieving that would require dealing with all filesystem alloc handlers
    one by one.
    
    In the meantime drop the misleading locking and move i_state zeroing to
    inode_init_always so that others don't need to deal with it by hand.
    Signed-off-by: default avatarMateusz Guzik <mjguzik@gmail.com>
    Link: https://lore.kernel.org/r/20240611120626.513952-3-mjguzik@gmail.comReviewed-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    5a9b911b
inode.c 70.7 KB