Author: markj
Date: Tue Oct 30 00:22:14 2018
New Revision: 339900
URL: https://svnweb.freebsd.org/changeset/base/339900

Log:
  Have gconcat advertise delete support if one of its disks does.
  
  This follows the example set by other multi-disk GEOM classes.
  
  PR:           232676
  Tested by:    noah.bergba...@tum.de
  MFC after:    1 month

Modified:
  head/sys/geom/concat/g_concat.c
  head/sys/geom/concat/g_concat.h

Modified: head/sys/geom/concat/g_concat.c
==============================================================================
--- head/sys/geom/concat/g_concat.c     Tue Oct 30 00:19:44 2018        
(r339899)
+++ head/sys/geom/concat/g_concat.c     Tue Oct 30 00:22:14 2018        
(r339900)
@@ -206,6 +206,27 @@ fail:
 }
 
 static void
+g_concat_candelete(struct bio *bp)
+{
+       struct g_concat_softc *sc;
+       struct g_concat_disk *disk;
+       int i, *val;
+
+       val = (int *)bp->bio_data;
+       *val = 0;
+
+       sc = bp->bio_to->geom->softc;
+       for (i = 0; i < sc->sc_ndisks; i++) {
+               disk = &sc->sc_disks[i];
+               if (!disk->d_removed && disk->d_candelete) {
+                       *val = 1;
+                       break;
+               }
+       }
+       g_io_deliver(bp, 0);
+}
+
+static void
 g_concat_kernel_dump(struct bio *bp)
 {
        struct g_concat_softc *sc;
@@ -327,6 +348,9 @@ g_concat_start(struct bio *bp)
                if (strcmp("GEOM::kerneldump", bp->bio_attribute) == 0) {
                        g_concat_kernel_dump(bp);
                        return;
+               } else if (strcmp("GEOM::candelete", bp->bio_attribute) == 0) {
+                       g_concat_candelete(bp);
+                       return;
                }
                /* To which provider it should be delivered? */
                /* FALLTHROUGH */
@@ -408,6 +432,7 @@ g_concat_check_and_run(struct g_concat_softc *sc)
        struct g_provider *dp, *pp;
        u_int no, sectorsize = 0;
        off_t start;
+       int error;
 
        g_topology_assert();
        if (g_concat_nvalid(sc) != sc->sc_ndisks)
@@ -425,6 +450,16 @@ g_concat_check_and_run(struct g_concat_softc *sc)
                if (sc->sc_type == G_CONCAT_TYPE_AUTOMATIC)
                        disk->d_end -= dp->sectorsize;
                start = disk->d_end;
+               error = g_access(disk->d_consumer, 1, 0, 0);
+               if (error == 0) {
+                       error = g_getattr("GEOM::candelete", disk->d_consumer,
+                           &disk->d_candelete);
+                       if (error != 0)
+                               disk->d_candelete = 0;
+                       (void)g_access(disk->d_consumer, -1, 0, 0);
+               } else
+                       G_CONCAT_DEBUG(1, "Failed to access disk %s, error %d.",
+                           dp->name, error);
                if (no == 0)
                        sectorsize = dp->sectorsize;
                else

Modified: head/sys/geom/concat/g_concat.h
==============================================================================
--- head/sys/geom/concat/g_concat.h     Tue Oct 30 00:19:44 2018        
(r339899)
+++ head/sys/geom/concat/g_concat.h     Tue Oct 30 00:22:14 2018        
(r339900)
@@ -74,6 +74,7 @@ struct g_concat_disk {
        struct g_concat_softc   *d_softc;
        off_t                    d_start;
        off_t                    d_end;
+       int                      d_candelete;
        int                      d_removed;
 };
 
_______________________________________________
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