diff options
author | jeff <jeff@FreeBSD.org> | 2003-10-05 09:42:24 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2003-10-05 09:42:24 +0000 |
commit | e6698ba2f71397dca82f86b99ba3f86f0b8f355e (patch) | |
tree | d7608e6c42d4683cf26da2c0f0cd9891e43d341f /sys/ufs | |
parent | 9765ac56e13d7ca7f8f4c7dcc96263008cc786f5 (diff) | |
download | FreeBSD-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.c | 28 |
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; } |