atomic_open(): saner calling conventions (return dentry on success)

Currently it either returns -E... or puts (nd->path.mnt,dentry)
into *path and returns 0.  Make it return ERR_PTR(-E...) or
dentry; adjust the caller.  Fewer arguments and it's easier
to keep track of *path contents that way.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2020-01-09 14:12:40 -05:00
parent bd7c4b5083
commit 239eb98338

View File

@ -3087,10 +3087,10 @@ static int may_o_create(const struct path *dir, struct dentry *dentry, umode_t m
*
* 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,
int open_flag, umode_t mode)
static struct dentry *atomic_open(struct nameidata *nd, struct dentry *dentry,
struct file *file,
const struct open_flags *op,
int open_flag, umode_t mode)
{
struct dentry *const DENTRY_NOT_SET = (void *) -1UL;
struct inode *dir = nd->path.dentry->d_inode;
@ -3131,17 +3131,15 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
}
if (file->f_mode & FMODE_CREATED)
fsnotify_create(dir, dentry);
if (unlikely(d_is_negative(dentry))) {
if (unlikely(d_is_negative(dentry)))
error = -ENOENT;
} else {
path->dentry = dentry;
path->mnt = nd->path.mnt;
return 0;
}
}
}
dput(dentry);
return error;
if (error) {
dput(dentry);
dentry = ERR_PTR(error);
}
return dentry;
}
/*
@ -3236,11 +3234,20 @@ static int lookup_open(struct nameidata *nd, struct path *path,
}
if (dir_inode->i_op->atomic_open) {
error = atomic_open(nd, dentry, path, file, op, open_flag,
mode);
if (unlikely(error == -ENOENT) && create_error)
error = create_error;
return error;
dentry = atomic_open(nd, dentry, file, op, open_flag, mode);
if (IS_ERR(dentry)) {
error = PTR_ERR(dentry);
if (unlikely(error == -ENOENT) && create_error)
error = create_error;
return error;
}
if (file->f_mode & FMODE_OPENED) {
dput(dentry);
return 0;
}
path->mnt = nd->path.mnt;
path->dentry = dentry;
return 0;
}
no_open: