diff options
| author | Poul-Henning Kamp <phk@FreeBSD.org> | 2004-10-01 06:33:39 +0000 |
|---|---|---|
| committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2004-10-01 06:33:39 +0000 |
| commit | ba2851254fea6c4aa291ea1b761340e3cd820008 (patch) | |
| tree | ad89d4adcffc9a9b262d61d0ea417f468fc719ed | |
| parent | 000d5e07e0f5f1a26a2a6c642774dc6b83540791 (diff) | |
Notes
| -rw-r--r-- | sys/kern/kern_conf.c | 18 | ||||
| -rw-r--r-- | sys/kern/vfs_subr.c | 10 | ||||
| -rw-r--r-- | sys/sys/conf.h | 2 |
3 files changed, 19 insertions, 11 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index f5d6077574082..3f7bc4467805e 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -98,17 +98,31 @@ dev_ref(struct cdev *dev) } void -dev_rel(struct cdev *dev) +dev_rel(struct vnode *vp) { + struct cdev *dev; + int flag; + dev = vp->v_rdev; + mtx_assert(&devmtx, MA_NOTOWNED); + dev_lock(); + SLIST_REMOVE(&dev->si_hlist, vp, vnode, v_specnext); + dev->si_usecount -= vp->v_usecount; + vp->v_rdev = NULL; dev->si_refcount--; KASSERT(dev->si_refcount >= 0, ("dev_rel(%s) gave negative count", devtoname(dev))); + flag = 0; if (dev->si_devsw == NULL && dev->si_refcount == 0) { LIST_REMOVE(dev, si_list); - freedev(dev); + flag = 1; } + dev_unlock(); + if (flag) + freedev(dev); + return; } + struct cdevsw * dev_refthread(struct cdev *dev) { diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 4f64313facda8..71372dac3d225 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -2698,14 +2698,8 @@ vgonel(vp, td) * if it is on one. */ VI_LOCK(vp); - if (vp->v_type == VCHR && vp->v_rdev != NULL) { - dev_lock(); - SLIST_REMOVE(&vp->v_rdev->si_hlist, vp, vnode, v_specnext); - vp->v_rdev->si_usecount -= vp->v_usecount; - dev_rel(vp->v_rdev); - vp->v_rdev = NULL; - dev_unlock(); - } + if (vp->v_type == VCHR && vp->v_rdev != NULL) + dev_rel(vp); /* * If it is on the freelist and not already at the head, diff --git a/sys/sys/conf.h b/sys/sys/conf.h index 33a2f7093ef6b..6b2620552c9f4 100644 --- a/sys/sys/conf.h +++ b/sys/sys/conf.h @@ -266,7 +266,7 @@ const char *devtoname(struct cdev *_dev); int dev_named(struct cdev *_pdev, const char *_name); void dev_depends(struct cdev *_pdev, struct cdev *_cdev); void dev_ref(struct cdev *dev); -void dev_rel(struct cdev *dev); +void dev_rel(struct vnode *vp); void dev_strategy(struct buf *bp); struct cdev *makebdev(int _maj, int _min); struct cdev *make_dev(struct cdevsw *_devsw, int _minor, uid_t _uid, gid_t _gid, |
