diff --git a/sbin/mdconfig/mdconfig.8 b/sbin/mdconfig/mdconfig.8 index 6ed7e8afd41b..9226fbef1992 100644 --- a/sbin/mdconfig/mdconfig.8 +++ b/sbin/mdconfig/mdconfig.8 @@ -129,6 +129,11 @@ Enable clustering on this disk. .Xc Enable/Disable compression features to reduce memory usage. .It Xo +.Oo Cm no Oc Ns Cm force +.Xc +Disable/Enable extra sanity checks to prevent the user from doing something +that might adversely affect the system. +.It Xo .Oo Cm no Oc Ns Cm readonly .Xc Enable/Disable readonly mode. diff --git a/sbin/mdconfig/mdconfig.c b/sbin/mdconfig/mdconfig.c index 53d04807936e..3b2d642e7fe7 100644 --- a/sbin/mdconfig/mdconfig.c +++ b/sbin/mdconfig/mdconfig.c @@ -120,6 +120,10 @@ main(int argc, char **argv) mdio.md_options |= MD_COMPRESS; else if (!strcmp(optarg, "nocompress")) mdio.md_options &= ~MD_COMPRESS; + else if (!strcmp(optarg, "force")) + mdio.md_options |= MD_FORCE; + else if (!strcmp(optarg, "noforce")) + mdio.md_options &= ~MD_FORCE; else if (!strcmp(optarg, "reserve")) mdio.md_options |= MD_RESERVE; else if (!strcmp(optarg, "noreserve")) diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index ec82b330c1b2..dbec37a315fa 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -553,6 +553,7 @@ mdcreate_preload(struct md_ioctl *mdio) sc->type = MD_PRELOAD; sc->secsize = DEV_BSIZE; sc->nsect = mdio->md_size; + sc->flags = mdio->md_options & MD_FORCE; /* Cast to pointer size, then to pointer to avoid warning */ sc->pl_ptr = (u_char *)(uintptr_t)mdio->md_base; sc->pl_len = (mdio->md_size << DEV_BSHIFT); @@ -587,7 +588,7 @@ mdcreate_malloc(struct md_ioctl *mdio) sc->type = MD_MALLOC; sc->secsize = DEV_BSIZE; sc->nsect = mdio->md_size; - sc->flags = mdio->md_options & MD_COMPRESS; + sc->flags = mdio->md_options & (MD_COMPRESS | MD_FORCE); MALLOC(sc->secp, u_char **, sc->nsect * sizeof(u_char *), M_MD, M_WAITOK | M_ZERO); if (mdio->md_options & MD_RESERVE) { for (u = 0; u < sc->nsect; u++) @@ -658,6 +659,7 @@ mdcreate_vnode(struct md_ioctl *mdio, struct proc *p) return (EBUSY); sc->type = MD_VNODE; + sc->flags = mdio->md_options & MD_FORCE; flags = FREAD|FWRITE; NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, mdio->md_file, p); @@ -776,6 +778,7 @@ mdcreate_swap(struct md_ioctl *mdio, struct proc *p) sc->secsize = PAGE_SIZE; sc->nsect = mdio->md_size / (PAGE_SIZE / DEV_BSIZE); sc->object = vm_pager_allocate(OBJT_SWAP, NULL, sc->secsize * (vm_offset_t)sc->nsect, VM_PROT_DEFAULT, 0); + sc->flags = mdio->md_options & MD_FORCE; if (mdio->md_options & MD_RESERVE) { if (swap_pager_reserve(sc->object, 0, sc->nsect) < 0) { vm_pager_deallocate(sc->object); @@ -827,7 +830,7 @@ mdctlioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p) sc = mdfind(mdio->md_unit); if (sc == NULL) return (ENOENT); - if (sc->opencount != 0) + if (sc->opencount != 0 && !(sc->flags & MD_FORCE)) return (EBUSY); switch(sc->type) { case MD_VNODE: diff --git a/sys/sys/mdioctl.h b/sys/sys/mdioctl.h index 6ebda6b8dfaf..6b16fde61f14 100644 --- a/sys/sys/mdioctl.h +++ b/sys/sys/mdioctl.h @@ -84,5 +84,6 @@ struct md_ioctl { #define MD_AUTOUNIT 0x04 /* Assign next free unit */ #define MD_READONLY 0x08 /* Readonly mode */ #define MD_COMPRESS 0x10 /* Compression mode */ +#define MD_FORCE 0x20 /* Don't try to prevent foot-shooting */ #endif /* _SYS_MDIOCTL_H_*/