Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Oct 2018 00:22:15 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r339900 - head/sys/geom/concat
Message-ID:  <201810300022.w9U0MF7v048634@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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.bergbauer@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;
 };
 



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