Author: mav
Date: Thu Dec 19 01:32:15 2019
New Revision: 355894
URL: https://svnweb.freebsd.org/changeset/base/355894

Log:
  MFC r355438: 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.

Modified:
  stable/12/sys/geom/geom_dev.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/geom/geom_dev.c
==============================================================================
--- stable/12/sys/geom/geom_dev.c       Thu Dec 19 01:30:29 2019        
(r355893)
+++ stable/12/sys/geom/geom_dev.c       Thu Dec 19 01:32:15 2019        
(r355894)
@@ -489,12 +489,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)
 {
@@ -506,6 +500,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"));
@@ -628,8 +628,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:
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to