From 53d745bc7c69c92531f7ef4c29ed5cb784cf0f91 Mon Sep 17 00:00:00 2001 From: Dima Dorfman Date: Thu, 20 Dec 2001 06:38:21 +0000 Subject: [PATCH] Actually make use of the md_version field of 'struct mdio'. In order not to needlessly break compatibility, decrement MDIOVERSION to 0. Approved by: phk --- sbin/mdconfig/mdconfig.c | 2 ++ sys/dev/md/md.c | 13 +++++++++++++ sys/sys/mdioctl.h | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/sbin/mdconfig/mdconfig.c b/sbin/mdconfig/mdconfig.c index b5367621f715..8a6019f008ce 100644 --- a/sbin/mdconfig/mdconfig.c +++ b/sbin/mdconfig/mdconfig.c @@ -161,6 +161,7 @@ main(int argc, char **argv) usage(); } } + mdio.md_version = MDIOVERSION; mdmaybeload(); fd = open("/dev/" MDCTL_NAME, O_RDWR, 0); @@ -253,6 +254,7 @@ int query(const int fd, const int unit) { + mdio.md_version = MDIOVERSION; mdio.md_unit = unit; if (ioctl(fd, MDIOCQUERY, &mdio) < 0) diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index bb4b7f0765e4..ef2273160203 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -831,9 +831,18 @@ mdctlioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) printf("mdctlioctl(%s %lx %p %x %p)\n", devtoname(dev), cmd, addr, flags, td); + /* + * We assert the version number in the individual ioctl + * handlers instead of out here because (a) it is possible we + * may add another ioctl in the future which doesn't read an + * mdio, and (b) the correct return value for an unknown ioctl + * is ENOIOCTL, not EINVAL. + */ mdio = (struct md_ioctl *)addr; switch (cmd) { case MDIOCATTACH: + if (mdio->md_version != MDIOVERSION) + return (EINVAL); switch (mdio->md_type) { case MD_MALLOC: return (mdcreate_malloc(mdio)); @@ -847,11 +856,15 @@ mdctlioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) return (EINVAL); } case MDIOCDETACH: + if (mdio->md_version != MDIOVERSION) + return (EINVAL); if (mdio->md_file != NULL || mdio->md_size != 0 || mdio->md_options != 0) return (EINVAL); return (mddetach(mdio->md_unit, td)); case MDIOCQUERY: + if (mdio->md_version != MDIOVERSION) + return (EINVAL); sc = mdfind(mdio->md_unit); if (sc == NULL) return (ENOENT); diff --git a/sys/sys/mdioctl.h b/sys/sys/mdioctl.h index 6b16fde61f14..c311ccaaab36 100644 --- a/sys/sys/mdioctl.h +++ b/sys/sys/mdioctl.h @@ -66,7 +66,7 @@ struct md_ioctl { #define MD_NAME "md" #define MDCTL_NAME "mdctl" -#define MDIOVERSION 1 +#define MDIOVERSION 0 /* * Before you can use a unit, it must be configured with MDIOCSET.