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
This commit is contained in:
Mark Johnston 2018-10-30 00:22:14 +00:00
parent 68d0cda661
commit 25c9cca757
2 changed files with 36 additions and 0 deletions

View File

@ -205,6 +205,27 @@ g_concat_access(struct g_provider *pp, int dr, int dw, int de)
return (error);
}
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)
{
@ -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

View File

@ -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;
};