Date: Sun, 8 Apr 2012 06:20:21 +0000 (UTC) From: Kirk McKusick <mckusick@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r234026 - head/sys/geom Message-ID: <201204080620.q386KL2E096980@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204080620.q386KL2E096980>