Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vfs: add vfs_select_inode() helper

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Cc: <stable@vger.kernel.org> # v4.2+

authored by

Miklos Szeredi and committed by
Al Viro
54d5ca87 44549e8f

+16 -8
+4 -8
fs/open.c
··· 840 840 int vfs_open(const struct path *path, struct file *file, 841 841 const struct cred *cred) 842 842 { 843 - struct dentry *dentry = path->dentry; 844 - struct inode *inode = dentry->d_inode; 843 + struct inode *inode = vfs_select_inode(path->dentry, file->f_flags); 844 + 845 + if (IS_ERR(inode)) 846 + return PTR_ERR(inode); 845 847 846 848 file->f_path = *path; 847 - if (dentry->d_flags & DCACHE_OP_SELECT_INODE) { 848 - inode = dentry->d_op->d_select_inode(dentry, file->f_flags); 849 - if (IS_ERR(inode)) 850 - return PTR_ERR(inode); 851 - } 852 - 853 849 return do_dentry_open(file, inode, NULL, cred); 854 850 } 855 851
+12
include/linux/dcache.h
··· 565 565 return dentry; 566 566 } 567 567 568 + static inline struct inode *vfs_select_inode(struct dentry *dentry, 569 + unsigned open_flags) 570 + { 571 + struct inode *inode = d_inode(dentry); 572 + 573 + if (inode && unlikely(dentry->d_flags & DCACHE_OP_SELECT_INODE)) 574 + inode = dentry->d_op->d_select_inode(dentry, open_flags); 575 + 576 + return inode; 577 + } 578 + 579 + 568 580 #endif /* __LINUX_DCACHE_H */