• Amir Goldstein's avatar
    ovl: lockdep annotate of nested stacked overlayfs inode lock · b1eaa950
    Amir Goldstein authored
    An overlayfs instance can be the lower layer of another overlayfs
    instance. This setup triggers a lockdep splat of possible recursive
    locking of sb->s_type->i_mutex_key in iterate_dir(). Trimmed snip:
    
     [ INFO: possible recursive locking detected ]
     bash/2468 is trying to acquire lock:
      &sb->s_type->i_mutex_key#14, at: iterate_dir+0x7d/0x15c
     but task is already holding lock:
      &sb->s_type->i_mutex_key#14, at: iterate_dir+0x7d/0x15c
    
    One problem observed with this splat is that ovl_new_inode()
    does not call lockdep_annotate_inode_mutex_key() to annotate
    the dir inode lock as &sb->s_type->i_mutex_dir_key like other
    fs do.
    
    The other problem is that the 2 nested levels of overlayfs inode
    lock are annotated using the same key, which is the cause of the
    false positive lockdep warning.
    
    Fix this by annotating overlayfs inode lock in ovl_fill_inode()
    according to stack level of the super block instance and use
    different key for dir vs. non-dir like other fs do.
    
    Here is an edited snip from /proc/lockdep_chains after
    iterate_dir() of nested overlayfs:
    
     [...] &ovl_i_mutex_dir_key[depth]   (stack_depth=2)
     [...] &ovl_i_mutex_dir_key[depth]#2 (stack_depth=1)
     [...] &type->i_mutex_dir_key        (stack_depth=0)
    Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    b1eaa950
inode.c 9.54 KB