Skip to content
  • Tejun Heo's avatar
    sysfs: bail early from kernfs_file_mmap() to avoid spurious lockdep warning · 9b2db6e1
    Tejun Heo authored
    This is v3.14 fix for the same issue that a8b14744 ("sysfs: give
    different locking key to regular and bin files") addresses for v3.13.
    Due to the extensive kernfs reorganization in v3.14 branch, the same
    fix couldn't be ported as-is.  The v3.13 fix was ignored while merging
    it into v3.14 branch.
    
    027a485d ("sysfs: use a separate locking class for open files
    depending on mmap") assigned different lockdep key to
    sysfs_open_file->mutex depending on whether the file implements mmap
    or not in an attempt to avoid spurious lockdep warning caused by
    merging of regular and bin file paths.
    
    While this restored some of the original behavior of using different
    locks (at least lockdep is concerned) for the different clases of
    files.  The restoration wasn't full because now the lockdep key
    assignment depends on whether the file has mmap or not instead of
    whether it's a regular file or not.
    
    This means that bin files which don't implement mmap will get assigned
    the same lockdep class as regular files.  This is problematic because
    file_operations for bin files still implements the mmap file operation
    and checking whether the sysfs file actually implements mmap happens
    in the file operation after grabbing @sysfs_open_file->mutex.  We
    still end up adding locking dependency from mmap locking to
    sysfs_open_file->mutex to the regular file mutex which triggers
    spurious circular locking warning.
    
    For v3.13, a8b14744
    
     ("sysfs: give different locking key to regular
    and bin files") fixed it by giving sysfs_open_file->mutex different
    lockdep keys depending on whether the file is regular or bin instead
    of whether mmap exists or not; however, due to the way sysfs is now
    layered behind kernfs, this approach is no longer viable.  kernfs can
    tell whether a sysfs node has mmap implemented or not but can't tell
    whether a bin file from a regular one.
    
    This patch updates kernfs such that kernfs_file_mmap() checks
    SYSFS_FLAG_HAS_MMAP and bail before grabbing sysfs_open_file->mutex so
    that it doesn't add spurious locking dependency from mmap to
    sysfs_open_file->mutex and changes sysfs so that it specifies
    kernfs_ops->mmap iff the sysfs file implements mmap.  Combined, this
    ensures that sysfs_open_file->mutex is grabbed under mmap path iff the
    sysfs file actually implements mmap.  As sysfs_open_file->mutex is
    already given a different lockdep key if mmap is implemented, this
    removes the spurious locking dependency.
    
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarDave Jones <davej@redhat.com>
    Link: http://lkml.kernel.org/g/20131203184324.GA11320@redhat.com
    
    
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    9b2db6e1