summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sbin/mdconfig/mdconfig.85
-rw-r--r--sbin/mdconfig/mdconfig.c4
-rw-r--r--sys/dev/md/md.c7
-rw-r--r--sys/sys/mdioctl.h1
4 files changed, 15 insertions, 2 deletions
diff --git a/sbin/mdconfig/mdconfig.8 b/sbin/mdconfig/mdconfig.8
index 6ed7e8a..9226fbe 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 53d0480..3b2d642 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 ec82b33..dbec37a3 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 6ebda6b..6b16fde 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_*/
OpenPOWER on IntegriCloud