summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2020-10-18 16:24:08 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2020-10-18 16:24:08 +0000
commitd22ff249d9733ed0ff628efd797f3ea3ec66c913 (patch)
tree2f42ccae0b393be78553fd102591ad881269d815 /sys
parent6221ec6064e0fc049bc3814a4bc09fcd7b681108 (diff)
downloadsrc-test2-d22ff249d9733ed0ff628efd797f3ea3ec66c913.tar.gz
src-test2-d22ff249d9733ed0ff628efd797f3ea3ec66c913.zip
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/geom/bde/g_bde.c8
-rw-r--r--sys/geom/cache/g_cache.c8
-rw-r--r--sys/geom/concat/g_concat.c8
-rw-r--r--sys/geom/geom_dev.c2
-rw-r--r--sys/geom/geom_subr.c2
-rw-r--r--sys/geom/geom_vfs.c6
-rw-r--r--sys/geom/journal/g_journal.c8
-rw-r--r--sys/geom/label/g_label.c4
-rw-r--r--sys/geom/linux_lvm/g_linux_lvm.c12
-rw-r--r--sys/geom/mirror/g_mirror.c8
-rw-r--r--sys/geom/mirror/g_mirror_ctl.c6
-rw-r--r--sys/geom/mountver/g_mountver.c7
-rw-r--r--sys/geom/multipath/g_multipath.c8
-rw-r--r--sys/geom/raid/g_raid.c4
-rw-r--r--sys/geom/raid3/g_raid3.c8
-rw-r--r--sys/geom/shsec/g_shsec.c8
-rw-r--r--sys/geom/stripe/g_stripe.c8
-rw-r--r--sys/geom/virstor/g_virstor.c8
18 files changed, 84 insertions, 39 deletions
diff --git a/sys/geom/bde/g_bde.c b/sys/geom/bde/g_bde.c
index b516f300b3a2..3d2de334e4bb 100644
--- a/sys/geom/bde/g_bde.c
+++ b/sys/geom/bde/g_bde.c
@@ -131,7 +131,13 @@ g_bde_create_geom(struct gctl_req *req, struct g_class *mp, struct g_provider *p
gp = g_new_geomf(mp, "%s.bde", pp->name);
cp = g_new_consumer(gp);
- g_attach(cp, pp);
+ error = g_attach(cp, pp);
+ if (error != 0) {
+ g_destroy_consumer(cp);
+ g_destroy_geom(gp);
+ gctl_error(req, "could not attach consumer");
+ return;
+ }
error = g_access(cp, 1, 1, 1);
if (error) {
g_detach(cp);
diff --git a/sys/geom/cache/g_cache.c b/sys/geom/cache/g_cache.c
index 4e6c95cbd4ee..d28c2ad62bad 100644
--- a/sys/geom/cache/g_cache.c
+++ b/sys/geom/cache/g_cache.c
@@ -673,9 +673,11 @@ g_cache_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
gp->orphan = g_cache_orphan;
gp->access = g_cache_access;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_cache_read_metadata(cp, &md);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = g_cache_read_metadata(cp, &md);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);
if (error != 0)
diff --git a/sys/geom/concat/g_concat.c b/sys/geom/concat/g_concat.c
index 458d8dcd4ee7..dfa7b97a1806 100644
--- a/sys/geom/concat/g_concat.c
+++ b/sys/geom/concat/g_concat.c
@@ -718,9 +718,11 @@ g_concat_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
gp->access = g_concat_access;
gp->orphan = g_concat_orphan;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_concat_read_metadata(cp, &md);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = g_concat_read_metadata(cp, &md);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);
if (error != 0)
diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c
index 9e5dd8d7eed9..e78b3ba050df 100644
--- a/sys/geom/geom_dev.c
+++ b/sys/geom/geom_dev.c
@@ -346,7 +346,7 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)
cp->private = sc;
cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE;
error = g_attach(cp, pp);
- KASSERT(error == 0,
+ KASSERT(error == 0 || error == ENXIO,
("g_dev_taste(%s) failed to g_attach, err=%d", pp->name, error));
make_dev_args_init(&args);
diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c
index 9b867fdade16..c46eebf9e329 100644
--- a/sys/geom/geom_subr.c
+++ b/sys/geom/geom_subr.c
@@ -896,6 +896,8 @@ g_attach(struct g_consumer *cp, struct g_provider *pp)
G_VALID_PROVIDER(pp);
g_trace(G_T_TOPOLOGY, "g_attach(%p, %p)", cp, pp);
KASSERT(cp->provider == NULL, ("attach but attached"));
+ if ((pp->flags & (G_PF_ORPHAN | G_PF_WITHER)) != 0)
+ return (ENXIO);
cp->provider = pp;
cp->flags &= ~G_CF_ORPHAN;
LIST_INSERT_HEAD(&pp->consumers, cp, consumers);
diff --git a/sys/geom/geom_vfs.c b/sys/geom/geom_vfs.c
index 727fa726179d..f01765b8ee30 100644
--- a/sys/geom/geom_vfs.c
+++ b/sys/geom/geom_vfs.c
@@ -260,7 +260,11 @@ g_vfs_open(struct vnode *vp, struct g_consumer **cpp, const char *fsname, int wr
sc->sc_bo = bo;
gp->softc = sc;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
+ error = g_attach(cp, pp);
+ if (error) {
+ g_wither_geom(gp, ENXIO);
+ return (error);
+ }
error = g_access(cp, 1, wr, wr);
if (error) {
g_wither_geom(gp, ENXIO);
diff --git a/sys/geom/journal/g_journal.c b/sys/geom/journal/g_journal.c
index 894ba26d9854..43c105496879 100644
--- a/sys/geom/journal/g_journal.c
+++ b/sys/geom/journal/g_journal.c
@@ -2483,9 +2483,11 @@ g_journal_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
/* This orphan function should be never called. */
gp->orphan = g_journal_taste_orphan;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_journal_metadata_read(cp, &md);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = g_journal_metadata_read(cp, &md);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);
if (error != 0)
diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c
index 169f5b49966e..026f5318b4ed 100644
--- a/sys/geom/label/g_label.c
+++ b/sys/geom/label/g_label.c
@@ -400,7 +400,8 @@ g_label_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
gp->access = g_label_access_taste;
gp->orphan = g_label_orphan_taste;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
+ if (g_attach(cp, pp) != 0)
+ goto end2;
if (g_access(cp, 1, 0, 0) != 0)
goto end;
for (i = 0; g_labels[i] != NULL; i++) {
@@ -425,6 +426,7 @@ g_label_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
g_access(cp, -1, 0, 0);
end:
g_detach(cp);
+end2:
g_destroy_consumer(cp);
g_destroy_geom(gp);
return (NULL);
diff --git a/sys/geom/linux_lvm/g_linux_lvm.c b/sys/geom/linux_lvm/g_linux_lvm.c
index ac6c5786d555..b835baecc93d 100644
--- a/sys/geom/linux_lvm/g_linux_lvm.c
+++ b/sys/geom/linux_lvm/g_linux_lvm.c
@@ -543,11 +543,13 @@ g_llvm_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
/* This orphan function should be never called. */
gp->orphan = g_llvm_taste_orphan;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_llvm_read_label(cp, &ll);
- if (!error)
- error = g_llvm_read_md(cp, &md, &ll);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = g_llvm_read_label(cp, &ll);
+ if (error == 0)
+ error = g_llvm_read_md(cp, &md, &ll);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);
if (error != 0)
diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c
index 4b8d034fb3cc..26962cf17551 100644
--- a/sys/geom/mirror/g_mirror.c
+++ b/sys/geom/mirror/g_mirror.c
@@ -3241,9 +3241,11 @@ g_mirror_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
*/
gp->orphan = g_mirror_taste_orphan;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_mirror_read_metadata(cp, &md);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = g_mirror_read_metadata(cp, &md);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);
if (error != 0)
diff --git a/sys/geom/mirror/g_mirror_ctl.c b/sys/geom/mirror/g_mirror_ctl.c
index a1594dd18177..254841b6c04a 100644
--- a/sys/geom/mirror/g_mirror_ctl.c
+++ b/sys/geom/mirror/g_mirror_ctl.c
@@ -449,7 +449,11 @@ err:
g_topology_unlock();
return;
}
- g_attach(cp, pp);
+ if (g_attach(cp, pp) != 0) {
+ G_MIRROR_DEBUG(1, "Can't attach disk %s.", pp->name);
+ gctl_error(req, "Can't attach disk %s.", pp->name);
+ goto err;
+ }
if (g_access(cp, 1, 0, 0) != 0) {
G_MIRROR_DEBUG(1, "Can't open disk %s.", pp->name);
gctl_error(req, "Can't open disk %s.", pp->name);
diff --git a/sys/geom/mountver/g_mountver.c b/sys/geom/mountver/g_mountver.c
index ce0c4fa5acd2..9703f1d02529 100644
--- a/sys/geom/mountver/g_mountver.c
+++ b/sys/geom/mountver/g_mountver.c
@@ -586,7 +586,12 @@ g_mountver_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
return (NULL);
cp = LIST_FIRST(&gp->consumer);
- g_attach(cp, pp);
+ error = g_attach(cp, pp);
+ if (error != 0) {
+ G_MOUNTVER_DEBUG(0, "Cannot attach to %s; error = %d.", pp->name, error);
+ return (NULL);
+ }
+
error = g_mountver_ident_matches(gp);
if (error != 0) {
g_detach(cp);
diff --git a/sys/geom/multipath/g_multipath.c b/sys/geom/multipath/g_multipath.c
index e1018b87211b..5972b63e680a 100644
--- a/sys/geom/multipath/g_multipath.c
+++ b/sys/geom/multipath/g_multipath.c
@@ -823,9 +823,11 @@ g_multipath_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
gp->access = g_multipath_access;
gp->orphan = g_multipath_orphan;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_multipath_read_metadata(cp, &md);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = g_multipath_read_metadata(cp, &md);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);
if (error != 0)
diff --git a/sys/geom/raid/g_raid.c b/sys/geom/raid/g_raid.c
index 9558f313f62b..31adb0f2b513 100644
--- a/sys/geom/raid/g_raid.c
+++ b/sys/geom/raid/g_raid.c
@@ -2228,7 +2228,8 @@ g_raid_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
gp->orphan = g_raid_taste_orphan;
cp = g_new_consumer(gp);
cp->flags |= G_CF_DIRECT_RECEIVE;
- g_attach(cp, pp);
+ if (g_attach(cp, pp) != 0)
+ goto ofail2;
if (g_access(cp, 1, 0, 0) != 0)
goto ofail;
@@ -2251,6 +2252,7 @@ g_raid_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
(void)g_access(cp, -1, 0, 0);
ofail:
g_detach(cp);
+ofail2:
g_destroy_consumer(cp);
g_destroy_geom(gp);
G_RAID_DEBUG(2, "Tasting provider %s done.", pp->name);
diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c
index aa59465e8b4e..bf4f1cab8663 100644
--- a/sys/geom/raid3/g_raid3.c
+++ b/sys/geom/raid3/g_raid3.c
@@ -3315,9 +3315,11 @@ g_raid3_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
/* This orphan function should be never called. */
gp->orphan = g_raid3_taste_orphan;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_raid3_read_metadata(cp, &md);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = g_raid3_read_metadata(cp, &md);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);
if (error != 0)
diff --git a/sys/geom/shsec/g_shsec.c b/sys/geom/shsec/g_shsec.c
index d2cb70dc699a..4e359bee4d25 100644
--- a/sys/geom/shsec/g_shsec.c
+++ b/sys/geom/shsec/g_shsec.c
@@ -646,9 +646,11 @@ g_shsec_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
gp->access = g_shsec_access;
gp->orphan = g_shsec_orphan;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_shsec_read_metadata(cp, &md);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = g_shsec_read_metadata(cp, &md);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);
if (error != 0)
diff --git a/sys/geom/stripe/g_stripe.c b/sys/geom/stripe/g_stripe.c
index a1b9835499ee..0a76a1d8a074 100644
--- a/sys/geom/stripe/g_stripe.c
+++ b/sys/geom/stripe/g_stripe.c
@@ -963,9 +963,11 @@ g_stripe_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
gp->access = g_stripe_access;
gp->orphan = g_stripe_orphan;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_stripe_read_metadata(cp, &md);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = g_stripe_read_metadata(cp, &md);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);
if (error != 0)
diff --git a/sys/geom/virstor/g_virstor.c b/sys/geom/virstor/g_virstor.c
index 8c3f644bca6d..98892bcd30e4 100644
--- a/sys/geom/virstor/g_virstor.c
+++ b/sys/geom/virstor/g_virstor.c
@@ -780,9 +780,11 @@ g_virstor_taste(struct g_class *mp, struct g_provider *pp, int flags)
gp->orphan = (void *)invalid_call; /* I really want these to fail. */
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = read_metadata(cp, &md);
- g_detach(cp);
+ error = g_attach(cp, pp);
+ if (error == 0) {
+ error = read_metadata(cp, &md);
+ g_detach(cp);
+ }
g_destroy_consumer(cp);
g_destroy_geom(gp);