On Fri, Aug 15, 2025 at 1:52 AM Thomas Bertschinger <tahbertschinger@xxxxxxxxx> wrote: > > 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); As I said I displike exported do_XXX() helpers, but I __do_XXX() exported helpers are much worse. How about do_filp_handle_open()? Thanks, Amir.