• Miklos Szeredi's avatar
    fs: add file_dentry() · 1aaa0634
    Miklos Szeredi authored
    commit d101a125 upstream.
    
    This series fixes bugs in nfs and ext4 due to 4bacc9c9 ("overlayfs:
    Make f_path always point to the overlay and f_inode to the underlay").
    
    Regular files opened on overlayfs will result in the file being opened on
    the underlying filesystem, while f_path points to the overlayfs
    mount/dentry.
    
    This confuses filesystems which get the dentry from struct file and assume
    it's theirs.
    
    Add a new helper, file_dentry() [*], to get the filesystem's own dentry
    from the file.  This checks file->f_path.dentry->d_flags against
    DCACHE_OP_REAL, and returns file->f_path.dentry if DCACHE_OP_REAL is not
    set (this is the common, non-overlayfs case).
    
    In the uncommon case it will call into overlayfs's ->d_real() to get the
    underlying dentry, matching file_inode(file).
    
    The reason we need to check against the inode is that if the file is copied
    up while being open, d_real() would return the upper dentry, while the open
    file comes from the lower dentry.
    
    [*] If possible, it's better simply to use file_inode() instead.
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Tested-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
    Reviewed-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    Cc: David Howells <dhowells@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Daniel Axtens <dja@axtens.net>
    [ kamal: backport to 4.2-stable: context ]
    Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
    1aaa0634
super.c 24.6 KB