To prepare knfsd's helper dentry_create(), move it to namei.c so that it can access static functions within. Callers of dentry_create() can be viewed as being mostly done with lookup, but still need to perform a few final checks. In order to use atomic_open() we want dentry_create() to be able to access: - vfs_prepare_mode - may_o_create - atomic_open .. all of which have static declarations. Signed-off-by: Benjamin Coddington Reviewed-by: Jeff Layton --- fs/namei.c | 41 +++++++++++++++++++++++++++++++++++++++++ fs/open.c | 41 ----------------------------------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 7377020a2cba..88f82cb5f7a0 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4278,6 +4278,47 @@ inline struct dentry *start_creating_user_path( } EXPORT_SYMBOL(start_creating_user_path); +/** + * dentry_create - Create and open a file + * @path: path to create + * @flags: O_ flags + * @mode: mode bits for new file + * @cred: credentials to use + * + * Caller must hold the parent directory's lock, and have prepared + * a negative dentry, placed in @path->dentry, for the new file. + * + * Caller sets @path->mnt to the vfsmount of the filesystem where + * the new file is to be created. The parent directory and the + * negative dentry must reside on the same filesystem instance. + * + * On success, returns a "struct file *". Otherwise a ERR_PTR + * is returned. + */ +struct file *dentry_create(const struct path *path, int flags, umode_t mode, + const struct cred *cred) +{ + struct file *file; + int error; + + file = alloc_empty_file(flags, cred); + if (IS_ERR(file)) + return file; + + error = vfs_create(mnt_idmap(path->mnt), + d_inode(path->dentry->d_parent), + path->dentry, mode, true); + if (!error) + error = vfs_open(path, file); + + if (unlikely(error)) { + fput(file); + return ERR_PTR(error); + } + return file; +} +EXPORT_SYMBOL(dentry_create); + /** * vfs_mknod - create device node or file * @idmap: idmap of the mount the inode was found from diff --git a/fs/open.c b/fs/open.c index 3d64372ecc67..d6dbb43d41bd 100644 --- a/fs/open.c +++ b/fs/open.c @@ -1144,47 +1144,6 @@ struct file *dentry_open_nonotify(const struct path *path, int flags, return f; } -/** - * dentry_create - Create and open a file - * @path: path to create - * @flags: O_ flags - * @mode: mode bits for new file - * @cred: credentials to use - * - * Caller must hold the parent directory's lock, and have prepared - * a negative dentry, placed in @path->dentry, for the new file. - * - * Caller sets @path->mnt to the vfsmount of the filesystem where - * the new file is to be created. The parent directory and the - * negative dentry must reside on the same filesystem instance. - * - * On success, returns a "struct file *". Otherwise a ERR_PTR - * is returned. - */ -struct file *dentry_create(const struct path *path, int flags, umode_t mode, - const struct cred *cred) -{ - struct file *f; - int error; - - f = alloc_empty_file(flags, cred); - if (IS_ERR(f)) - return f; - - error = vfs_create(mnt_idmap(path->mnt), - d_inode(path->dentry->d_parent), - path->dentry, mode, true); - if (!error) - error = vfs_open(path, f); - - if (unlikely(error)) { - fput(f); - return ERR_PTR(error); - } - return f; -} -EXPORT_SYMBOL(dentry_create); - /** * kernel_file_open - open a file for kernel internal use * @path: path of the file to open -- 2.50.1