Date: Sat, 19 May 2018 00:31:42 -0700 From: Matthew Macy <mmacy@freebsd.org> To: Mateusz Guzik <mjguzik@gmail.com> Cc: Ilya Bakulin <ilya@bakulin.de>, manu@freebsd.org, Warner Losh <imp@freebsd.org>, src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r333425 - in head/sys: cddl/compat/opensolaris/sys cddl/contrib/opensolaris/uts/common/fs/zfs compat/cloudabi compat/linux compat/linuxkpi/common/include/linux dev/filemon dev/hwpmc fs/... Message-ID: <CAPrugNqEvYvdveCC94SLGg9PC12H0zx%2BgM1Gefsj0jgFbGcXJA@mail.gmail.com> In-Reply-To: <CAPrugNoLW_soreUR1v9KOusDc70hmOooyXSAPFvnLfdDM__z_Q@mail.gmail.com> References: <201805091847.w49IlPPa014617@repo.freebsd.org> <CADzbx%2Brm7N4ZW8%2BzMtN6MdSBKjknQnEC1QRso9meBT5Qrfdk6Q@mail.gmail.com> <CAPrugNoYfqqPHrgK2KiDpu3jJn_hv=5LUOP3OQuP_G5HUmKJpw@mail.gmail.com> <CAGudoHEQnmChLYP1pBruLy4MyS=DCfSKyrtdzZMceSNAeajrdQ@mail.gmail.com> <CAPrugNoLW_soreUR1v9KOusDc70hmOooyXSAPFvnLfdDM__z_Q@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
r333874 On Sat, May 19, 2018 at 12:16 AM, Matthew Macy <mmacy@freebsd.org> wrote: > I can do that tomorrow. But point is that something else will push it over soon. > > On Sat, May 19, 2018 at 12:14 AM, Mateusz Guzik <mjguzik@gmail.com> wrote: >> imo all these sysinits can and shoud be collapsed into one, which will have >> a side effect of getting rid of the problem. >> >> On Sat, May 19, 2018 at 9:13 AM, Matthew Macy <mmacy@freebsd.org> wrote: >>> >>> I guess we'll need to allocate more pages at boot. We must have been >>> on the edge already if that pushed us over. >>> -M >>> >>> On Fri, May 18, 2018 at 12:03 PM, Ilya Bakulin <ilya@bakulin.de> wrote: >>> > Hi Matt, >>> > seems this commit has broken at least BeagleBone Black booting process. >>> > On >>> > all revisions after it the kernel panics with this message: >>> > http://dl.bakulin.de/bbb_panic.txt >>> > My suspicion is that there are quite a few new SYSINIT objects that are >>> > created on startup, and as a result some kind of memory reservation gets >>> > exhausted. I don't have immediate idea how to debug this further; just >>> > can >>> > confirm that patching out this change allows the board to boot again. >>> > >>> > >>> > On Wed, May 9, 2018 at 8:47 PM Matt Macy <mmacy@freebsd.org> wrote: >>> >> >>> >> Author: mmacy >>> >> Date: Wed May 9 18:47:24 2018 >>> >> New Revision: 333425 >>> >> URL: https://svnweb.freebsd.org/changeset/base/333425 >>> >> >>> >> Log: >>> >> Eliminate the overhead of gratuitous repeated reinitialization of >>> >> cap_rights >>> >> >>> >> - Add macros to allow preinitialization of cap_rights_t. >>> >> >>> >> - Convert most commonly used code paths to use preinitialized >>> >> cap_rights_t. >>> >> A 3.6% speedup in fstat was measured with this change. >>> >> >>> >> Reported by: mjg >>> >> Reviewed by: oshogbo >>> >> Approved by: sbruno >>> >> MFC after: 1 month >>> >> >>> >> Modified: >>> >> head/sys/cddl/compat/opensolaris/sys/file.h >>> >> head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c >>> >> head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_onexit.c >>> >> head/sys/compat/cloudabi/cloudabi_file.c >>> >> head/sys/compat/linux/linux_event.c >>> >> head/sys/compat/linux/linux_file.c >>> >> head/sys/compat/linux/linux_ioctl.c >>> >> head/sys/compat/linux/linux_mmap.c >>> >> head/sys/compat/linux/linux_socket.c >>> >> head/sys/compat/linux/linux_stats.c >>> >> head/sys/compat/linuxkpi/common/include/linux/file.h >>> >> head/sys/dev/filemon/filemon.c >>> >> head/sys/dev/hwpmc/hwpmc_logging.c >>> >> head/sys/fs/fdescfs/fdesc_vnops.c >>> >> head/sys/fs/fuse/fuse_vfsops.c >>> >> head/sys/kern/kern_descrip.c >>> >> head/sys/kern/kern_event.c >>> >> head/sys/kern/kern_exec.c >>> >> head/sys/kern/kern_sendfile.c >>> >> head/sys/kern/kern_sig.c >>> >> head/sys/kern/subr_capability.c >>> >> head/sys/kern/sys_generic.c >>> >> head/sys/kern/sys_procdesc.c >>> >> head/sys/kern/uipc_mqueue.c >>> >> head/sys/kern/uipc_sem.c >>> >> head/sys/kern/uipc_syscalls.c >>> >> head/sys/kern/vfs_aio.c >>> >> head/sys/kern/vfs_syscalls.c >>> >> head/sys/netsmb/smb_dev.c >>> >> head/sys/sys/capsicum.h >>> >> >>> >> Modified: head/sys/cddl/compat/opensolaris/sys/file.h >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/cddl/compat/opensolaris/sys/file.h Wed May 9 18:41:04 >>> >> 2018 >>> >> (r333424) >>> >> +++ head/sys/cddl/compat/opensolaris/sys/file.h Wed May 9 18:47:24 >>> >> 2018 >>> >> (r333425) >>> >> @@ -52,10 +52,9 @@ static __inline void >>> >> releasef(int fd) >>> >> { >>> >> struct file *fp; >>> >> - cap_rights_t rights; >>> >> >>> >> /* No CAP_ rights required, as we're only releasing. */ >>> >> - if (fget(curthread, fd, cap_rights_init(&rights), &fp) == 0) { >>> >> + if (fget(curthread, fd, &cap_no_rights, &fp) == 0) { >>> >> fdrop(fp, curthread); >>> >> fdrop(fp, curthread); >>> >> } >>> >> >>> >> Modified: >>> >> head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c >>> >> Wed May 9 18:41:04 2018 (r333424) >>> >> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c >>> >> Wed May 9 18:47:24 2018 (r333425) >>> >> @@ -4446,7 +4446,6 @@ zfs_ioc_recv(zfs_cmd_t *zc) >>> >> char *origin = NULL; >>> >> char *tosnap; >>> >> char tofs[ZFS_MAX_DATASET_NAME_LEN]; >>> >> - cap_rights_t rights; >>> >> boolean_t first_recvd_props = B_FALSE; >>> >> >>> >> if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0 || >>> >> @@ -4467,7 +4466,7 @@ zfs_ioc_recv(zfs_cmd_t *zc) >>> >> #ifdef illumos >>> >> fp = getf(fd); >>> >> #else >>> >> - fget_read(curthread, fd, cap_rights_init(&rights, CAP_PREAD), >>> >> &fp); >>> >> + fget_read(curthread, fd, &cap_pread_rights, &fp); >>> >> #endif >>> >> if (fp == NULL) { >>> >> nvlist_free(props); >>> >> @@ -4744,13 +4743,11 @@ zfs_ioc_send(zfs_cmd_t *zc) >>> >> dsl_pool_rele(dp, FTAG); >>> >> } else { >>> >> file_t *fp; >>> >> - cap_rights_t rights; >>> >> >>> >> #ifdef illumos >>> >> fp = getf(zc->zc_cookie); >>> >> #else >>> >> - fget_write(curthread, zc->zc_cookie, >>> >> - cap_rights_init(&rights, CAP_WRITE), &fp); >>> >> + fget_write(curthread, zc->zc_cookie, &cap_write_rights, >>> >> &fp); >>> >> #endif >>> >> if (fp == NULL) >>> >> return (SET_ERROR(EBADF)); >>> >> @@ -5387,15 +5384,13 @@ static int >>> >> zfs_ioc_diff(zfs_cmd_t *zc) >>> >> { >>> >> file_t *fp; >>> >> - cap_rights_t rights; >>> >> offset_t off; >>> >> int error; >>> >> >>> >> #ifdef illumos >>> >> fp = getf(zc->zc_cookie); >>> >> #else >>> >> - fget_write(curthread, zc->zc_cookie, >>> >> - cap_rights_init(&rights, CAP_WRITE), &fp); >>> >> + fget_write(curthread, zc->zc_cookie, &cap_write_rights, &fp); >>> >> #endif >>> >> if (fp == NULL) >>> >> return (SET_ERROR(EBADF)); >>> >> @@ -5787,7 +5782,6 @@ zfs_ioc_unjail(zfs_cmd_t *zc) >>> >> static int >>> >> zfs_ioc_send_new(const char *snapname, nvlist_t *innvl, nvlist_t >>> >> *outnvl) >>> >> { >>> >> - cap_rights_t rights; >>> >> file_t *fp; >>> >> int error; >>> >> offset_t off; >>> >> @@ -5815,7 +5809,7 @@ zfs_ioc_send_new(const char *snapname, nvlist_t >>> >> *innvl >>> >> #ifdef illumos >>> >> file_t *fp = getf(fd); >>> >> #else >>> >> - fget_write(curthread, fd, cap_rights_init(&rights, CAP_WRITE), >>> >> &fp); >>> >> + fget_write(curthread, fd, &cap_write_rights, &fp); >>> >> #endif >>> >> if (fp == NULL) >>> >> return (SET_ERROR(EBADF)); >>> >> >>> >> Modified: >>> >> head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_onexit.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_onexit.c >>> >> Wed May 9 18:41:04 2018 (r333424) >>> >> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_onexit.c >>> >> Wed May 9 18:47:24 2018 (r333425) >>> >> @@ -126,7 +126,7 @@ zfs_onexit_fd_hold(int fd, minor_t *minorp) >>> >> void *data; >>> >> int error; >>> >> >>> >> - fp = getf(fd, cap_rights_init(&rights)); >>> >> + fp = getf(fd, &cap_no_rights); >>> >> if (fp == NULL) >>> >> return (SET_ERROR(EBADF)); >>> >> >>> >> >>> >> Modified: head/sys/compat/cloudabi/cloudabi_file.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/compat/cloudabi/cloudabi_file.c Wed May 9 18:41:04 >>> >> 2018 >>> >> (r333424) >>> >> +++ head/sys/compat/cloudabi/cloudabi_file.c Wed May 9 18:47:24 >>> >> 2018 >>> >> (r333425) >>> >> @@ -390,12 +390,11 @@ cloudabi_sys_file_readdir(struct thread *td, >>> >> struct file *fp; >>> >> struct vnode *vp; >>> >> void *readbuf; >>> >> - cap_rights_t rights; >>> >> cloudabi_dircookie_t offset; >>> >> int error; >>> >> >>> >> /* Obtain directory vnode. */ >>> >> - error = getvnode(td, uap->fd, cap_rights_init(&rights, >>> >> CAP_READ), >>> >> &fp); >>> >> + error = getvnode(td, uap->fd, &cap_read_rights, &fp); >>> >> if (error != 0) { >>> >> if (error == EINVAL) >>> >> return (ENOTDIR); >>> >> @@ -559,14 +558,13 @@ cloudabi_sys_file_stat_fget(struct thread *td, >>> >> struct stat sb; >>> >> cloudabi_filestat_t csb; >>> >> struct file *fp; >>> >> - cap_rights_t rights; >>> >> cloudabi_filetype_t filetype; >>> >> int error; >>> >> >>> >> memset(&csb, 0, sizeof(csb)); >>> >> >>> >> /* Fetch file descriptor attributes. */ >>> >> - error = fget(td, uap->fd, cap_rights_init(&rights, CAP_FSTAT), >>> >> &fp); >>> >> + error = fget(td, uap->fd, &cap_fstat_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> error = fo_stat(fp, &sb, td->td_ucred, td); >>> >> >>> >> Modified: head/sys/compat/linux/linux_event.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/compat/linux/linux_event.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/compat/linux/linux_event.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -1190,14 +1190,13 @@ linux_timerfd_curval(struct timerfd *tfd, >>> >> struct >>> >> itime >>> >> int >>> >> linux_timerfd_gettime(struct thread *td, struct >>> >> linux_timerfd_gettime_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct l_itimerspec lots; >>> >> struct itimerspec ots; >>> >> struct timerfd *tfd; >>> >> struct file *fp; >>> >> int error; >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_READ), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_read_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> tfd = fp->f_data; >>> >> @@ -1225,7 +1224,6 @@ linux_timerfd_settime(struct thread *td, struct >>> >> linux_ >>> >> struct l_itimerspec lots; >>> >> struct itimerspec nts, ots; >>> >> struct timespec cts, ts; >>> >> - cap_rights_t rights; >>> >> struct timerfd *tfd; >>> >> struct timeval tv; >>> >> struct file *fp; >>> >> @@ -1241,7 +1239,7 @@ linux_timerfd_settime(struct thread *td, struct >>> >> linux_ >>> >> if (error != 0) >>> >> return (error); >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_WRITE), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_write_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> tfd = fp->f_data; >>> >> >>> >> Modified: head/sys/compat/linux/linux_file.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/compat/linux/linux_file.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/compat/linux/linux_file.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -89,7 +89,6 @@ linux_creat(struct thread *td, struct >>> >> linux_creat_args >>> >> static int >>> >> linux_common_open(struct thread *td, int dirfd, char *path, int >>> >> l_flags, >>> >> int mode) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct proc *p = td->td_proc; >>> >> struct file *fp; >>> >> int fd; >>> >> @@ -144,7 +143,7 @@ linux_common_open(struct thread *td, int dirfd, >>> >> char * >>> >> * checking below. >>> >> */ >>> >> fd = td->td_retval[0]; >>> >> - if (fget(td, fd, cap_rights_init(&rights, CAP_IOCTL), &fp) == >>> >> 0) { >>> >> + if (fget(td, fd, &cap_ioctl_rights, &fp) == 0) { >>> >> if (fp->f_type != DTYPE_VNODE) { >>> >> fdrop(fp, td); >>> >> goto done; >>> >> @@ -263,13 +262,12 @@ linux_llseek(struct thread *td, struct >>> >> linux_llseek_ar >>> >> static int >>> >> linux_getdents_error(struct thread *td, int fd, int err) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct vnode *vp; >>> >> struct file *fp; >>> >> int error; >>> >> >>> >> /* Linux return ENOTDIR in case when fd is not a directory. */ >>> >> - error = getvnode(td, fd, cap_rights_init(&rights, CAP_READ), >>> >> &fp); >>> >> + error = getvnode(td, fd, &cap_read_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> vp = fp->f_vnode; >>> >> @@ -985,15 +983,13 @@ linux_fdatasync(td, uap) >>> >> int >>> >> linux_pread(struct thread *td, struct linux_pread_args *uap) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct vnode *vp; >>> >> int error; >>> >> >>> >> error = kern_pread(td, uap->fd, uap->buf, uap->nbyte, >>> >> uap->offset); >>> >> if (error == 0) { >>> >> /* This seems to violate POSIX but Linux does it. */ >>> >> - error = fgetvp(td, uap->fd, >>> >> - cap_rights_init(&rights, CAP_PREAD), &vp); >>> >> + error = fgetvp(td, uap->fd, &cap_pread_rights, &vp); >>> >> if (error != 0) >>> >> return (error); >>> >> if (vp->v_type == VDIR) { >>> >> @@ -1275,7 +1271,6 @@ fcntl_common(struct thread *td, struct >>> >> linux_fcntl_arg >>> >> { >>> >> struct l_flock linux_flock; >>> >> struct flock bsd_flock; >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> long arg; >>> >> int error, result; >>> >> @@ -1379,7 +1374,7 @@ fcntl_common(struct thread *td, struct >>> >> linux_fcntl_arg >>> >> * pipes under Linux-2.2.35 at least). >>> >> */ >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_FCNTL), &fp); >>> >> + &cap_fcntl_rights, &fp); >>> >> if (error) >>> >> return (error); >>> >> if (fp->f_type == DTYPE_PIPE) { >>> >> >>> >> Modified: head/sys/compat/linux/linux_ioctl.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/compat/linux/linux_ioctl.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/compat/linux/linux_ioctl.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -194,13 +194,12 @@ struct linux_hd_big_geometry { >>> >> static int >>> >> linux_ioctl_hdio(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> int error; >>> >> u_int sectorsize, fwcylinders, fwheads, fwsectors; >>> >> off_t mediasize, bytespercyl; >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> switch (args->cmd & 0xffff) { >>> >> @@ -278,13 +277,12 @@ linux_ioctl_hdio(struct thread *td, struct >>> >> linux_ioctl >>> >> static int >>> >> linux_ioctl_disk(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> int error; >>> >> u_int sectorsize; >>> >> off_t mediasize; >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> switch (args->cmd & 0xffff) { >>> >> @@ -717,11 +715,10 @@ linux_ioctl_termio(struct thread *td, struct >>> >> linux_ioc >>> >> struct termios bios; >>> >> struct linux_termios lios; >>> >> struct linux_termio lio; >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> int error; >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> >>> >> @@ -1461,11 +1458,10 @@ bsd_to_linux_dvd_authinfo(struct dvd_authinfo >>> >> *bp, >>> >> l_d >>> >> static int >>> >> linux_ioctl_cdrom(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> int error; >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> switch (args->cmd & 0xffff) { >>> >> @@ -1998,11 +1994,10 @@ linux_ioctl_sound(struct thread *td, struct >>> >> linux_ioct >>> >> static int >>> >> linux_ioctl_console(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> int error; >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> switch (args->cmd & 0xffff) { >>> >> @@ -2411,7 +2406,6 @@ static int >>> >> linux_ioctl_socket(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> char lifname[LINUX_IFNAMSIZ], ifname[IFNAMSIZ]; >>> >> - cap_rights_t rights; >>> >> struct ifnet *ifp; >>> >> struct file *fp; >>> >> int error, type; >>> >> @@ -2419,7 +2413,7 @@ linux_ioctl_socket(struct thread *td, struct >>> >> linux_ioc >>> >> ifp = NULL; >>> >> error = 0; >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> type = fp->f_type; >>> >> @@ -2649,11 +2643,10 @@ linux_ioctl_socket(struct thread *td, struct >>> >> linux_ioc >>> >> static int >>> >> linux_ioctl_private(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> int error, type; >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> type = fp->f_type; >>> >> @@ -2685,11 +2678,10 @@ linux_ioctl_sg_io(struct thread *td, struct >>> >> linux_ioct >>> >> { >>> >> struct sg_io_hdr io; >>> >> struct sg_io_hdr32 io32; >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> int error; >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_ioctl_rights, &fp); >>> >> if (error != 0) { >>> >> printf("sg_linux_ioctl: fget returned %d\n", error); >>> >> return (error); >>> >> @@ -2997,7 +2989,6 @@ linux_v4l_cliplist_copy(struct l_video_window >>> >> *lvw, >>> >> st >>> >> static int >>> >> linux_ioctl_v4l(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> int error; >>> >> struct video_tuner vtun; >>> >> @@ -3016,7 +3007,7 @@ linux_ioctl_v4l(struct thread *td, struct >>> >> linux_ioctl_ >>> >> >>> >> case LINUX_VIDIOCGTUNER: >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> error = copyin((void *) args->arg, &l_vtun, >>> >> sizeof(l_vtun)); >>> >> @@ -3036,7 +3027,7 @@ linux_ioctl_v4l(struct thread *td, struct >>> >> linux_ioctl_ >>> >> >>> >> case LINUX_VIDIOCSTUNER: >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> error = copyin((void *) args->arg, &l_vtun, >>> >> sizeof(l_vtun)); >>> >> @@ -3055,7 +3046,7 @@ linux_ioctl_v4l(struct thread *td, struct >>> >> linux_ioctl_ >>> >> >>> >> case LINUX_VIDIOCGWIN: >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> error = fo_ioctl(fp, VIDIOCGWIN, &vwin, td->td_ucred, >>> >> td); >>> >> @@ -3069,7 +3060,7 @@ linux_ioctl_v4l(struct thread *td, struct >>> >> linux_ioctl_ >>> >> >>> >> case LINUX_VIDIOCSWIN: >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> error = copyin((void *) args->arg, &l_vwin, >>> >> sizeof(l_vwin)); >>> >> @@ -3094,7 +3085,7 @@ linux_ioctl_v4l(struct thread *td, struct >>> >> linux_ioctl_ >>> >> >>> >> case LINUX_VIDIOCGFBUF: >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> error = fo_ioctl(fp, VIDIOCGFBUF, &vbuf, td->td_ucred, >>> >> td); >>> >> @@ -3108,7 +3099,7 @@ linux_ioctl_v4l(struct thread *td, struct >>> >> linux_ioctl_ >>> >> >>> >> case LINUX_VIDIOCSFBUF: >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> error = copyin((void *) args->arg, &l_vbuf, >>> >> sizeof(l_vbuf)); >>> >> @@ -3138,7 +3129,7 @@ linux_ioctl_v4l(struct thread *td, struct >>> >> linux_ioctl_ >>> >> >>> >> case LINUX_VIDIOCSMICROCODE: >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> error = copyin((void *) args->arg, &l_vcode, >>> >> sizeof(l_vcode)); >>> >> @@ -3302,7 +3293,6 @@ bsd_to_linux_v4l2_format(struct v4l2_format *vf, >>> >> struc >>> >> static int >>> >> linux_ioctl_v4l2(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> int error; >>> >> struct v4l2_format vformat; >>> >> @@ -3395,7 +3385,7 @@ linux_ioctl_v4l2(struct thread *td, struct >>> >> linux_ioctl >>> >> if (error) >>> >> return (error); >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error) >>> >> return (error); >>> >> if (linux_to_bsd_v4l2_format(&l_vformat, &vformat) != >>> >> 0) >>> >> @@ -3420,7 +3410,7 @@ linux_ioctl_v4l2(struct thread *td, struct >>> >> linux_ioctl >>> >> return (error); >>> >> linux_to_bsd_v4l2_standard(&l_vstd, &vstd); >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error) >>> >> return (error); >>> >> error = fo_ioctl(fp, VIDIOC_ENUMSTD, (caddr_t)&vstd, >>> >> @@ -3444,7 +3434,7 @@ linux_ioctl_v4l2(struct thread *td, struct >>> >> linux_ioctl >>> >> if (error != 0) >>> >> return (error); >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> error = fo_ioctl(fp, VIDIOC_ENUMINPUT, (caddr_t)&vinp, >>> >> @@ -3465,7 +3455,7 @@ linux_ioctl_v4l2(struct thread *td, struct >>> >> linux_ioctl >>> >> if (error) >>> >> return (error); >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error) >>> >> return (error); >>> >> linux_to_bsd_v4l2_buffer(&l_vbuf, &vbuf); >>> >> @@ -3640,7 +3630,6 @@ linux_ioctl_fbsd_usb(struct thread *td, struct >>> >> linux_i >>> >> static int >>> >> linux_ioctl_evdev(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> clockid_t clock; >>> >> int error; >>> >> @@ -3668,7 +3657,7 @@ linux_ioctl_evdev(struct thread *td, struct >>> >> linux_ioct >>> >> return (error); >>> >> >>> >> error = fget(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_IOCTL), &fp); >>> >> + &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> >>> >> @@ -3694,7 +3683,6 @@ linux_ioctl_evdev(struct thread *td, struct >>> >> linux_ioct >>> >> int >>> >> linux_ioctl(struct thread *td, struct linux_ioctl_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *fp; >>> >> struct handler_element *he; >>> >> int error, cmd; >>> >> @@ -3705,7 +3693,7 @@ linux_ioctl(struct thread *td, struct >>> >> linux_ioctl_args >>> >> (unsigned long)args->cmd); >>> >> #endif >>> >> >>> >> - error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), >>> >> &fp); >>> >> + error = fget(td, args->fd, &cap_ioctl_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> if ((fp->f_flag & (FREAD|FWRITE)) == 0) { >>> >> >>> >> Modified: head/sys/compat/linux/linux_mmap.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/compat/linux/linux_mmap.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/compat/linux/linux_mmap.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -72,7 +72,6 @@ linux_mmap_common(struct thread *td, uintptr_t addr, >>> >> s >>> >> int bsd_flags, error; >>> >> struct file *fp; >>> >> >>> >> - cap_rights_t rights; >>> >> LINUX_CTR6(mmap2, "0x%lx, %ld, %ld, 0x%08lx, %ld, 0x%lx", >>> >> addr, len, prot, flags, fd, pos); >>> >> >>> >> @@ -126,7 +125,7 @@ linux_mmap_common(struct thread *td, uintptr_t >>> >> addr, s >>> >> * protection options specified. >>> >> */ >>> >> >>> >> - error = fget(td, fd, cap_rights_init(&rights, >>> >> CAP_MMAP), >>> >> &fp); >>> >> + error = fget(td, fd, &cap_mmap_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> if (fp->f_type != DTYPE_VNODE && fp->f_type != >>> >> DTYPE_DEV) >>> >> { >>> >> >>> >> Modified: head/sys/compat/linux/linux_socket.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/compat/linux/linux_socket.c Wed May 9 18:41:04 >>> >> 2018 >>> >> (r333424) >>> >> +++ head/sys/compat/linux/linux_socket.c Wed May 9 18:47:24 >>> >> 2018 >>> >> (r333425) >>> >> @@ -766,7 +766,6 @@ linux_bind(struct thread *td, struct >>> >> linux_bind_args * >>> >> int >>> >> linux_connect(struct thread *td, struct linux_connect_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct socket *so; >>> >> struct sockaddr *sa; >>> >> struct file *fp; >>> >> @@ -788,7 +787,7 @@ linux_connect(struct thread *td, struct >>> >> linux_connect_ >>> >> * when on a non-blocking socket. Instead it returns the >>> >> * error getsockopt(SOL_SOCKET, SO_ERROR) would return on BSD. >>> >> */ >>> >> - error = getsock_cap(td, args->s, cap_rights_init(&rights, >>> >> CAP_CONNECT), >>> >> + error = getsock_cap(td, args->s, &cap_connect_rights, >>> >> &fp, &fflag, NULL); >>> >> if (error != 0) >>> >> return (error); >>> >> @@ -824,7 +823,6 @@ linux_accept_common(struct thread *td, int s, >>> >> l_uintpt >>> >> socklen_t * __restrict anamelen; >>> >> int flags; >>> >> } */ bsd_args; >>> >> - cap_rights_t rights; >>> >> struct socket *so; >>> >> struct file *fp; >>> >> int error, error1; >>> >> @@ -842,8 +840,7 @@ linux_accept_common(struct thread *td, int s, >>> >> l_uintpt >>> >> if (error == EFAULT && namelen != sizeof(struct >>> >> sockaddr_in)) >>> >> return (EINVAL); >>> >> if (error == EINVAL) { >>> >> - error1 = getsock_cap(td, s, >>> >> - cap_rights_init(&rights, CAP_ACCEPT), &fp, >>> >> NULL, NULL); >>> >> + error1 = getsock_cap(td, s, &cap_accept_rights, >>> >> &fp, NULL, NULL); >>> >> if (error1 != 0) >>> >> return (error1); >>> >> so = fp->f_data; >>> >> >>> >> Modified: head/sys/compat/linux/linux_stats.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/compat/linux/linux_stats.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/compat/linux/linux_stats.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -103,14 +103,13 @@ translate_fd_major_minor(struct thread *td, int >>> >> fd, >>> >> st >>> >> { >>> >> struct file *fp; >>> >> struct vnode *vp; >>> >> - cap_rights_t rights; >>> >> int major, minor; >>> >> >>> >> /* >>> >> * No capability rights required here. >>> >> */ >>> >> if ((!S_ISCHR(buf->st_mode) && !S_ISBLK(buf->st_mode)) || >>> >> - fget(td, fd, cap_rights_init(&rights), &fp) != 0) >>> >> + fget(td, fd, &cap_no_rights, &fp) != 0) >>> >> return; >>> >> vp = fp->f_vnode; >>> >> if (vp != NULL && vp->v_rdev != NULL && >>> >> @@ -680,12 +679,11 @@ linux_newfstatat(struct thread *td, struct >>> >> linux_newfs >>> >> int >>> >> linux_syncfs(struct thread *td, struct linux_syncfs_args *args) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct mount *mp; >>> >> struct vnode *vp; >>> >> int error, save; >>> >> >>> >> - error = fgetvp(td, args->fd, cap_rights_init(&rights, >>> >> CAP_FSYNC), >>> >> &vp); >>> >> + error = fgetvp(td, args->fd, &cap_fsync_rights, &vp); >>> >> if (error != 0) >>> >> /* >>> >> * Linux syncfs() returns only EBADF, however fgetvp() >>> >> >>> >> Modified: head/sys/compat/linuxkpi/common/include/linux/file.h >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/compat/linuxkpi/common/include/linux/file.h Wed May >>> >> 9 >>> >> 18:41:04 2018 (r333424) >>> >> +++ head/sys/compat/linuxkpi/common/include/linux/file.h Wed May >>> >> 9 >>> >> 18:47:24 2018 (r333425) >>> >> @@ -50,12 +50,11 @@ extern struct fileops linuxfileops; >>> >> static inline struct linux_file * >>> >> linux_fget(unsigned int fd) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *file; >>> >> >>> >> /* lookup file pointer by file descriptor index */ >>> >> if (fget_unlocked(curthread->td_proc->p_fd, fd, >>> >> - cap_rights_init(&rights), &file, NULL) != 0) >>> >> + &cap_no_rights, &file, NULL) != 0) >>> >> return (NULL); >>> >> >>> >> /* check if file handle really belongs to us */ >>> >> @@ -88,11 +87,10 @@ file_count(struct linux_file *filp) >>> >> static inline void >>> >> put_unused_fd(unsigned int fd) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *file; >>> >> >>> >> if (fget_unlocked(curthread->td_proc->p_fd, fd, >>> >> - cap_rights_init(&rights), &file, NULL) != 0) { >>> >> + &cap_no_rights, &file, NULL) != 0) { >>> >> return; >>> >> } >>> >> /* >>> >> @@ -109,11 +107,10 @@ put_unused_fd(unsigned int fd) >>> >> static inline void >>> >> fd_install(unsigned int fd, struct linux_file *filp) >>> >> { >>> >> - cap_rights_t rights; >>> >> struct file *file; >>> >> >>> >> if (fget_unlocked(curthread->td_proc->p_fd, fd, >>> >> - cap_rights_init(&rights), &file, NULL) != 0) { >>> >> + &cap_no_rights, &file, NULL) != 0) { >>> >> filp->_file = NULL; >>> >> } else { >>> >> filp->_file = file; >>> >> >>> >> Modified: head/sys/dev/filemon/filemon.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/dev/filemon/filemon.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/dev/filemon/filemon.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -361,7 +361,6 @@ filemon_ioctl(struct cdev *dev, u_long cmd, caddr_t >>> >> da >>> >> int error = 0; >>> >> struct filemon *filemon; >>> >> struct proc *p; >>> >> - cap_rights_t rights; >>> >> >>> >> if ((error = devfs_get_cdevpriv((void **) &filemon)) != 0) >>> >> return (error); >>> >> @@ -377,7 +376,7 @@ filemon_ioctl(struct cdev *dev, u_long cmd, caddr_t >>> >> da >>> >> } >>> >> >>> >> error = fget_write(td, *(int *)data, >>> >> - cap_rights_init(&rights, CAP_PWRITE), >>> >> + &cap_pwrite_rights, >>> >> &filemon->fp); >>> >> if (error == 0) >>> >> /* Write the file header. */ >>> >> >>> >> Modified: head/sys/dev/hwpmc/hwpmc_logging.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/dev/hwpmc/hwpmc_logging.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/dev/hwpmc/hwpmc_logging.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -638,7 +638,6 @@ int >>> >> pmclog_configure_log(struct pmc_mdep *md, struct pmc_owner *po, int >>> >> logfd) >>> >> { >>> >> struct proc *p; >>> >> - cap_rights_t rights; >>> >> int error; >>> >> >>> >> sx_assert(&pmc_sx, SA_XLOCKED); >>> >> @@ -655,8 +654,7 @@ pmclog_configure_log(struct pmc_mdep *md, struct >>> >> pmc_o >>> >> po->po_file)); >>> >> >>> >> /* get a reference to the file state */ >>> >> - error = fget_write(curthread, logfd, >>> >> - cap_rights_init(&rights, CAP_WRITE), &po->po_file); >>> >> + error = fget_write(curthread, logfd, &cap_write_rights, >>> >> &po->po_file); >>> >> if (error) >>> >> goto error; >>> >> >>> >> >>> >> Modified: head/sys/fs/fdescfs/fdesc_vnops.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/fs/fdescfs/fdesc_vnops.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/fs/fdescfs/fdesc_vnops.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -286,7 +286,6 @@ fdesc_lookup(struct vop_lookup_args *ap) >>> >> struct thread *td = cnp->cn_thread; >>> >> struct file *fp; >>> >> struct fdesc_get_ino_args arg; >>> >> - cap_rights_t rights; >>> >> int nlen = cnp->cn_namelen; >>> >> u_int fd, fd1; >>> >> int error; >>> >> @@ -331,7 +330,7 @@ fdesc_lookup(struct vop_lookup_args *ap) >>> >> /* >>> >> * No rights to check since 'fp' isn't actually used. >>> >> */ >>> >> - if ((error = fget(td, fd, cap_rights_init(&rights), &fp)) != 0) >>> >> + if ((error = fget(td, fd, &cap_no_rights, &fp)) != 0) >>> >> goto bad; >>> >> >>> >> /* Check if we're looking up ourselves. */ >>> >> @@ -613,7 +612,6 @@ static int >>> >> fdesc_readlink(struct vop_readlink_args *va) >>> >> { >>> >> struct vnode *vp, *vn; >>> >> - cap_rights_t rights; >>> >> struct thread *td; >>> >> struct uio *uio; >>> >> struct file *fp; >>> >> @@ -631,7 +629,7 @@ fdesc_readlink(struct vop_readlink_args *va) >>> >> VOP_UNLOCK(vn, 0); >>> >> >>> >> td = curthread; >>> >> - error = fget_cap(td, fd_fd, cap_rights_init(&rights), &fp, >>> >> NULL); >>> >> + error = fget_cap(td, fd_fd, &cap_no_rights, &fp, NULL); >>> >> if (error != 0) >>> >> goto out; >>> >> >>> >> >>> >> Modified: head/sys/fs/fuse/fuse_vfsops.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/fs/fuse/fuse_vfsops.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/fs/fuse/fuse_vfsops.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -222,7 +222,6 @@ fuse_vfsop_mount(struct mount *mp) >>> >> struct file *fp, *fptmp; >>> >> char *fspec, *subtype; >>> >> struct vfsoptlist *opts; >>> >> - cap_rights_t rights; >>> >> >>> >> subtype = NULL; >>> >> max_read_set = 0; >>> >> @@ -292,7 +291,7 @@ fuse_vfsop_mount(struct mount *mp) >>> >> >>> >> FS_DEBUG2G("mntopts 0x%jx\n", (uintmax_t)mntopts); >>> >> >>> >> - err = fget(td, fd, cap_rights_init(&rights, CAP_READ), &fp); >>> >> + err = fget(td, fd, &cap_read_rights, &fp); >>> >> if (err != 0) { >>> >> FS_DEBUG("invalid or not opened device: data=%p\n", >>> >> data); >>> >> goto out; >>> >> >>> >> Modified: head/sys/kern/kern_descrip.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/kern/kern_descrip.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/kern/kern_descrip.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -490,7 +490,6 @@ kern_fcntl(struct thread *td, int fd, int cmd, >>> >> intptr_ >>> >> struct filedescent *fde; >>> >> struct proc *p; >>> >> struct vnode *vp; >>> >> - cap_rights_t rights; >>> >> int error, flg, tmp; >>> >> uint64_t bsize; >>> >> off_t foffset; >>> >> @@ -548,8 +547,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, >>> >> intptr_ >>> >> break; >>> >> >>> >> case F_GETFL: >>> >> - error = fget_fcntl(td, fd, >>> >> - cap_rights_init(&rights, CAP_FCNTL), F_GETFL, &fp); >>> >> + error = fget_fcntl(td, fd, &cap_fcntl_rights, F_GETFL, >>> >> &fp); >>> >> if (error != 0) >>> >> break; >>> >> td->td_retval[0] = OFLAGS(fp->f_flag); >>> >> @@ -557,8 +555,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, >>> >> intptr_ >>> >> break; >>> >> >>> >> case F_SETFL: >>> >> - error = fget_fcntl(td, fd, >>> >> - cap_rights_init(&rights, CAP_FCNTL), F_SETFL, &fp); >>> >> + error = fget_fcntl(td, fd, &cap_fcntl_rights, F_SETFL, >>> >> &fp); >>> >> if (error != 0) >>> >> break; >>> >> do { >>> >> @@ -585,8 +582,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, >>> >> intptr_ >>> >> break; >>> >> >>> >> case F_GETOWN: >>> >> - error = fget_fcntl(td, fd, >>> >> - cap_rights_init(&rights, CAP_FCNTL), F_GETOWN, >>> >> &fp); >>> >> + error = fget_fcntl(td, fd, &cap_fcntl_rights, F_GETOWN, >>> >> &fp); >>> >> if (error != 0) >>> >> break; >>> >> error = fo_ioctl(fp, FIOGETOWN, &tmp, td->td_ucred, >>> >> td); >>> >> @@ -596,8 +592,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, >>> >> intptr_ >>> >> break; >>> >> >>> >> case F_SETOWN: >>> >> - error = fget_fcntl(td, fd, >>> >> - cap_rights_init(&rights, CAP_FCNTL), F_SETOWN, >>> >> &fp); >>> >> + error = fget_fcntl(td, fd, &cap_fcntl_rights, F_SETOWN, >>> >> &fp); >>> >> if (error != 0) >>> >> break; >>> >> tmp = arg; >>> >> @@ -618,8 +613,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, >>> >> intptr_ >>> >> >>> >> case F_SETLK: >>> >> do_setlk: >>> >> - cap_rights_init(&rights, CAP_FLOCK); >>> >> - error = fget_unlocked(fdp, fd, &rights, &fp, NULL); >>> >> + error = fget_unlocked(fdp, fd, &cap_flock_rights, &fp, >>> >> NULL); >>> >> if (error != 0) >>> >> break; >>> >> if (fp->f_type != DTYPE_VNODE) { >>> >> @@ -711,7 +705,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, >>> >> intptr_ >>> >> * that the closing thread was a bit slower and that >>> >> the >>> >> * advisory lock succeeded before the close. >>> >> */ >>> >> - error = fget_unlocked(fdp, fd, &rights, &fp2, NULL); >>> >> + error = fget_unlocked(fdp, fd, &cap_no_rights, &fp2, >>> >> NULL); >>> >> if (error != 0) { >>> >> fdrop(fp, td); >>> >> break; >>> >> @@ -729,8 +723,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, >>> >> intptr_ >>> >> break; >>> >> >>> >> case F_GETLK: >>> >> - error = fget_unlocked(fdp, fd, >>> >> - cap_rights_init(&rights, CAP_FLOCK), &fp, NULL); >>> >> + error = fget_unlocked(fdp, fd, &cap_flock_rights, &fp, >>> >> NULL); >>> >> if (error != 0) >>> >> break; >>> >> if (fp->f_type != DTYPE_VNODE) { >>> >> @@ -767,8 +760,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, >>> >> intptr_ >>> >> arg = arg ? 128 * 1024: 0; >>> >> /* FALLTHROUGH */ >>> >> case F_READAHEAD: >>> >> - error = fget_unlocked(fdp, fd, >>> >> - cap_rights_init(&rights), &fp, NULL); >>> >> + error = fget_unlocked(fdp, fd, &cap_no_rights, &fp, >>> >> NULL); >>> >> if (error != 0) >>> >> break; >>> >> if (fp->f_type != DTYPE_VNODE) { >>> >> @@ -1363,12 +1355,11 @@ int >>> >> kern_fstat(struct thread *td, int fd, struct stat *sbp) >>> >> { >>> >> struct file *fp; >>> >> - cap_rights_t rights; >>> >> int error; >>> >> >>> >> AUDIT_ARG_FD(fd); >>> >> >>> >> - error = fget(td, fd, cap_rights_init(&rights, CAP_FSTAT), &fp); >>> >> + error = fget(td, fd, &cap_fstat_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> >>> >> @@ -1445,10 +1436,9 @@ kern_fpathconf(struct thread *td, int fd, int >>> >> name, >>> >> lo >>> >> { >>> >> struct file *fp; >>> >> struct vnode *vp; >>> >> - cap_rights_t rights; >>> >> int error; >>> >> >>> >> - error = fget(td, fd, cap_rights_init(&rights, CAP_FPATHCONF), >>> >> &fp); >>> >> + error = fget(td, fd, &cap_fpathconf_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> >>> >> @@ -2982,10 +2972,9 @@ sys_flock(struct thread *td, struct flock_args >>> >> *uap) >>> >> struct file *fp; >>> >> struct vnode *vp; >>> >> struct flock lf; >>> >> - cap_rights_t rights; >>> >> int error; >>> >> >>> >> - error = fget(td, uap->fd, cap_rights_init(&rights, CAP_FLOCK), >>> >> &fp); >>> >> + error = fget(td, uap->fd, &cap_flock_rights, &fp); >>> >> if (error != 0) >>> >> return (error); >>> >> if (fp->f_type != DTYPE_VNODE) { >>> >> @@ -3633,7 +3622,7 @@ kern_proc_filedesc_out(struct proc *p, struct >>> >> sbuf >>> >> *s >>> >> #ifdef CAPABILITIES >>> >> rights = *cap_rights(fdp, i); >>> >> #else /* !CAPABILITIES */ >>> >> - cap_rights_init(&rights); >>> >> + rights = cap_no_rights; >>> >> #endif >>> >> /* >>> >> * Create sysctl entry. It is OK to drop the filedesc >>> >> >>> >> Modified: head/sys/kern/kern_event.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/kern/kern_event.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/kern/kern_event.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -1286,7 +1286,6 @@ kqueue_register(struct kqueue *kq, struct kevent >>> >> *kev, >>> >> struct file *fp; >>> >> struct knote *kn, *tkn; >>> >> struct knlist *knl; >>> >> - cap_rights_t rights; >>> >> int error, filt, event; >>> >> int haskqglobal, filedesc_unlock; >>> >> >>> >> @@ -1322,8 +1321,7 @@ findkn: >>> >> if (kev->ident > INT_MAX) >>> >> error = EBADF; >>> >> else >>> >> - error = fget(td, kev->ident, >>> >> - cap_rights_init(&rights, CAP_EVENT), &fp); >>> >> + error = fget(td, kev->ident, &cap_event_rights, >>> >> &fp); >>> >> if (error) >>> >> goto done; >>> >> >>> >> >>> >> Modified: head/sys/kern/kern_exec.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/kern/kern_exec.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/kern/kern_exec.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -374,7 +374,6 @@ do_execve(struct thread *td, struct image_args >>> >> *args, >>> >> struct ucred *tracecred = NULL; >>> >> #endif >>> >> struct vnode *oldtextvp = NULL, *newtextvp; >>> >> - cap_rights_t rights; >>> >> int credential_changing; >>> >> int textset; >>> >> #ifdef MAC >>> >> @@ -455,8 +454,7 @@ interpret: >>> >> /* >>> >> * Descriptors opened only with O_EXEC or O_RDONLY are >>> >> allowed. >>> >> */ >>> >> - error = fgetvp_exec(td, args->fd, >>> >> - cap_rights_init(&rights, CAP_FEXECVE), &newtextvp); >>> >> + error = fgetvp_exec(td, args->fd, &cap_fexecve_rights, >>> >> &newtextvp); >>> >> if (error) >>> >> goto exec_fail; >>> >> vn_lock(newtextvp, LK_EXCLUSIVE | LK_RETRY); >>> >> >>> >> Modified: head/sys/kern/kern_sendfile.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/kern/kern_sendfile.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/kern/kern_sendfile.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -511,7 +511,6 @@ static int >>> >> sendfile_getsock(struct thread *td, int s, struct file **sock_fp, >>> >> struct socket **so) >>> >> { >>> >> - cap_rights_t rights; >>> >> int error; >>> >> >>> >> *sock_fp = NULL; >>> >> @@ -520,7 +519,7 @@ sendfile_getsock(struct thread *td, int s, struct >>> >> file >>> >> /* >>> >> * The socket must be a stream socket and connected. >>> >> */ >>> >> - error = getsock_cap(td, s, cap_rights_init(&rights, CAP_SEND), >>> >> + error = getsock_cap(td, s, &cap_send_rights, >>> >> sock_fp, NULL, NULL); >>> >> if (error != 0) >>> >> return (error); >>> >> @@ -949,7 +948,6 @@ sendfile(struct thread *td, struct sendfile_args >>> >> *uap, >>> >> struct sf_hdtr hdtr; >>> >> struct uio *hdr_uio, *trl_uio; >>> >> struct file *fp; >>> >> - cap_rights_t rights; >>> >> off_t sbytes; >>> >> int error; >>> >> >>> >> @@ -1000,10 +998,8 @@ sendfile(struct thread *td, struct sendfile_args >>> >> *uap, >>> >> * sendfile(2) can start at any offset within a file so we >>> >> require >>> >> * CAP_READ+CAP_SEEK = CAP_PREAD. >>> >> */ >>> >> - if ((error = fget_read(td, uap->fd, >>> >> - cap_rights_init(&rights, CAP_PREAD), &fp)) != 0) { >>> >> + if ((error = fget_read(td, uap->fd, &cap_pread_rights, &fp)) != >>> >> 0) >>> >> goto out; >>> >> - } >>> >> >>> >> error = fo_sendfile(fp, uap->s, hdr_uio, trl_uio, uap->offset, >>> >> uap->nbytes, &sbytes, uap->flags, td); >>> >> >>> >> Modified: head/sys/kern/kern_sig.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/kern/kern_sig.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/kern/kern_sig.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -1789,7 +1789,6 @@ int >>> >> sys_pdkill(struct thread *td, struct pdkill_args *uap) >>> >> { >>> >> struct proc *p; >>> >> - cap_rights_t rights; >>> >> int error; >>> >> >>> >> AUDIT_ARG_SIGNUM(uap->signum); >>> >> @@ -1797,8 +1796,7 @@ sys_pdkill(struct thread *td, struct pdkill_args >>> >> *uap) >>> >> if ((u_int)uap->signum > _SIG_MAXSIG) >>> >> return (EINVAL); >>> >> >>> >> - error = procdesc_find(td, uap->fd, >>> >> - cap_rights_init(&rights, CAP_PDKILL), &p); >>> >> + error = procdesc_find(td, uap->fd, &cap_pdkill_rights, &p); >>> >> if (error) >>> >> return (error); >>> >> AUDIT_ARG_PROCESS(p); >>> >> >>> >> Modified: head/sys/kern/subr_capability.c >>> >> >>> >> >>> >> ============================================================================== >>> >> --- head/sys/kern/subr_capability.c Wed May 9 18:41:04 2018 >>> >> (r333424) >>> >> +++ head/sys/kern/subr_capability.c Wed May 9 18:47:24 2018 >>> >> (r333425) >>> >> @@ -41,7 +41,7 @@ __FBSDID("$FreeBSD$"); >>> >> >>> >> #ifdef _KERNEL >>> >> #include <sys/systm.h> >>> >> - >>> >> +#include <sys/kernel.h> >>> >> #include <machine/stdarg.h> >>> >> #else /* !_KERNEL */ >>> >> #include <assert.h> >>> >> @@ -53,6 +53,38 @@ __FBSDID("$FreeBSD$"); >>> >> >>> >> #ifdef _KERNEL >>> >> #define assert(exp) KASSERT((exp), ("%s:%u", __func__, >>> >> __LINE__)) >>> >> + >>> >> +CAP_RIGHTS_DEFINE1(cap_accept_rights, CAP_ACCEPT); >>> >> +CAP_RIGHTS_DEFINE1(cap_bind_rights, CAP_BIND); >>> >> +CAP_RIGHTS_DEFINE1(cap_connect_rights, CAP_CONNECT); >>> >> +CAP_RIGHTS_DEFINE1(cap_event_rights, CAP_EVENT); >>> >> +CAP_RIGHTS_DEFINE1(cap_fchdir_rights, CAP_FCHDIR); >>> >> +CAP_RIGHTS_DEFINE1(cap_fcntl_rights, CAP_FCNTL); >>> >> +CAP_RIGHTS_DEFINE1(cap_fexecve_rights, CAP_FEXECVE); >>> >> +CAP_RIGHTS_DEFINE1(cap_flock_rights, CAP_FLOCK); >>> >> +CAP_RIGHTS_DEFINE1(cap_fpathconf_rights, CAP_FPATHCONF); >>> >> +CAP_RIGHTS_DEFINE1(cap_fstat_rights, CAP_FSTAT); >>> >> +CAP_RIGHTS_DEFINE1(cap_fsync_rights, CAP_FSYNC); >>> >> +CAP_RIGHTS_DEFINE1(cap_ftruncate_rights, CAP_FTRUNCATE); >>> >> +CAP_RIGHTS_DEFINE1(cap_getpeername_rights, CAP_GETPEERNAME); >>> >> +CAP_RIGHTS_DEFINE1(cap_getsockname_rights, CAP_GETSOCKNAME); >>> >> +CAP_RIGHTS_DEFINE1(cap_getsockopt_rights, CAP_GETSOCKOPT); >>> >> +CAP_RIGHTS_DEFINE1(cap_ioctl_rights, CAP_IOCTL); >>> >> +CAP_RIGHTS_DEFINE1(cap_listen_rights, CAP_LISTEN); >>> >> +CAP_RIGHTS_DEFINE1(cap_mmap_rights, CAP_MMAP); >>> >> +CAP_RIGHTS_DEFINE1(cap_pdgetpid_rights, CAP_PDGETPID); >>> >> +CAP_RIGHTS_DEFINE1(cap_pdkill_rights, CAP_PDKILL); >>> >> +CAP_RIGHTS_DEFINE1(cap_pread_rights, CAP_PREAD); >>> >> +CAP_RIGHTS_DEFINE1(cap_pwrite_rights, CAP_PWRITE); >>> >> +CAP_RIGHTS_DEFINE1(cap_read_rights, CAP_READ); >>> >> +CAP_RIGHTS_DEFINE1(cap_recv_rights, CAP_RECV); >>> >> +CAP_RIGHTS_DEFINE1(cap_send_rights, CAP_SEND); >>> >> +CAP_RIGHTS_DEFINE1(cap_setsockopt_rights, CAP_SETSOCKOPT); >>> >> +CAP_RIGHTS_DEFINE1(cap_shutdown_rights, CAP_SHUTDOWN); >>> >> +CAP_RIGHTS_DEFINE1(cap_write_rights, CAP_WRITE); >>> >> + >>> >> +__read_mostly cap_rights_t cap_no_rights; >>> >> +CAP_RIGHTS_SYSINIT0(cap_no_rights, cap_no_rights); >>> >> #endif >>> >> >>> >> #define CAPARSIZE_MIN (CAP_RIGHTS_VERSION_00 + 2) >>> >> >>> >> *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** >>> >> >>> > >>> >> >> >> >> -- >> Mateusz Guzik <mjguzik gmail.com>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAPrugNqEvYvdveCC94SLGg9PC12H0zx%2BgM1Gefsj0jgFbGcXJA>