Author: mav
Date: Fri Dec  6 03:46:38 2019
New Revision: 355438
URL: https://svnweb.freebsd.org/changeset/base/355438

Log:
  Block ioctls for dying GEOM_DEV instances.
  
  For normal I/Os consumer and provider statuses are checked by g_io_check().
  But ioctl calls often do not go through it, being dispatched directly. This
  change makes their semantics more alike, protecting lower levels.
  
  MFC after:    2 weeks

Modified:
  head/sys/geom/geom_dev.c

Modified: head/sys/geom/geom_dev.c
==============================================================================
--- head/sys/geom/geom_dev.c    Fri Dec  6 03:18:37 2019        (r355437)
+++ head/sys/geom/geom_dev.c    Fri Dec  6 03:46:38 2019        (r355438)
@@ -497,12 +497,6 @@ g_dev_close(struct cdev *dev, int flags, int fmt, stru
        return (error);
 }
 
-/*
- * XXX: Until we have unmessed the ioctl situation, there is a race against
- * XXX: a concurrent orphanization.  We cannot close it by holding topology
- * XXX: since that would prevent us from doing our job, and stalling events
- * XXX: will break (actually: stall) the BSD disklabel hacks.
- */
 static int
 g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct 
thread *td)
 {
@@ -517,6 +511,12 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data
        cp = dev->si_drv2;
        pp = cp->provider;
 
+       /* If consumer or provider is dying, don't disturb. */
+       if (cp->flags & G_CF_ORPHAN)
+               return (ENXIO);
+       if (pp->error)
+               return (pp->error);
+
        error = 0;
        KASSERT(cp->acr || cp->acw,
            ("Consumer with zero access count in g_dev_ioctl"));
@@ -676,8 +676,6 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data
                error = g_io_getattr("GEOM::ident", cp, &i, data);
                break;
        case DIOCGPROVIDERNAME:
-               if (pp == NULL)
-                       return (ENOENT);
                strlcpy(data, pp->name, i);
                break;
        case DIOCGSTRIPESIZE:
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to