summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordd <dd@FreeBSD.org>2001-12-20 06:38:21 +0000
committerdd <dd@FreeBSD.org>2001-12-20 06:38:21 +0000
commit23c182dfdf48843816cc4f20e488b85364a63cdf (patch)
treebb473f7ecf79394e88144d815f8e6e0527f22ab8
parent13c8600e2d9f57c039042afb0f88c1446be4d61d (diff)
downloadFreeBSD-src-23c182dfdf48843816cc4f20e488b85364a63cdf.zip
FreeBSD-src-23c182dfdf48843816cc4f20e488b85364a63cdf.tar.gz
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
-rw-r--r--sbin/mdconfig/mdconfig.c2
-rw-r--r--sys/dev/md/md.c13
-rw-r--r--sys/sys/mdioctl.h2
3 files changed, 16 insertions, 1 deletions
diff --git a/sbin/mdconfig/mdconfig.c b/sbin/mdconfig/mdconfig.c
index b536762..8a6019f 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 bb4b7f0..ef22731 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 6b16fde..c311cca 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.
OpenPOWER on IntegriCloud