|
@@ -823,8 +823,7 @@ struct file *dentry_open(const struct path *path, int flags,
|
|
|
f = get_empty_filp();
|
|
|
if (!IS_ERR(f)) {
|
|
|
f->f_flags = flags;
|
|
|
- f->f_path = *path;
|
|
|
- error = do_dentry_open(f, NULL, cred);
|
|
|
+ error = vfs_open(path, f, cred);
|
|
|
if (!error) {
|
|
|
/* from now on we need fput() to dispose of f */
|
|
|
error = open_check_o_direct(f);
|
|
@@ -841,6 +840,26 @@ struct file *dentry_open(const struct path *path, int flags,
|
|
|
}
|
|
|
EXPORT_SYMBOL(dentry_open);
|
|
|
|
|
|
+/**
|
|
|
+ * vfs_open - open the file at the given path
|
|
|
+ * @path: path to open
|
|
|
+ * @filp: newly allocated file with f_flag initialized
|
|
|
+ * @cred: credentials to use
|
|
|
+ */
|
|
|
+int vfs_open(const struct path *path, struct file *filp,
|
|
|
+ const struct cred *cred)
|
|
|
+{
|
|
|
+ struct inode *inode = path->dentry->d_inode;
|
|
|
+
|
|
|
+ if (inode->i_op->dentry_open)
|
|
|
+ return inode->i_op->dentry_open(path->dentry, filp, cred);
|
|
|
+ else {
|
|
|
+ filp->f_path = *path;
|
|
|
+ return do_dentry_open(filp, NULL, cred);
|
|
|
+ }
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(vfs_open);
|
|
|
+
|
|
|
static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op)
|
|
|
{
|
|
|
int lookup_flags = 0;
|