• Amir Goldstein's avatar
    ovl: take lower dir inode mutex outside upper sb_writers lock · 6d0a8a90
    Amir Goldstein authored
    The functions ovl_lower_positive() and ovl_check_empty_dir() both take
    inode mutex on the real lower dir under ovl_want_write() which takes
    the upper_mnt sb_writers lock.
    
    While this is not a clear locking order or layering violation, it creates
    an undesired lock dependency between two unrelated layers for no good
    reason.
    
    This lock dependency materializes to a false(?) positive lockdep warning
    when calling rmdir() on a nested overlayfs, where both nested and
    underlying overlayfs both use the same fs type as upper layer.
    
    rmdir() on the nested overlayfs creates the lock chain:
      sb_writers of upper_mnt (e.g. tmpfs) in ovl_do_remove()
      ovl_i_mutex_dir_key[] of lower overlay dir in ovl_lower_positive()
    
    rmdir() on the underlying overlayfs creates the lock chain in
    reverse order:
      ovl_i_mutex_dir_key[] of lower overlay dir in vfs_rmdir()
      sb_writers of nested upper_mnt (e.g. tmpfs) in ovl_do_remove()
    
    To rid of the unneeded locking dependency, move both ovl_lower_positive()
    and ovl_check_empty_dir() to before ovl_want_write() in rmdir() and
    rename() implementation.
    
    This change spreads the pieces of ovl_check_empty_and_clear() directly
    inside the rmdir()/rename() implementations so the helper is no longer
    needed and removed.
    Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    6d0a8a90
readdir.c 23.6 KB