Author: trasz Date: Sun Oct 18 16:24:08 2020 New Revision: 366811 URL: https://svnweb.freebsd.org/changeset/base/366811
Log: Make g_attach() return ENXIO for orphaned providers; update various classes to add missing error checking. Reviewed by: imp MFC after: 2 weeks Sponsored by: NetApp, Inc. Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D26658 Modified: head/share/man/man9/g_attach.9 head/sys/geom/bde/g_bde.c head/sys/geom/cache/g_cache.c head/sys/geom/concat/g_concat.c head/sys/geom/geom_dev.c head/sys/geom/geom_subr.c head/sys/geom/geom_vfs.c head/sys/geom/journal/g_journal.c head/sys/geom/label/g_label.c head/sys/geom/linux_lvm/g_linux_lvm.c head/sys/geom/mirror/g_mirror.c head/sys/geom/mirror/g_mirror_ctl.c head/sys/geom/mountver/g_mountver.c head/sys/geom/multipath/g_multipath.c head/sys/geom/raid/g_raid.c head/sys/geom/raid3/g_raid3.c head/sys/geom/shsec/g_shsec.c head/sys/geom/stripe/g_stripe.c head/sys/geom/virstor/g_virstor.c Modified: head/share/man/man9/g_attach.9 ============================================================================== --- head/share/man/man9/g_attach.9 Sun Oct 18 16:16:22 2020 (r366810) +++ head/share/man/man9/g_attach.9 Sun Oct 18 16:24:08 2020 (r366811) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 16, 2004 +.Dd October 10, 2020 .Dt G_ATTACH 9 .Os .Sh NAME @@ -122,6 +122,8 @@ Possible errors: .Bl -tag -width Er .It Bq Er ELOOP The operation creates a topology loop. +.It Bq Er ENXIO +Provider got orphaned. .El .Sh SEE ALSO .Xr geom 4 , Modified: head/sys/geom/bde/g_bde.c ============================================================================== --- head/sys/geom/bde/g_bde.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/bde/g_bde.c Sun Oct 18 16:24:08 2020 (r366811) @@ -131,7 +131,13 @@ g_bde_create_geom(struct gctl_req *req, struct g_class 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); Modified: head/sys/geom/cache/g_cache.c ============================================================================== --- head/sys/geom/cache/g_cache.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/cache/g_cache.c Sun Oct 18 16:24:08 2020 (r366811) @@ -673,9 +673,11 @@ g_cache_taste(struct g_class *mp, struct g_provider *p 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) Modified: head/sys/geom/concat/g_concat.c ============================================================================== --- head/sys/geom/concat/g_concat.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/concat/g_concat.c Sun Oct 18 16:24:08 2020 (r366811) @@ -718,9 +718,11 @@ g_concat_taste(struct g_class *mp, struct g_provider * 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) Modified: head/sys/geom/geom_dev.c ============================================================================== --- head/sys/geom/geom_dev.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/geom_dev.c Sun Oct 18 16:24:08 2020 (r366811) @@ -346,7 +346,7 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, 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); Modified: head/sys/geom/geom_subr.c ============================================================================== --- head/sys/geom/geom_subr.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/geom_subr.c Sun Oct 18 16:24:08 2020 (r366811) @@ -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); Modified: head/sys/geom/geom_vfs.c ============================================================================== --- head/sys/geom/geom_vfs.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/geom_vfs.c Sun Oct 18 16:24:08 2020 (r366811) @@ -260,7 +260,11 @@ g_vfs_open(struct vnode *vp, struct g_consumer **cpp, 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); Modified: head/sys/geom/journal/g_journal.c ============================================================================== --- head/sys/geom/journal/g_journal.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/journal/g_journal.c Sun Oct 18 16:24:08 2020 (r366811) @@ -2483,9 +2483,11 @@ g_journal_taste(struct g_class *mp, struct g_provider /* 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) Modified: head/sys/geom/label/g_label.c ============================================================================== --- head/sys/geom/label/g_label.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/label/g_label.c Sun Oct 18 16:24:08 2020 (r366811) @@ -400,7 +400,8 @@ g_label_taste(struct g_class *mp, struct g_provider *p 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 *p g_access(cp, -1, 0, 0); end: g_detach(cp); +end2: g_destroy_consumer(cp); g_destroy_geom(gp); return (NULL); Modified: head/sys/geom/linux_lvm/g_linux_lvm.c ============================================================================== --- head/sys/geom/linux_lvm/g_linux_lvm.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/linux_lvm/g_linux_lvm.c Sun Oct 18 16:24:08 2020 (r366811) @@ -543,11 +543,13 @@ g_llvm_taste(struct g_class *mp, struct g_provider *pp /* 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) Modified: head/sys/geom/mirror/g_mirror.c ============================================================================== --- head/sys/geom/mirror/g_mirror.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/mirror/g_mirror.c Sun Oct 18 16:24:08 2020 (r366811) @@ -3241,9 +3241,11 @@ g_mirror_taste(struct g_class *mp, struct g_provider * */ 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) Modified: head/sys/geom/mirror/g_mirror_ctl.c ============================================================================== --- head/sys/geom/mirror/g_mirror_ctl.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/mirror/g_mirror_ctl.c Sun Oct 18 16:24:08 2020 (r366811) @@ -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); Modified: head/sys/geom/mountver/g_mountver.c ============================================================================== --- head/sys/geom/mountver/g_mountver.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/mountver/g_mountver.c Sun Oct 18 16:24:08 2020 (r366811) @@ -586,7 +586,12 @@ g_mountver_taste(struct g_class *mp, struct g_provider 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); Modified: head/sys/geom/multipath/g_multipath.c ============================================================================== --- head/sys/geom/multipath/g_multipath.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/multipath/g_multipath.c Sun Oct 18 16:24:08 2020 (r366811) @@ -823,9 +823,11 @@ g_multipath_taste(struct g_class *mp, struct g_provide 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) Modified: head/sys/geom/raid/g_raid.c ============================================================================== --- head/sys/geom/raid/g_raid.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/raid/g_raid.c Sun Oct 18 16:24:08 2020 (r366811) @@ -2228,7 +2228,8 @@ g_raid_taste(struct g_class *mp, struct g_provider *pp 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 (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); Modified: head/sys/geom/raid3/g_raid3.c ============================================================================== --- head/sys/geom/raid3/g_raid3.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/raid3/g_raid3.c Sun Oct 18 16:24:08 2020 (r366811) @@ -3315,9 +3315,11 @@ g_raid3_taste(struct g_class *mp, struct g_provider *p /* 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) Modified: head/sys/geom/shsec/g_shsec.c ============================================================================== --- head/sys/geom/shsec/g_shsec.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/shsec/g_shsec.c Sun Oct 18 16:24:08 2020 (r366811) @@ -646,9 +646,11 @@ g_shsec_taste(struct g_class *mp, struct g_provider *p 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) Modified: head/sys/geom/stripe/g_stripe.c ============================================================================== --- head/sys/geom/stripe/g_stripe.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/stripe/g_stripe.c Sun Oct 18 16:24:08 2020 (r366811) @@ -963,9 +963,11 @@ g_stripe_taste(struct g_class *mp, struct g_provider * 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) Modified: head/sys/geom/virstor/g_virstor.c ============================================================================== --- head/sys/geom/virstor/g_virstor.c Sun Oct 18 16:16:22 2020 (r366810) +++ head/sys/geom/virstor/g_virstor.c Sun Oct 18 16:24:08 2020 (r366811) @@ -780,9 +780,11 @@ g_virstor_taste(struct g_class *mp, struct g_provider 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); _______________________________________________ svn-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"