mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-01 08:27:59 +00:00
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:
parent
68d0cda661
commit
25c9cca757
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=339900
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user