Index: ufs/ufs/ufs_vnops.c =================================================================== RCS file: /usr/local/arch/ncvs/src/sys/ufs/ufs/ufs_vnops.c,v retrieving revision 1.283 diff -u -r1.283 ufs_vnops.c --- ufs/ufs/ufs_vnops.c 6 Nov 2006 13:42:09 -0000 1.283 +++ ufs/ufs/ufs_vnops.c 3 Jan 2007 09:29:22 -0000 @@ -133,19 +133,12 @@ { struct inode *ip; struct timespec ts; - int mnt_locked; ip = VTOI(vp); - mnt_locked = 0; - if ((vp->v_mount->mnt_flag & MNT_RDONLY) != 0) { - VI_LOCK(vp); - goto out; - } - MNT_ILOCK(vp->v_mount); /* For reading of mnt_kern_flags. */ - mnt_locked = 1; - VI_LOCK(vp); if ((ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) == 0) - goto out_unl; + return; + if ((vp->v_mount->mnt_flag & MNT_RDONLY) != 0) + goto out; if ((vp->v_type == VBLK || vp->v_type == VCHR) && !DOINGSOFTDEP(vp)) ip->i_flag |= IN_LAZYMOD; @@ -172,10 +165,6 @@ out: ip->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); - out_unl: - VI_UNLOCK(vp); - if (mnt_locked) - MNT_IUNLOCK(vp->v_mount); } /* @@ -390,10 +379,13 @@ struct inode *ip = VTOI(vp); struct vattr *vap = ap->a_vap; - ufs_itimes(vp); /* - * Copy from inode table + * Copy from the inode. The vnode interlock is needed only to + * satisfy the locking protocol for i_flag and i_atime*, but is + * held throughout for convenience. */ + VI_LOCK(vp); + ufs_itimes(vp); vap->va_fsid = dev2udev(ip->i_dev); vap->va_fileid = ip->i_number; vap->va_mode = ip->i_mode & ~IFMT; @@ -403,10 +395,8 @@ if (ip->i_ump->um_fstype == UFS1) { vap->va_rdev = ip->i_din1->di_rdev; vap->va_size = ip->i_din1->di_size; - VI_LOCK(vp); vap->va_atime.tv_sec = ip->i_din1->di_atime; vap->va_atime.tv_nsec = ip->i_din1->di_atimensec; - VI_UNLOCK(vp); vap->va_mtime.tv_sec = ip->i_din1->di_mtime; vap->va_mtime.tv_nsec = ip->i_din1->di_mtimensec; vap->va_ctime.tv_sec = ip->i_din1->di_ctime; @@ -417,10 +407,8 @@ } else { vap->va_rdev = ip->i_din2->di_rdev; vap->va_size = ip->i_din2->di_size; - VI_LOCK(vp); vap->va_atime.tv_sec = ip->i_din2->di_atime; vap->va_atime.tv_nsec = ip->i_din2->di_atimensec; - VI_UNLOCK(vp); vap->va_mtime.tv_sec = ip->i_din2->di_mtime; vap->va_mtime.tv_nsec = ip->i_din2->di_mtimensec; vap->va_ctime.tv_sec = ip->i_din2->di_ctime; @@ -434,6 +422,7 @@ vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize; vap->va_type = IFTOVT(ip->i_mode); vap->va_filerev = ip->i_modrev; + VI_UNLOCK(vp); return (0); }