|
@@ -3027,9 +3027,9 @@ static int may_o_create(const struct path *dir, struct dentry *dentry, umode_t m
|
|
|
* Returns 0 if successful. The file will have been created and attached to
|
|
|
* @file by the filesystem calling finish_open().
|
|
|
*
|
|
|
- * Returns 1 if the file was looked up only or didn't need creating. The
|
|
|
- * caller will need to perform the open themselves. @path will have been
|
|
|
- * updated to point to the new dentry. This may be negative.
|
|
|
+ * If the file was looked up only or didn't need creating, FMODE_OPENED won't
|
|
|
+ * be set. The caller will need to perform the open themselves. @path will
|
|
|
+ * have been updated to point to the new dentry. This may be negative.
|
|
|
*
|
|
|
* Returns an error code otherwise.
|
|
|
*/
|
|
@@ -3082,7 +3082,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
|
|
|
} else {
|
|
|
path->dentry = dentry;
|
|
|
path->mnt = nd->path.mnt;
|
|
|
- return 1;
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -3093,17 +3093,17 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
|
|
|
/*
|
|
|
* Look up and maybe create and open the last component.
|
|
|
*
|
|
|
- * Must be called with i_mutex held on parent.
|
|
|
- *
|
|
|
- * Returns 0 if the file was successfully atomically created (if necessary) and
|
|
|
- * opened. In this case the file will be returned attached to @file.
|
|
|
+ * Must be called with parent locked (exclusive in O_CREAT case).
|
|
|
*
|
|
|
- * Returns 1 if the file was not completely opened at this time, though lookups
|
|
|
- * and creations will have been performed and the dentry returned in @path will
|
|
|
- * be positive upon return if O_CREAT was specified. If O_CREAT wasn't
|
|
|
- * specified then a negative dentry may be returned.
|
|
|
+ * Returns 0 on success, that is, if
|
|
|
+ * the file was successfully atomically created (if necessary) and opened, or
|
|
|
+ * the file was not completely opened at this time, though lookups and
|
|
|
+ * creations were performed.
|
|
|
+ * These case are distinguished by presence of FMODE_OPENED on file->f_mode.
|
|
|
+ * In the latter case dentry returned in @path might be negative if O_CREAT
|
|
|
+ * hadn't been specified.
|
|
|
*
|
|
|
- * An error code is returned otherwise.
|
|
|
+ * An error code is returned on failure.
|
|
|
*/
|
|
|
static int lookup_open(struct nameidata *nd, struct path *path,
|
|
|
struct file *file,
|
|
@@ -3225,7 +3225,7 @@ no_open:
|
|
|
out_no_open:
|
|
|
path->dentry = dentry;
|
|
|
path->mnt = nd->path.mnt;
|
|
|
- return 1;
|
|
|
+ return 0;
|
|
|
|
|
|
out_dput:
|
|
|
dput(dentry);
|
|
@@ -3308,10 +3308,10 @@ static int do_last(struct nameidata *nd,
|
|
|
else
|
|
|
inode_unlock_shared(dir->d_inode);
|
|
|
|
|
|
- if (error <= 0) {
|
|
|
- if (error)
|
|
|
- goto out;
|
|
|
+ if (error)
|
|
|
+ goto out;
|
|
|
|
|
|
+ if (file->f_mode & FMODE_OPENED) {
|
|
|
if ((file->f_mode & FMODE_CREATED) ||
|
|
|
!S_ISREG(file_inode(file)->i_mode))
|
|
|
will_truncate = false;
|