svn commit: r234026 - head/sys/geom
Kirk McKusick
mckusick at FreeBSD.org
Sun Apr 8 06:20:22 UTC 2012
Author: mckusick
Date: Sun Apr 8 06:20:21 2012
New Revision: 234026
URL: http://svn.freebsd.org/changeset/base/234026
Log:
Expand locking around identification of filesystem mount point when
accounting for I/O counts at completion of I/O operation. Also switch
from using global devmtx to vnode mutex to reduce contention.
Suggested and reviewed by: kib
Modified:
head/sys/geom/geom_vfs.c
Modified: head/sys/geom/geom_vfs.c
==============================================================================
--- head/sys/geom/geom_vfs.c Sun Apr 8 06:18:18 2012 (r234025)
+++ head/sys/geom/geom_vfs.c Sun Apr 8 06:20:21 2012 (r234026)
@@ -97,6 +97,7 @@ g_vfs_done(struct bio *bip)
int vfslocked, destroy;
struct mount *mp;
struct vnode *vp;
+ struct cdev *cdevp;
/*
* Collect statistics on synchronous and asynchronous read
@@ -106,12 +107,23 @@ g_vfs_done(struct bio *bip)
*/
bp = bip->bio_caller2;
vp = bp->b_vp;
- if (vp == NULL)
+ if (vp == NULL) {
mp = NULL;
- else if (vn_isdisk(vp, NULL))
- mp = vp->v_rdev->si_mountpt;
- else
- mp = vp->v_mount;
+ } else {
+ /*
+ * If not a disk vnode, use its associated mount point
+ * otherwise use the mountpoint associated with the disk.
+ */
+ VI_LOCK(vp);
+ if (vp->v_type != VCHR ||
+ (cdevp = vp->v_rdev) == NULL ||
+ cdevp->si_devsw == NULL ||
+ (cdevp->si_devsw->d_flags & D_DISK) == 0)
+ mp = vp->v_mount;
+ else
+ mp = cdevp->si_mountpt;
+ VI_UNLOCK(vp);
+ }
if (mp != NULL) {
if (bp->b_iocmd == BIO_WRITE) {
if (LK_HOLDER(bp->b_lock.lk_lock) == LK_KERNPROC)
More information about the svn-src-all
mailing list