summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgnezdo <gnezdo@openbsd.org>2020-11-07 05:24:20 +0000
committergnezdo <gnezdo@openbsd.org>2020-11-07 05:24:20 +0000
commit52cb70995fd3ef97ea3686880e7dff68af519216 (patch)
tree6251b202b9fead2eab53802816446854fda92b95
parentchange from rwlock(9) to mutex(9) for linux rwlocks (diff)
downloadwireguard-openbsd-52cb70995fd3ef97ea3686880e7dff68af519216.tar.xz
wireguard-openbsd-52cb70995fd3ef97ea3686880e7dff68af519216.zip
Convert ffs_sysctl to sysctl_bounded_args
Requires sysctl_bounded_arr branch to support sysctl_rdint. The read-only variables are marked by an empty range of [1, 0]. OK millert@
-rw-r--r--sys/kern/kern_sysctl.c12
-rw-r--r--sys/sys/sysctl.h4
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c90
3 files changed, 42 insertions, 64 deletions
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index ccf0e5ffa05..78d5b309787 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sysctl.c,v 1.380 2020/10/19 08:19:46 mpi Exp $ */
+/* $OpenBSD: kern_sysctl.c,v 1.381 2020/11/07 05:24:20 gnezdo Exp $ */
/* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */
/*-
@@ -938,8 +938,14 @@ sysctl_bounded_arr(const struct sysctl_bounded_args *valpp, u_int valplen,
return (ENOTDIR);
for (i = 0; i < valplen; ++i) {
if (valpp[i].mib == name[0]) {
- return (sysctl_int_bounded(oldp, oldlenp, newp, newlen,
- valpp[i].var, valpp[i].minimum, valpp[i].maximum));
+ if (valpp[i].minimum <= valpp[i].maximum) {
+ return (sysctl_int_bounded(oldp, oldlenp, newp,
+ newlen, valpp[i].var, valpp[i].minimum,
+ valpp[i].maximum));
+ } else {
+ return (sysctl_rdint(oldp, oldlenp, newp,
+ *valpp[i].var));
+ }
}
}
return (EOPNOTSUPP);
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index 5e5115d4f4e..b7693973185 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sysctl.h,v 1.211 2020/09/01 01:53:50 gnezdo Exp $ */
+/* $OpenBSD: sysctl.h,v 1.212 2020/11/07 05:24:20 gnezdo Exp $ */
/* $NetBSD: sysctl.h,v 1.16 1996/04/09 20:55:36 cgd Exp $ */
/*
@@ -984,7 +984,7 @@ struct sysctl_bounded_args {
int mib; /* identifier shared with userspace as a CTL_ #define */
int *var; /* never NULL */
int minimum; /* checking is disabled if minimum == maximum */
- int maximum;
+ int maximum; /* read-only variable if minimum > maximum */
};
/*
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 5bfec8dc339..bd488ef4773 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ffs_vfsops.c,v 1.187 2020/08/10 06:25:02 jsg Exp $ */
+/* $OpenBSD: ffs_vfsops.c,v 1.188 2020/11/07 05:24:20 gnezdo Exp $ */
/* $NetBSD: ffs_vfsops.c,v 1.19 1996/02/09 22:22:26 christos Exp $ */
/*
@@ -1568,69 +1568,41 @@ ffs_init(struct vfsconf *vfsp)
return (ufs_init(vfsp));
}
-/*
- * fast filesystem related variables.
- */
-int
-ffs_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
- size_t newlen, struct proc *p)
-{
#ifdef FFS_SOFTUPDATES
- extern int max_softdeps, tickdelay, stat_worklist_push;
- extern int stat_blk_limit_push, stat_ino_limit_push, stat_blk_limit_hit;
- extern int stat_ino_limit_hit, stat_sync_limit_hit, stat_indir_blk_ptrs;
- extern int stat_inode_bitmap, stat_direct_blk_ptrs, stat_dir_entry;
+extern int max_softdeps, tickdelay, stat_worklist_push;
+extern int stat_blk_limit_push, stat_ino_limit_push, stat_blk_limit_hit;
+extern int stat_ino_limit_hit, stat_sync_limit_hit, stat_indir_blk_ptrs;
+extern int stat_inode_bitmap, stat_direct_blk_ptrs, stat_dir_entry;
#endif
-
- /* all sysctl names at this level are terminal */
- if (namelen != 1)
- return (ENOTDIR); /* overloaded */
-
- switch (name[0]) {
- case FFS_CLUSTERREAD:
- case FFS_CLUSTERWRITE:
- case FFS_REALLOCBLKS:
- case FFS_ASYNCFREE:
- return (EOPNOTSUPP);
+const struct sysctl_bounded_args ffs_vars[] = {
#ifdef FFS_SOFTUPDATES
- case FFS_MAX_SOFTDEPS:
- return (sysctl_int(oldp, oldlenp, newp, newlen, &max_softdeps));
- case FFS_SD_TICKDELAY:
- return (sysctl_int(oldp, oldlenp, newp, newlen, &tickdelay));
- case FFS_SD_WORKLIST_PUSH:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_worklist_push));
- case FFS_SD_BLK_LIMIT_PUSH:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_blk_limit_push));
- case FFS_SD_INO_LIMIT_PUSH:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_ino_limit_push));
- case FFS_SD_BLK_LIMIT_HIT:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_blk_limit_hit));
- case FFS_SD_INO_LIMIT_HIT:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_ino_limit_hit));
- case FFS_SD_SYNC_LIMIT_HIT:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_sync_limit_hit));
- case FFS_SD_INDIR_BLK_PTRS:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_indir_blk_ptrs));
- case FFS_SD_INODE_BITMAP:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_inode_bitmap));
- case FFS_SD_DIRECT_BLK_PTRS:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_direct_blk_ptrs));
- case FFS_SD_DIR_ENTRY:
- return (sysctl_rdint(oldp, oldlenp, newp, stat_dir_entry));
+ { FFS_MAX_SOFTDEPS, &max_softdeps, 0, INT_MAX },
+ { FFS_SD_TICKDELAY, &tickdelay, 2, INT_MAX },
+ { FFS_SD_WORKLIST_PUSH, &stat_worklist_push, 1, 0 }, /* read-only */
+ { FFS_SD_BLK_LIMIT_PUSH, &stat_blk_limit_push, 1, 0 },
+ { FFS_SD_INO_LIMIT_PUSH, &stat_ino_limit_push, 1, 0 },
+ { FFS_SD_BLK_LIMIT_HIT, &stat_blk_limit_hit, 1, 0 },
+ { FFS_SD_INO_LIMIT_HIT, &stat_ino_limit_hit, 1, 0 },
+ { FFS_SD_SYNC_LIMIT_HIT, &stat_sync_limit_hit, 1, 0 },
+ { FFS_SD_INDIR_BLK_PTRS, &stat_indir_blk_ptrs, 1, 0 },
+ { FFS_SD_INODE_BITMAP, &stat_inode_bitmap, 1, 0 },
+ { FFS_SD_DIRECT_BLK_PTRS, &stat_direct_blk_ptrs, 1, 0 },
+ { FFS_SD_DIR_ENTRY, &stat_dir_entry, 1, 0 },
#endif
#ifdef UFS_DIRHASH
- case FFS_DIRHASH_DIRSIZE:
- return (sysctl_int(oldp, oldlenp, newp, newlen,
- &ufs_mindirhashsize));
- case FFS_DIRHASH_MAXMEM:
- return (sysctl_int(oldp, oldlenp, newp, newlen,
- &ufs_dirhashmaxmem));
- case FFS_DIRHASH_MEM:
- return (sysctl_rdint(oldp, oldlenp, newp, ufs_dirhashmem));
+ { FFS_DIRHASH_DIRSIZE, &ufs_mindirhashsize, 0, INT_MAX },
+ { FFS_DIRHASH_MAXMEM, &ufs_dirhashmaxmem, 0, INT_MAX },
+ { FFS_DIRHASH_MEM, &ufs_dirhashmem, 1, 0 },
#endif
+};
- default:
- return (EOPNOTSUPP);
- }
- /* NOTREACHED */
+/*
+ * fast filesystem related variables.
+ */
+int
+ffs_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
+ size_t newlen, struct proc *p)
+{
+ return sysctl_bounded_arr(ffs_vars, nitems(ffs_vars), name,
+ namelen, oldp, oldlenp, newp, newlen);
}