summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2003-10-05 09:42:24 +0000
committerjeff <jeff@FreeBSD.org>2003-10-05 09:42:24 +0000
commite6698ba2f71397dca82f86b99ba3f86f0b8f355e (patch)
treed7608e6c42d4683cf26da2c0f0cd9891e43d341f /sys/ufs
parent9765ac56e13d7ca7f8f4c7dcc96263008cc786f5 (diff)
downloadFreeBSD-src-e6698ba2f71397dca82f86b99ba3f86f0b8f355e.zip
FreeBSD-src-e6698ba2f71397dca82f86b99ba3f86f0b8f355e.tar.gz
- Further simplify ffs_sync(). The vnode lock is required for UFS_UPDATE()
so make the code slightly more uniform. The vnode lock is acquired in all cases and now the only difference between VCHR and other is we call UFS_UPDATE instead of VOP_FSYNC().
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 8be4475..564cea2 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -1160,26 +1160,22 @@ loop:
continue;
}
mtx_unlock(&mntvnode_mtx);
+ if ((error = vget(vp, lockreq, td)) != 0) {
+ mtx_lock(&mntvnode_mtx);
+ if (error == ENOENT)
+ goto loop;
+ continue;
+ }
if (vp->v_type != VCHR) {
- if ((error = vget(vp, lockreq, td)) != 0) {
- mtx_lock(&mntvnode_mtx);
- if (error == ENOENT)
- goto loop;
- continue;
- }
if ((error = VOP_FSYNC(vp, cred, waitfor, td)) != 0)
allerror = error;
- VOP_UNLOCK(vp, 0, td);
- mtx_lock(&mntvnode_mtx);
- if (TAILQ_NEXT(vp, v_nmntvnodes) != nvp)
- restart = 1;
- vrele(vp);
- } else {
- VI_UNLOCK(vp);
- /* XXX UFS_UPDATE is not protected by any lock. */
+ } else
UFS_UPDATE(vp, wait);
- mtx_lock(&mntvnode_mtx);
- }
+ VOP_UNLOCK(vp, 0, td);
+ mtx_lock(&mntvnode_mtx);
+ if (TAILQ_NEXT(vp, v_nmntvnodes) != nvp)
+ restart = 1;
+ vrele(vp);
if (restart)
goto loop;
}
OpenPOWER on IntegriCloud