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
                                        [EMAIL PROTECTED]
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 [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to