]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
vfs: add vfs_select_inode() helper
authorMiklos Szeredi <mszeredi@redhat.com>
Thu, 21 Jul 2016 20:30:58 +0000 (13:30 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Sun, 31 Jul 2016 04:07:42 +0000 (21:07 -0700)
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Cc: <stable@vger.kernel.org> # v4.2+
Orabug: 24363418
CVE:CVE-2016-6198,CVE-2016-6197
Based on mainline v4.6 commit 54d5ca871e72f2bb172ec9323497f01cd5091ec7
Conflicts:
  include/linux/dcache.h - code base
Signed-off-by: Chuck Anderson <chuck.anderson@oracle.com>
fs/open.c
include/linux/dcache.h

index ff80b2542989da03313695384bd3bb5f1bf66166..301c4a24c43fb0bc25252e48a2ad96358bc28568 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -832,16 +832,12 @@ EXPORT_SYMBOL(finish_no_open);
 int vfs_open(const struct path *path, struct file *file,
             const struct cred *cred)
 {
-       struct dentry *dentry = path->dentry;
-       struct inode *inode = dentry->d_inode;
+       struct inode *inode = vfs_select_inode(path->dentry, file->f_flags);
 
-       file->f_path = *path;
-       if (dentry->d_flags & DCACHE_OP_SELECT_INODE) {
-               inode = dentry->d_op->d_select_inode(dentry, file->f_flags);
-               if (IS_ERR(inode))
-                       return PTR_ERR(inode);
-       }
+       if (IS_ERR(inode))
+               return PTR_ERR(inode);
 
+       file->f_path = *path;
        return do_dentry_open(file, inode, NULL, cred);
 }
 
index ca9df45217344708b4e73b0144697777d3f88e41..2e4217570eb0dfa67d848b4b23003f6fa20d3a87 100644 (file)
@@ -576,4 +576,16 @@ static inline struct dentry *d_backing_dentry(struct dentry *upper)
        return upper;
 }
 
+static inline struct inode *vfs_select_inode(struct dentry *dentry,
+                                            unsigned open_flags)
+{
+       struct inode *inode = d_inode(dentry);
+
+       if (inode && unlikely(dentry->d_flags & DCACHE_OP_SELECT_INODE))
+               inode = dentry->d_op->d_select_inode(dentry, open_flags);
+
+       return inode;
+}
+
+
 #endif /* __LINUX_DCACHE_H */