• Louis Rilling's avatar
    configfs: Fix deadlock with racing rmdir() and rename() · b3e76af8
    Louis Rilling authored
    This patch fixes the deadlock between racing sys_rename() and configfs_rmdir().
    
    The idea is to avoid locking i_mutexes of default groups in
    configfs_detach_prep(), and rely instead on the new configfs_dirent_lock to
    protect against configfs_dirent's linkage mutations. To ensure that an mkdir()
    racing with rmdir() will not create new items in a to-be-removed default group,
    we make configfs_new_dirent() check for the CONFIGFS_USET_DROPPING flag right
    before linking the new dirent, and return error if the flag is set. This makes
    racing mkdir()/symlink()/dir_open() fail in places where errors could already
    happen, resp. in (attach_item()|attach_group())/create_link()/new_dirent().
    
    configfs_depend() remains safe since it locks all the path from configfs root,
    and is thus mutually exclusive with rmdir().
    
    An advantage of this is that now detach_groups() unconditionnaly takes the
    default groups i_mutex, which makes it more consistent with populate_groups().
    Signed-off-by: default avatarLouis Rilling <Louis.Rilling@kerlabs.com>
    Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
    b3e76af8
dir.c 36.7 KB