Module Name: src Committed By: christos Date: Mon Nov 9 16:52:09 UTC 2015
Modified Files: src/sys/dev: vnd.c Log Message: Simplify ioctl handling a little. To generate a diff of this commit: cvs rdiff -u -r1.248 -r1.249 src/sys/dev/vnd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/vnd.c diff -u src/sys/dev/vnd.c:1.248 src/sys/dev/vnd.c:1.249 --- src/sys/dev/vnd.c:1.248 Thu Aug 20 10:40:17 2015 +++ src/sys/dev/vnd.c Mon Nov 9 11:52:09 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: vnd.c,v 1.248 2015/08/20 14:40:17 christos Exp $ */ +/* $NetBSD: vnd.c,v 1.249 2015/11/09 16:52:09 christos Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc. @@ -91,13 +91,14 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.248 2015/08/20 14:40:17 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.249 2015/11/09 16:52:09 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_vnd.h" #include "opt_compat_netbsd.h" #endif +#define DEBUG #include <sys/param.h> #include <sys/systm.h> #include <sys/namei.h> @@ -139,7 +140,7 @@ int dovndcluster = 1; #define VDB_INIT 0x02 #define VDB_IO 0x04 #define VDB_LABEL 0x08 -int vnddebug = 0x00; +int vnddebug = 0xff; #endif #define vndunit(x) DISKUNIT(x) @@ -1049,7 +1050,7 @@ vnddoclear(struct vnd_softc *vnd, int pm vndclear(vnd, minor); #ifdef DEBUG if (vnddebug & VDB_INIT) - printf("vndioctl: CLRed\n"); + printf("%s: CLRed\n", __func__); #endif /* Destroy the xfer and buffer pools. */ @@ -1061,6 +1062,30 @@ vnddoclear(struct vnd_softc *vnd, int pm return 0; } +static int +vndioctl_get(struct lwp *l, void *data, int unit, struct vattr *va) +{ + int error; + + KASSERT(l); +#ifdef notyet + /* Current userland code does not handle this */ + if (*(int *)data >= vnd_cd.cd_ndevs) + return ENXIO; +#endif + + switch (error = vnd_cget(l, unit, (int *)data, va)) { + case -1: + /* unused is not an error */ + memset(&va, 0, sizeof(va)); + /*FALLTHROUGH*/ + case 0: + return 0; + default: + return error; + } +} + /* ARGSUSED */ static int vndioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) @@ -1084,15 +1109,46 @@ vndioctl(dev_t dev, u_long cmd, void *da printf("vndioctl(0x%"PRIx64", 0x%lx, %p, 0x%x, %p): unit %d\n", dev, cmd, data, flag, l->l_proc, unit); #endif - vnd = device_lookup_private(&vnd_cd, unit); - if (vnd == NULL && + /* Do the get's first; they don't need initialization or verification */ + switch (cmd) { #ifdef COMPAT_30 - cmd != VNDIOCGET30 && + case VNDIOCGET30: { + if ((error = vndioctl_get(l, data, unit, &vattr)) != 0) + return error; + + struct vnd_user30 *vnu = data; + vnu->vnu_dev = vattr.va_fsid; + vnu->vnu_ino = vattr.va_fileid; + return 0; + } #endif #ifdef COMPAT_50 - cmd != VNDIOCGET50 && + case VNDIOCGET50: { + if ((error = vndioctl_get(l, data, unit, &vattr)) != 0) + return error; + + struct vnd_user50 *vnu = data; + vnu->vnu_dev = vattr.va_fsid; + vnu->vnu_ino = vattr.va_fileid; + return 0; + } #endif - cmd != VNDIOCGET) + + case VNDIOCGET: { + if ((error = vndioctl_get(l, data, unit, &vattr)) != 0) + return error; + + struct vnd_user *vnu = data; + vnu->vnu_dev = vattr.va_fsid; + vnu->vnu_ino = vattr.va_fileid; + return 0; + } + default: + break; + } + + vnd = device_lookup_private(&vnd_cd, unit); + if (vnd == NULL) return ENXIO; vio = (struct vnd_ioctl *)data; @@ -1435,72 +1491,6 @@ unlock_and_exit: break; -#ifdef COMPAT_30 - case VNDIOCGET30: { - struct vnd_user30 *vnu; - struct vattr va; - vnu = (struct vnd_user30 *)data; - KASSERT(l); - switch (error = vnd_cget(l, unit, &vnu->vnu_unit, &va)) { - case 0: - vnu->vnu_dev = va.va_fsid; - vnu->vnu_ino = va.va_fileid; - break; - case -1: - /* unused is not an error */ - vnu->vnu_dev = 0; - vnu->vnu_ino = 0; - break; - default: - return error; - } - break; - } -#endif - -#ifdef COMPAT_50 - case VNDIOCGET50: { - struct vnd_user50 *vnu; - struct vattr va; - vnu = (struct vnd_user50 *)data; - KASSERT(l); - switch (error = vnd_cget(l, unit, &vnu->vnu_unit, &va)) { - case 0: - vnu->vnu_dev = va.va_fsid; - vnu->vnu_ino = va.va_fileid; - break; - case -1: - /* unused is not an error */ - vnu->vnu_dev = 0; - vnu->vnu_ino = 0; - break; - default: - return error; - } - break; - } -#endif - - case VNDIOCGET: { - struct vnd_user *vnu; - struct vattr va; - vnu = (struct vnd_user *)data; - KASSERT(l); - switch (error = vnd_cget(l, unit, &vnu->vnu_unit, &va)) { - case 0: - vnu->vnu_dev = va.va_fsid; - vnu->vnu_ino = va.va_fileid; - break; - case -1: - /* unused is not an error */ - vnu->vnu_dev = 0; - vnu->vnu_ino = 0; - break; - default: - return error; - } - break; - } case DIOCWDINFO: case DIOCSDINFO: