Please sign in to comment.
fs: add file_dentry()
This series fixes bugs in nfs and ext4 due to 4bacc9c ("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: Miklos Szeredi <email@example.com> Signed-off-by: Theodore Ts'o <firstname.lastname@example.org> Tested-by: Goldwyn Rodrigues <email@example.com> Reviewed-by: Trond Myklebust <firstname.lastname@example.org> Cc: <email@example.com> # v4.2 Cc: David Howells <firstname.lastname@example.org> Cc: Al Viro <email@example.com> Cc: Daniel Axtens <firstname.lastname@example.org>
- Loading branch information...
Showing with 57 additions and 1 deletion.