diff options
| -rw-r--r-- | fs/namei.c | 29 | 
1 files changed, 26 insertions, 3 deletions
diff --git a/fs/namei.c b/fs/namei.c index ffcd4e114b6..5abab917690 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2192,6 +2192,19 @@ static int may_o_create(struct path *dir, struct dentry *dentry, umode_t mode)  	return security_inode_create(dir->dentry->d_inode, dentry, mode);  } +/* + * Attempt to atomically look up, create and open a file from a negative + * dentry. + * + * 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. + * + * Returns an error code otherwise. + */  static int atomic_open(struct nameidata *nd, struct dentry *dentry,  			struct path *path, struct file *file,  			const struct open_flags *op, @@ -2336,12 +2349,22 @@ looked_up:  }  /* - * Lookup, maybe create and open the last component + * Look up and maybe create and open the last component.   *   * Must be called with i_mutex held on parent.   * - * Returns open file or NULL on success, error otherwise.  NULL means no open - * was performed, only lookup. + * Returns 0 if the file was successfully atomically created (if necessary) and + * opened.  In this case the file will be returned attached to @file. + * + * 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. + * + * An error code is returned otherwise. + * + * FILE_CREATE will be set in @*opened if the dentry was created and will be + * cleared otherwise prior to returning.   */  static int lookup_open(struct nameidata *nd, struct path *path,  			struct file *file,  |