svn commit: r339900 - head/sys/geom/concat
Mark Johnston
markj at FreeBSD.org
Tue Oct 30 00:22:16 UTC 2018
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 at 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;
};
More information about the svn-src-head
mailing list