|
@@ -828,9 +828,25 @@ struct file *nameidata_to_filp(struct nameidata *nd)
|
|
|
|
|
|
/* Has the filesystem initialised the file for us? */
|
|
|
if (filp->f_path.dentry == NULL) {
|
|
|
+ struct file *res;
|
|
|
+
|
|
|
path_get(&nd->path);
|
|
|
- filp = __dentry_open(nd->path.dentry, nd->path.mnt, filp,
|
|
|
- NULL, cred);
|
|
|
+ res = do_dentry_open(nd->path.dentry, nd->path.mnt,
|
|
|
+ filp, NULL, cred);
|
|
|
+ if (!IS_ERR(res)) {
|
|
|
+ int error;
|
|
|
+
|
|
|
+ BUG_ON(res != filp);
|
|
|
+
|
|
|
+ error = open_check_o_direct(filp);
|
|
|
+ if (error) {
|
|
|
+ fput(filp);
|
|
|
+ filp = ERR_PTR(error);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ put_filp(filp);
|
|
|
+ filp = res;
|
|
|
+ }
|
|
|
}
|
|
|
return filp;
|
|
|
}
|