diff options
author | phk <phk@FreeBSD.org> | 2003-02-12 09:48:27 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2003-02-12 09:48:27 +0000 |
commit | ba1e23916c436c106d106479d222c01c78ab48cc (patch) | |
tree | a6bb6124e2519604d9c2ee50cd88dc79f946ada1 /sys/geom | |
parent | ebdd8469e14e1d5c89830106c362d469df95d5ed (diff) | |
download | FreeBSD-src-ba1e23916c436c106d106479d222c01c78ab48cc.zip FreeBSD-src-ba1e23916c436c106d106479d222c01c78ab48cc.tar.gz |
Implement a handle for efficient implementation of perforations in
lower extremities.
Setting bit 4 in debugflags (sysctl kern.geom.debugflags=16) will
allow any open to succeed on rank#1 providers. This will generally
correspond to the physical disk devices: ad0, da0, md0 etc.
This fundamentally violates the mechanics of GEOMs autoconfiguration,
and is only provided as a debugging facility, so obviously error
reports on GEOM where this bit is or has been set will not be
accepted.
Diffstat (limited to 'sys/geom')
-rw-r--r-- | sys/geom/geom_int.h | 11 | ||||
-rw-r--r-- | sys/geom/geom_subr.c | 9 |
2 files changed, 13 insertions, 7 deletions
diff --git a/sys/geom/geom_int.h b/sys/geom/geom_int.h index 0323e01..cd67d19 100644 --- a/sys/geom/geom_int.h +++ b/sys/geom/geom_int.h @@ -42,10 +42,13 @@ TAILQ_HEAD(event_tailq_head, g_event); extern struct event_tailq_head events; extern int g_collectstats; extern int g_debugflags; -/* 1 G_T_TOPOLOGY */ -/* 2 G_T_BIO */ -/* 4 G_T_ACCESS */ -/* 8 enable sanity checks */ +/* + * 1 G_T_TOPOLOGY + * 2 G_T_BIO + * 4 G_T_ACCESS + * 8 enable sanity checks + * 16 Allow footshooting on rank#1 providers + */ /* * Various internal actions are tracked by tagging g_event[s] onto diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c index 237e199..e2209fc 100644 --- a/sys/geom/geom_subr.c +++ b/sys/geom/geom_subr.c @@ -418,14 +418,17 @@ g_access_rel(struct g_consumer *cp, int dcr, int dcw, int dce) pp->acr, pp->acw, pp->ace, pp, pp->name); + /* If foot-shooting is enabled, any open on rank#1 is OK */ + if ((g_debugflags & 16) && pp->geom->rank == 1) + ; /* If we try exclusive but already write: fail */ - if (dce > 0 && pw > 0) + else if (dce > 0 && pw > 0) return (EPERM); /* If we try write but already exclusive: fail */ - if (dcw > 0 && pe > 0) + else if (dcw > 0 && pe > 0) return (EPERM); /* If we try to open more but provider is error'ed: fail */ - if ((dcr > 0 || dcw > 0 || dce > 0) && pp->error != 0) + else if ((dcr > 0 || dcw > 0 || dce > 0) && pp->error != 0) return (pp->error); /* Ok then... */ |