From owner-cvs-all@FreeBSD.ORG Thu Sep 27 20:18:34 2007 Return-Path: Delivered-To: cvs-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D65A616A41B; Thu, 27 Sep 2007 20:18:34 +0000 (UTC) (envelope-from pjd@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id B240013C448; Thu, 27 Sep 2007 20:18:34 +0000 (UTC) (envelope-from pjd@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l8RKIY2R062585; Thu, 27 Sep 2007 20:18:34 GMT (envelope-from pjd@repoman.freebsd.org) Received: (from pjd@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l8RKIYZm062584; Thu, 27 Sep 2007 20:18:34 GMT (envelope-from pjd) Message-Id: <200709272018.l8RKIYZm062584@repoman.freebsd.org> From: Pawel Jakub Dawidek Date: Thu, 27 Sep 2007 20:18:34 +0000 (UTC) To: src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org X-FreeBSD-CVS-Branch: HEAD Cc: Subject: cvs commit: src/sys/geom geom_event.c X-BeenThere: cvs-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: CVS commit messages for the entire tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Sep 2007 20:18:34 -0000 pjd 2007-09-27 20:18:34 UTC FreeBSD src repository Modified files: sys/geom geom_event.c Log: When orphaning a provider, cancel events related to it. Without this change the following situation was possible: 1. Provider is orphaned from within class' access() method on last write close - orphan provider event is send. 2. GEOM detects last write close on a provider and sends new provider event. 3. g_orphan_register() is called, and calls all orphan methods of attached consumers. 4. New provider event is executed on orphaned provider, all classes can taste already orphaned provider, and some may attach consumers to it. Those consumers will never go away, because the g_orphan_register() was already called. We end up with a zombie provider. With this change, at step 3, we will cancel new provider event. How to repeat this problem: # mdconfig -a -t malloc -s 10m # geli init -i 0 md0 # geli attach md0 # newfs -L test /dev/md0.eli # mount /dev/ufs/test /mnt/tmp # geli detach -l md0.eli # umount /mnt/tmp # glabel status Name Status Components ufs/test N/A N/A Reviewed by: phk Approved by: re (kensmith) Revision Changes Path 1.56 +2 -0 src/sys/geom/geom_event.c