Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Mar 2001 23:17:44 -0800
From:      Dima Dorfman <dima@unixfreak.org>
To:        hackers@freebsd.org
Subject:   Patch to fix panic when detaching a mounted md device
Message-ID:  <20010313071744.C988C3E09@bazooka.unixfreak.org>

next in thread | raw e-mail | index | archive | help
Hello -hackers

Right now, if you try to detach an md device that's currently mounted,
you will get a panic (maybe not immedietely, but it will come, esp. if
you ever try to use that mountpoint again).  I'm pretty sure this is a
known problem, with the solution--or workaround--being, "then don't do
that."  The problem is, someone will invariably do it.  The fix is to
make md complain if you try to detach a device that's currently
opened.  Below is a patch that implements this by keeping track of the
number of times a device has been opened.

Comments?

Thanks

					Dima Dorfman
					dima@unixfreak.org
Index: md.c
===================================================================
RCS file: /st/src/FreeBSD/src/sys/dev/md/md.c,v
retrieving revision 1.26
diff -u -r1.26 md.c
--- md.c	2001/03/09 20:06:30	1.26
+++ md.c	2001/03/13 07:04:43
@@ -122,11 +122,12 @@
 
 static d_strategy_t mdstrategy;
 static d_open_t mdopen;
+static d_close_t mdclose;
 static d_ioctl_t mdioctl, mdctlioctl;
 
 static struct cdevsw md_cdevsw = {
         /* open */      mdopen,
-        /* close */     nullclose,
+        /* close */     mdclose,
         /* read */      physread,
         /* write */     physwrite,
         /* ioctl */     mdioctl,
@@ -169,6 +170,7 @@
 	unsigned nsect;
 	unsigned secsize;
 	unsigned flags;
+	unsigned opencnt;
 
 	/* MD_MALLOC related fields */
 	u_char **secp;
@@ -205,6 +207,18 @@
 	dl->d_secpercyl = dl->d_nsectors * dl->d_ntracks;
 	dl->d_secperunit = sc->nsect;
 	dl->d_ncylinders = dl->d_secperunit / dl->d_secpercyl;
+	sc->opencnt++;
+	return (0);
+}
+
+static int
+mdclose(dev_t dev, int flag, int fmt, struct proc *p)
+{
+	struct md_s *sc;
+
+	sc = dev->si_drv1;
+	KASSERT(sc->opencnt > 0, ("md: closing an unopened device"));
+	sc->opencnt--;
 	return (0);
 }
 
@@ -824,6 +838,8 @@
 		sc = mdfind(mdio->md_unit);
 		if (sc == NULL)
 			return (ENOENT);
+		if (sc->opencnt != 0)
+			return (EBUSY);
 		switch(sc->type) {
 		case MD_VNODE:
 		case MD_SWAP:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010313071744.C988C3E09>