git: 6ceede7d3669 - stable/13 - swapoff(2): replace special device name argument with a structure
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 20 Dec 2021 00:38:06 UTC
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=6ceede7d36691d3daa736e73fe6a0b52479bfeb2
commit 6ceede7d36691d3daa736e73fe6a0b52479bfeb2
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-11-29 16:26:31 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-12-20 00:29:11 +0000
swapoff(2): replace special device name argument with a structure
(cherry picked from commit a4e4132fa3bfadb6047fc0fa5f399f4640460300)
---
sys/vm/swap_pager.c | 27 +++++++++++++++++++++++++--
sys/vm/swap_pager.h | 8 ++++++++
2 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 3893199e30b5..17722f314650 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -2485,15 +2485,38 @@ sys_swapoff(struct thread *td, struct swapoff_args *uap)
struct vnode *vp;
struct nameidata nd;
struct swdevt *sp;
- int error;
+ struct swapoff_new_args sa;
+ int error, probe_byte;
error = priv_check(td, PRIV_SWAPOFF);
if (error)
return (error);
+ /*
+ * Detect old vs. new-style swapoff(2) syscall. The first
+ * pointer in the memory pointed to by uap->name is NULL for
+ * the new variant.
+ */
+ probe_byte = fubyte(uap->name);
+ switch (probe_byte) {
+ case -1:
+ return (EFAULT);
+ case 0:
+ error = copyin(uap->name, &sa, sizeof(sa));
+ if (error != 0)
+ return (error);
+ if (sa.flags != 0)
+ return (EINVAL);
+ break;
+ default:
+ bzero(&sa, sizeof(sa));
+ sa.name = uap->name;
+ break;
+ }
+
sx_xlock(&swdev_syscall_lock);
- NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->name,
+ NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, UIO_USERSPACE, sa.name,
td);
error = namei(&nd);
if (error)
diff --git a/sys/vm/swap_pager.h b/sys/vm/swap_pager.h
index 6761d4f99ee4..ed0abdee7d3f 100644
--- a/sys/vm/swap_pager.h
+++ b/sys/vm/swap_pager.h
@@ -68,6 +68,14 @@ struct swdevt {
#define SW_UNMAPPED 0x01
#define SW_CLOSING 0x04
+struct swapoff_new_args {
+ const char *name_old_syscall;
+ const char *name;
+ u_int flags;
+ u_int pad0;
+ uintptr_t pad1[8];
+};
+
#ifdef _KERNEL
extern int swap_pager_avail;