This allows the caller to pass additional flags, such as lookup flags, if desired. This will be used by io_uring to support non-blocking open_by_handle_at(2). Signed-off-by: Thomas Bertschinger --- fs/fhandle.c | 14 ++++++++++---- fs/internal.h | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/fs/fhandle.c b/fs/fhandle.c index b018fa482b03..7cc17e03e632 100644 --- a/fs/fhandle.c +++ b/fs/fhandle.c @@ -401,16 +401,16 @@ int handle_to_path(int mountdirfd, struct file_handle *handle, return retval; } -struct file *do_file_handle_open(struct path *path, int open_flag) +struct file *do_file_handle_open(struct path *path, struct open_flags *op) { const struct export_operations *eops; struct file *file; eops = path->mnt->mnt_sb->s_export_op; if (eops->open) - file = eops->open(path, open_flag); + file = eops->open(path, op->open_flag); else - file = file_open_root(path, "", open_flag, 0); + file = do_file_open_root(path, "", op); return file; } @@ -422,6 +422,8 @@ static long do_handle_open(int mountdirfd, struct file_handle __user *ufh, long retval = 0; struct path path __free(path_put) = {}; struct file *file; + struct open_flags op; + struct open_how how; handle = get_user_handle(ufh); if (IS_ERR(handle)) @@ -435,7 +437,11 @@ static long do_handle_open(int mountdirfd, struct file_handle __user *ufh, if (fd < 0) return fd; - file = do_file_handle_open(&path, open_flag); + how = build_open_how(open_flag, 0); + retval = build_open_flags(&how, &op); + if (retval) + return retval; + file = do_file_handle_open(&path, &op); if (IS_ERR(file)) return PTR_ERR(file); diff --git a/fs/internal.h b/fs/internal.h index 0a3d90d30d96..2d107383a534 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -366,5 +366,5 @@ long do_sys_name_to_handle_at(int dfd, const char __user *name, struct file_handle *get_user_handle(struct file_handle __user *ufh); int handle_to_path(int mountdirfd, struct file_handle *handle, struct path *path, unsigned int o_flags); -struct file *do_file_handle_open(struct path *path, int open_flag); +struct file *do_file_handle_open(struct path *path, struct open_flags *op); #endif /* CONFIG_FHANDLE */ -- 2.51.0