On Thu, Mar 15, 2018 at 8:05 PM, Dominik Brodowski <li...@dominikbrodowski.net> wrote: > Using this wrapper allows us to avoid the in-kernel calls to the > sys_unlink() syscall. > > Cc: Al Viro <v...@zeniv.linux.org.uk> > Cc: Andrew Morton <a...@linux-foundation.org> > Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net> > --- > include/linux/syscalls.h | 11 +++++++++++ > init/do_mounts.h | 2 +- > init/do_mounts_initrd.c | 4 ++-- > init/do_mounts_rd.c | 2 +- > init/initramfs.c | 4 ++-- > 5 files changed, 17 insertions(+), 6 deletions(-) > > diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h > index 8f0f99702e7a..31aea3873de7 100644 > --- a/include/linux/syscalls.h > +++ b/include/linux/syscalls.h > @@ -971,4 +971,15 @@ int ksys_chdir(const char __user *filename); > int ksys_sync_file_range(int fd, loff_t offset, loff_t nbytes, > unsigned int flags); > > +/* > + * The following kernel syscall equivalents are just wrappers to fs-internal > + * functions. Therefore, provide stubs to be inlined at the callsites. > + */ > +extern long do_unlinkat(int dfd, struct filename *name); > + > +static inline long ksys_unlink(const char __user *pathname) > +{ > + return do_unlinkat(AT_FDCWD, getname(pathname)); > +}
Why does this take a __user pointer? > static inline int create_dev(char *name, dev_t dev) > { > - sys_unlink(name); > + ksys_unlink(name); > return sys_mknod(name, S_IFBLK|0600, new_encode_dev(dev)); > } > > diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c > index c19d9070134e..784576b633fd 100644 > --- a/init/do_mounts_initrd.c > +++ b/init/do_mounts_initrd.c > @@ -128,11 +128,11 @@ bool __init initrd_load(void) > * mounted in the normal path. > */ > if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) { > - sys_unlink("/initrd.image"); > + ksys_unlink("/initrd.image"); > handle_initrd(); > return true; > } > } > - sys_unlink("/initrd.image"); > + ksys_unlink("/initrd.image"); > return false; In all callers we seem to have regular kernel strings, so I think you should skip the getname() and change the argument to a regular pointer. Arnd