From owner-svn-src-all@FreeBSD.ORG Fri Apr 3 19:49:34 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 21F89106564A; Fri, 3 Apr 2009 19:49:34 +0000 (UTC) (envelope-from thompsa@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0F3068FC08; Fri, 3 Apr 2009 19:49:34 +0000 (UTC) (envelope-from thompsa@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n33JnXQO031505; Fri, 3 Apr 2009 19:49:33 GMT (envelope-from thompsa@svn.freebsd.org) Received: (from thompsa@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n33JnXfP031500; Fri, 3 Apr 2009 19:49:33 GMT (envelope-from thompsa@svn.freebsd.org) Message-Id: <200904031949.n33JnXfP031500@svn.freebsd.org> From: Andrew Thompson Date: Fri, 3 Apr 2009 19:49:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r190677 - in head/sys: cam geom X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Apr 2009 19:49:34 -0000 Author: thompsa Date: Fri Apr 3 19:49:33 2009 New Revision: 190677 URL: http://svn.freebsd.org/changeset/base/190677 Log: Add interleaving root hold tokens from the CAM probe to disk_create and geom provider tasting. This is needed for disk attachments that happen after threads are running in the boot process. Tested by: rnoland Modified: head/sys/cam/cam_xpt.c head/sys/geom/geom.h head/sys/geom/geom_disk.c head/sys/geom/geom_disk.h head/sys/geom/geom_subr.c Modified: head/sys/cam/cam_xpt.c ============================================================================== --- head/sys/cam/cam_xpt.c Fri Apr 3 19:46:12 2009 (r190676) +++ head/sys/cam/cam_xpt.c Fri Apr 3 19:49:33 2009 (r190677) @@ -5139,6 +5139,7 @@ xpt_find_device(struct cam_et *target, l typedef struct { union ccb *request_ccb; struct ccb_pathinq *cpi; + struct root_hold_token *roothold; int counter; } xpt_scan_bus_info; @@ -5201,6 +5202,7 @@ xpt_scan_bus(struct cam_periph *periph, } scan_info->request_ccb = request_ccb; scan_info->cpi = &work_ccb->cpi; + scan_info->roothold = root_mount_hold("CAM", M_NOWAIT); /* Cache on our stack so we can work asynchronously */ max_target = scan_info->cpi->max_target; @@ -5232,6 +5234,7 @@ xpt_scan_bus(struct cam_periph *periph, printf("xpt_scan_bus: xpt_create_path failed" " with status %#x, bus scan halted\n", status); + root_mount_rel(scan_info->roothold); free(scan_info, M_CAMXPT); request_ccb->ccb_h.status = status; xpt_free_ccb(work_ccb); @@ -5240,6 +5243,7 @@ xpt_scan_bus(struct cam_periph *periph, } work_ccb = xpt_alloc_ccb_nowait(); if (work_ccb == NULL) { + root_mount_rel(scan_info->roothold); free(scan_info, M_CAMXPT); xpt_free_path(path); request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL; @@ -5353,6 +5357,7 @@ xpt_scan_bus(struct cam_periph *periph, xpt_free_ccb(request_ccb); xpt_free_ccb((union ccb *)scan_info->cpi); request_ccb = scan_info->request_ccb; + root_mount_rel(scan_info->roothold); free(scan_info, M_CAMXPT); request_ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(request_ccb); @@ -5372,6 +5377,7 @@ xpt_scan_bus(struct cam_periph *periph, xpt_free_ccb(request_ccb); xpt_free_ccb((union ccb *)scan_info->cpi); request_ccb = scan_info->request_ccb; + root_mount_rel(scan_info->roothold); free(scan_info, M_CAMXPT); request_ccb->ccb_h.status = status; xpt_done(request_ccb); Modified: head/sys/geom/geom.h ============================================================================== --- head/sys/geom/geom.h Fri Apr 3 19:46:12 2009 (r190676) +++ head/sys/geom/geom.h Fri Apr 3 19:49:33 2009 (r190677) @@ -193,6 +193,8 @@ struct g_provider { /* Two fields for the implementing class to use */ void *private; u_int index; + + struct root_hold_token *roothold; }; /* geom_dev.c */ Modified: head/sys/geom/geom_disk.c ============================================================================== --- head/sys/geom/geom_disk.c Fri Apr 3 19:46:12 2009 (r190676) +++ head/sys/geom/geom_disk.c Fri Apr 3 19:49:33 2009 (r190677) @@ -381,6 +381,7 @@ g_disk_create(void *arg, int flag) printf("GEOM: new disk %s\n", gp->name); dp->d_geom = gp; g_error_provider(pp, 0); + root_mount_rel(dp->d_roothold); } static void @@ -467,6 +468,7 @@ disk_create(struct disk *dp, int version dp->d_sectorsize, DEVSTAT_ALL_SUPPORTED, DEVSTAT_TYPE_DIRECT, DEVSTAT_PRIORITY_MAX); dp->d_geom = NULL; + dp->d_roothold = root_mount_hold(dp->d_name, M_WAITOK); g_disk_ident_adjust(dp->d_ident, sizeof(dp->d_ident)); g_post_event(g_disk_create, dp, M_WAITOK, dp, NULL); } Modified: head/sys/geom/geom_disk.h ============================================================================== --- head/sys/geom/geom_disk.h Fri Apr 3 19:46:12 2009 (r190676) +++ head/sys/geom/geom_disk.h Fri Apr 3 19:49:33 2009 (r190677) @@ -88,6 +88,8 @@ struct disk { /* Fields private to the driver */ void *d_drv1; + + struct root_hold_token *d_roothold; }; #define DISKFLAG_NEEDSGIANT 0x1 Modified: head/sys/geom/geom_subr.c ============================================================================== --- head/sys/geom/geom_subr.c Fri Apr 3 19:46:12 2009 (r190676) +++ head/sys/geom/geom_subr.c Fri Apr 3 19:49:33 2009 (r190677) @@ -545,6 +545,10 @@ g_new_provider_event(void *arg, int flag mp->taste(mp, pp, 0); g_topology_assert(); } + if (pp->roothold != NULL) { + root_mount_rel(pp->roothold); + pp->roothold = NULL; + } } @@ -581,6 +585,7 @@ g_new_providerf(struct g_geom *gp, const pp->stat = devstat_new_entry(pp, -1, 0, DEVSTAT_ALL_SUPPORTED, DEVSTAT_TYPE_DIRECT, DEVSTAT_PRIORITY_MAX); LIST_INSERT_HEAD(&gp->provider, pp, provider); + pp->roothold = root_mount_hold(pp->name, M_WAITOK); g_post_event(g_new_provider_event, pp, M_WAITOK, pp, gp, NULL); return (pp); }