summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2001-01-02 09:42:47 +0000
committerphk <phk@FreeBSD.org>2001-01-02 09:42:47 +0000
commit854305bfac32367ebb9550b239ddef9d75cf37c5 (patch)
tree67c89183ee5450ea9d8b5bfe873a893beb82f19a
parent3e29f9dbecbc22e6559aa92459caf901b962886c (diff)
downloadFreeBSD-src-854305bfac32367ebb9550b239ddef9d75cf37c5.zip
FreeBSD-src-854305bfac32367ebb9550b239ddef9d75cf37c5.tar.gz
Either cvs(1) or I forgot this file in my last commit.
Please see commit log for rev 1.4 of src/sbin/mdconfig/mdconfig.c
-rw-r--r--sys/dev/md/md.c118
1 files changed, 93 insertions, 25 deletions
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index d82b441..f22e269 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -10,6 +10,53 @@
*
*/
+/*
+ * The following functions are based in the vn(4) driver: mdstart_swap(),
+ * mdstart_vnode(), mdcreate_swap(), mdcreate_vnode() and mddestroy(),
+ * and as such under the following copyright:
+ *
+ * Copyright (c) 1988 University of Utah.
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: Utah Hdr: vn.c 1.13 94/04/02
+ *
+ * from: @(#)vn.c 8.6 (Berkeley) 4/1/94
+ * From: src/sys/dev/vn/vn.c,v 1.122 2000/12/16 16:06:03
+ */
+
#include "opt_mfs.h" /* We have adopted some tasks from MFS */
#include "opt_md.h"
@@ -150,7 +197,6 @@ mdopen(dev_t dev, int flag, int fmt, struct proc *p)
dl = &sc->disk.d_label;
bzero(dl, sizeof(*dl));
dl->d_secsize = sc->secsize;
- if (sc->nsect > 1024)
dl->d_nsectors = sc->nsect > 1024 ? 1024 : sc->nsect;
dl->d_ntracks = 1;
dl->d_secpercyl = dl->d_nsectors * dl->d_ntracks;
@@ -512,24 +558,35 @@ mdinit(struct md_s *sc)
sc->dev->si_drv1 = sc;
}
-static void
-mdcreate_preload(u_char *image, unsigned length)
+static int
+mdcreate_preload(struct md_ioctl *mdio)
{
struct md_s *sc;
- sc = mdnew(-1);
- if (sc == NULL)
- return;
+ if (mdio->md_size == 0)
+ return(EINVAL);
+ if (mdio->md_options & ~(MD_AUTOUNIT))
+ return(EINVAL);
+ if (mdio->md_options & MD_AUTOUNIT) {
+ sc = mdnew(-1);
+ if (sc == NULL)
+ return (ENOMEM);
+ mdio->md_unit = sc->unit;
+ } else {
+ sc = mdnew(mdio->md_unit);
+ if (sc == NULL)
+ return (EBUSY);
+ }
sc->type = MD_PRELOAD;
sc->secsize = DEV_BSIZE;
- sc->nsect = length / DEV_BSIZE;
- sc->pl_ptr = image;
- sc->pl_len = length;
- if (sc->unit == 0)
- mdrootready = 1;
+ sc->nsect = mdio->md_size;
+ sc->pl_ptr = (u_char *)mdio->md_base;
+ sc->pl_len = (mdio->md_size << DEV_BSHIFT);
mdinit(sc);
+ return (0);
}
+
static int
mdcreate_malloc(struct md_ioctl *mdio)
{
@@ -633,14 +690,14 @@ mdcreate_vnode(struct md_ioctl *mdio, struct proc *p)
sc->type = MD_VNODE;
flags = FREAD|FWRITE;
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, mdio->md_file, p);
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, mdio->md_file, p);
error = vn_open(&nd, &flags, 0);
if (error) {
if (error != EACCES && error != EPERM && error != EROFS)
return (error);
flags &= ~FWRITE;
sc->flags |= MD_READONLY;
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, mdio->md_file, p);
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, mdio->md_file, p);
error = vn_open(&nd, &flags, 0);
if (error)
return (error);
@@ -758,18 +815,13 @@ mdctlioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
devtoname(dev), cmd, addr, flags, p);
mdio = (struct md_ioctl *)addr;
- if (mdio->md_type != MD_VNODE)
- mdio->md_file[0] = '\0';
switch (cmd) {
case MDIOCATTACH:
- printf("A: u %u t %d n %s s %u o %u\n", mdio->md_unit,
- mdio->md_type, mdio->md_file, mdio->md_size,
- mdio->md_options);
switch (mdio->md_type) {
case MD_MALLOC:
return(mdcreate_malloc(mdio));
case MD_PRELOAD:
- return (EINVAL);
+ return(mdcreate_preload(mdio));
case MD_VNODE:
return(mdcreate_vnode(mdio, p));
case MD_SWAP:
@@ -778,10 +830,7 @@ mdctlioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
return (EINVAL);
}
case MDIOCDETACH:
- printf("D: u %u t %d n %s s %u o %u\n", mdio->md_unit,
- mdio->md_type, mdio->md_file, mdio->md_size,
- mdio->md_options);
- if (*mdio->md_file != '\0')
+ if (mdio->md_file != NULL)
return(EINVAL);
if (mdio->md_size != 0)
return(EINVAL);
@@ -794,6 +843,7 @@ mdctlioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case MD_VNODE:
case MD_SWAP:
case MD_MALLOC:
+ case MD_PRELOAD:
return(mddestroy(sc, mdio, p));
default:
return (EOPNOTSUPP);
@@ -805,6 +855,24 @@ mdctlioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
static void
+md_preloaded(u_char *image, unsigned length)
+{
+ struct md_s *sc;
+
+ sc = mdnew(-1);
+ if (sc == NULL)
+ return;
+ sc->type = MD_PRELOAD;
+ sc->secsize = DEV_BSIZE;
+ sc->nsect = length / DEV_BSIZE;
+ sc->pl_ptr = image;
+ sc->pl_len = length;
+ if (sc->unit == 0)
+ mdrootready = 1;
+ mdinit(sc);
+}
+
+static void
md_drvinit(void *unused)
{
@@ -814,7 +882,7 @@ md_drvinit(void *unused)
unsigned len;
#ifdef MD_ROOT_SIZE
- mdcreate_preload(mfs_root, MD_ROOT_SIZE*1024);
+ md_preloaded(mfs_root, MD_ROOT_SIZE*1024);
#endif
mod = NULL;
while ((mod = preload_search_next_name(mod)) != NULL) {
@@ -832,7 +900,7 @@ md_drvinit(void *unused)
len = *(unsigned *)c;
printf("md%d: Preloaded image <%s> %d bytes at %p\n",
mdunits, name, len, ptr);
- mdcreate_preload(ptr, len);
+ md_preloaded(ptr, len);
}
make_dev(&mdctl_cdevsw, 0xffff00ff, UID_ROOT, GID_WHEEL, 0600, "mdctl");
}
OpenPOWER on IntegriCloud