diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/cam/cam_xpt.c | 6 | ||||
-rw-r--r-- | sys/geom/geom.h | 2 | ||||
-rw-r--r-- | sys/geom/geom_disk.c | 2 | ||||
-rw-r--r-- | sys/geom/geom_disk.h | 2 | ||||
-rw-r--r-- | sys/geom/geom_subr.c | 5 |
5 files changed, 17 insertions, 0 deletions
diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index 08286db..2fe895c 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -5139,6 +5139,7 @@ xpt_find_device(struct cam_et *target, lun_id_t lun_id) 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, union ccb *request_ccb) } 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, union ccb *request_ccb) 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, union ccb *request_ccb) } 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, union ccb *request_ccb) 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, union ccb *request_ccb) 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); diff --git a/sys/geom/geom.h b/sys/geom/geom.h index a916ec5..38c6c75 100644 --- a/sys/geom/geom.h +++ b/sys/geom/geom.h @@ -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 */ diff --git a/sys/geom/geom_disk.c b/sys/geom/geom_disk.c index 20998bd..3b1e748 100644 --- a/sys/geom/geom_disk.c +++ b/sys/geom/geom_disk.c @@ -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); } diff --git a/sys/geom/geom_disk.h b/sys/geom/geom_disk.h index 5e9d1aa..a3e1efb 100644 --- a/sys/geom/geom_disk.h +++ b/sys/geom/geom_disk.h @@ -88,6 +88,8 @@ struct disk { /* Fields private to the driver */ void *d_drv1; + + struct root_hold_token *d_roothold; }; #define DISKFLAG_NEEDSGIANT 0x1 diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c index b67c0d5..85d8028 100644 --- a/sys/geom/geom_subr.c +++ b/sys/geom/geom_subr.c @@ -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 char *fmt, ...) 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); } |