Date: Fri, 24 Apr 2020 19:43:07 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r360279 - stable/11/sys/geom Message-ID: <202004241943.03OJh7ED029440@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Fri Apr 24 19:43:07 2020 New Revision: 360279 URL: https://svnweb.freebsd.org/changeset/base/360279 Log: MFC r323977 (by cem): g_resize_provider_event: Do not invoke orphan method twice Like r266444, g_resize_provider_event can attempt to orphan an already orphaned geom_dev consumer. This will cause a panic in g_dev_orphan. Apply the same fix as was applied to g_orphan_register. Modified: stable/11/sys/geom/geom_subr.c Directory Properties: stable/11/ (props changed) Modified: stable/11/sys/geom/geom_subr.c ============================================================================== --- stable/11/sys/geom/geom_subr.c Fri Apr 24 19:03:18 2020 (r360278) +++ stable/11/sys/geom/geom_subr.c Fri Apr 24 19:43:07 2020 (r360279) @@ -627,6 +627,14 @@ g_resize_provider_event(void *arg, int flag) LIST_FOREACH_SAFE(cp, &pp->consumers, consumers, cp2) { gp = cp->geom; if (gp->resize == NULL && size < pp->mediasize) { + /* + * XXX: g_dev_orphan method does deferred destroying + * and it is possible, that other event could already + * call the orphan method. Check consumer's flags to + * do not schedule it twice. + */ + if (cp->flags & G_CF_ORPHAN) + continue; cp->flags |= G_CF_ORPHAN; cp->geom->orphan(cp); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202004241943.03OJh7ED029440>