do_handle_open() takes care of both opening a file via its file handle, and associating it with a file descriptor. For io_uring, it is useful to do just the opening part separately, because io_uring might not want to install it into the main open files table when using fixed descriptors. This creates a helper which will enable io_uring to do that. Signed-off-by: Thomas Bertschinger <tahbertschinger@xxxxxxxxx> --- fs/fhandle.c | 24 +++++++++++++++++------- fs/internal.h | 2 ++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/fs/fhandle.c b/fs/fhandle.c index dbb273a26214..b14884a93867 100644 --- a/fs/fhandle.c +++ b/fs/fhandle.c @@ -397,8 +397,8 @@ static int handle_to_path(int mountdirfd, struct file_handle __user *ufh, return retval; } -static long do_handle_open(int mountdirfd, struct file_handle __user *ufh, - int open_flag) +struct file *__do_handle_open(int mountdirfd, struct file_handle __user *ufh, + int open_flag) { long retval = 0; struct path path __free(path_put) = {}; @@ -407,17 +407,27 @@ static long do_handle_open(int mountdirfd, struct file_handle __user *ufh, retval = handle_to_path(mountdirfd, ufh, &path, open_flag); if (retval) - return retval; - - CLASS(get_unused_fd, fd)(open_flag); - if (fd < 0) - return fd; + return ERR_PTR(retval); eops = path.mnt->mnt_sb->s_export_op; if (eops->open) file = eops->open(&path, open_flag); else file = file_open_root(&path, "", open_flag, 0); + + return file; +} + +static long do_handle_open(int mountdirfd, struct file_handle __user *ufh, + int open_flag) +{ + struct file *file; + + CLASS(get_unused_fd, fd)(open_flag); + if (fd < 0) + return fd; + + file = __do_handle_open(mountdirfd, ufh, open_flag); if (IS_ERR(file)) return PTR_ERR(file); diff --git a/fs/internal.h b/fs/internal.h index af7e0810a90d..26ac6f356313 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -362,3 +362,5 @@ void pidfs_get_root(struct path *path); long do_name_to_handle_at(int dfd, const char __user *name, struct file_handle __user *handle, void __user *mnt_id, int flag, int lookup_flags); +struct file *__do_handle_open(int mountdirfd, struct file_handle __user *ufh, + int open_flag); -- 2.50.1