From 2eb6ef203ac621d6148c2ecd848da5263bc57813 Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Wed, 11 Sep 2019 13:01:59 +0000 Subject: [PATCH] linux: add trivial renameat2 implementation Just return EINVAL if flags != 0. The Linux man page documents one case of EINVAL as "The filesystem does not support one of the flags in flags." After r351723 userland binaries will try using new system calls. Reported by: mjg Reviewed by: mjg, trasz Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D21590 --- sys/amd64/linux/linux_dummy.c | 2 -- sys/amd64/linux32/linux32_dummy.c | 2 -- sys/arm64/linux/linux_dummy.c | 2 -- sys/compat/linux/linux_file.c | 20 ++++++++++++++++++++ sys/i386/linux/linux_dummy.c | 2 -- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/sys/amd64/linux/linux_dummy.c b/sys/amd64/linux/linux_dummy.c index 56c20bb26fec..7894c0c8484b 100644 --- a/sys/amd64/linux/linux_dummy.c +++ b/sys/amd64/linux/linux_dummy.c @@ -130,8 +130,6 @@ DUMMY(kcmp); DUMMY(finit_module); DUMMY(sched_setattr); DUMMY(sched_getattr); -/* Linux 3.14: */ -DUMMY(renameat2); /* Linux 3.15: */ DUMMY(seccomp); DUMMY(memfd_create); diff --git a/sys/amd64/linux32/linux32_dummy.c b/sys/amd64/linux32/linux32_dummy.c index 9de0c99a3fce..eccb7035da02 100644 --- a/sys/amd64/linux32/linux32_dummy.c +++ b/sys/amd64/linux32/linux32_dummy.c @@ -137,8 +137,6 @@ DUMMY(kcmp); DUMMY(finit_module); DUMMY(sched_setattr); DUMMY(sched_getattr); -/* Linux 3.14: */ -DUMMY(renameat2); /* Linux 3.15: */ DUMMY(seccomp); DUMMY(memfd_create); diff --git a/sys/arm64/linux/linux_dummy.c b/sys/arm64/linux/linux_dummy.c index da9b69038449..d7f3f252fc22 100644 --- a/sys/arm64/linux/linux_dummy.c +++ b/sys/arm64/linux/linux_dummy.c @@ -130,8 +130,6 @@ DUMMY(kcmp); DUMMY(finit_module); DUMMY(sched_setattr); DUMMY(sched_getattr); -/* Linux 3.14: */ -DUMMY(renameat2); /* Linux 3.15: */ DUMMY(seccomp); DUMMY(memfd_create); diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c index 67a606896c6e..463495175e25 100644 --- a/sys/compat/linux/linux_file.c +++ b/sys/compat/linux/linux_file.c @@ -685,10 +685,30 @@ linux_rename(struct thread *td, struct linux_rename_args *args) int linux_renameat(struct thread *td, struct linux_renameat_args *args) +{ + struct linux_renameat2_args renameat2_args = { + .olddfd = args->olddfd, + .oldname = args->oldname, + .newdfd = args->newdfd, + .newname = args->newname, + .flags = 0 + }; + + return (linux_renameat2(td, &renameat2_args)); +} + +int +linux_renameat2(struct thread *td, struct linux_renameat2_args *args) { char *from, *to; int error, olddfd, newdfd; + if (args->flags != 0) { + linux_msg(td, "renameat2 unsupported flags 0x%x\n", + args->flags); + return (EINVAL); + } + olddfd = (args->olddfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->olddfd; newdfd = (args->newdfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->newdfd; LCONVPATHEXIST_AT(td, args->oldname, &from, olddfd); diff --git a/sys/i386/linux/linux_dummy.c b/sys/i386/linux/linux_dummy.c index 31212de7fab5..cd385f43f4a6 100644 --- a/sys/i386/linux/linux_dummy.c +++ b/sys/i386/linux/linux_dummy.c @@ -134,8 +134,6 @@ DUMMY(finit_module); DUMMY(sched_setattr); DUMMY(sched_getattr); /* Linux 3.14: */ -DUMMY(renameat2); -/* Linux 3.15: */ DUMMY(seccomp); DUMMY(memfd_create); /* Linux 3.18: */