diff options
-rw-r--r-- | sys/fs/cd9660/cd9660_vfsops.c | 2 | ||||
-rw-r--r-- | sys/fs/devfs/devfs_vfsops.c | 2 | ||||
-rw-r--r-- | sys/fs/fdescfs/fdesc_vfsops.c | 2 | ||||
-rw-r--r-- | sys/fs/hpfs/hpfs_vfsops.c | 2 | ||||
-rw-r--r-- | sys/fs/ntfs/ntfs_vfsops.c | 2 | ||||
-rw-r--r-- | sys/fs/nwfs/nwfs_vfsops.c | 53 | ||||
-rw-r--r-- | sys/fs/portalfs/portal_vfsops.c | 2 | ||||
-rw-r--r-- | sys/fs/pseudofs/pseudofs.h | 2 | ||||
-rw-r--r-- | sys/fs/smbfs/smbfs_vfsops.c | 46 | ||||
-rw-r--r-- | sys/fs/udf/udf_vfsops.c | 2 | ||||
-rw-r--r-- | sys/fs/umapfs/umap_vfsops.c | 2 | ||||
-rw-r--r-- | sys/fs/unionfs/union_vfsops.c | 2 | ||||
-rw-r--r-- | sys/isofs/cd9660/cd9660_vfsops.c | 2 | ||||
-rw-r--r-- | sys/kern/vfs_default.c | 57 | ||||
-rw-r--r-- | sys/sys/mount.h | 1 |
15 files changed, 70 insertions, 109 deletions
diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c index a44df4c..b5aff73 100644 --- a/sys/fs/cd9660/cd9660_vfsops.c +++ b/sys/fs/cd9660/cd9660_vfsops.c @@ -79,7 +79,7 @@ static struct vfsops cd9660_vfsops = { cd9660_root, vfs_stdquotactl, cd9660_statfs, - vfs_stdsync, + vfs_stdnosync, cd9660_vget, cd9660_fhtovp, vfs_stdcheckexp, diff --git a/sys/fs/devfs/devfs_vfsops.c b/sys/fs/devfs/devfs_vfsops.c index 64d4cde..c1af1cd 100644 --- a/sys/fs/devfs/devfs_vfsops.c +++ b/sys/fs/devfs/devfs_vfsops.c @@ -194,7 +194,7 @@ static struct vfsops devfs_vfsops = { devfs_root, vfs_stdquotactl, devfs_statfs, - vfs_stdsync, + vfs_stdnosync, vfs_stdvget, vfs_stdfhtovp, vfs_stdcheckexp, diff --git a/sys/fs/fdescfs/fdesc_vfsops.c b/sys/fs/fdescfs/fdesc_vfsops.c index a4741bc..fbe73d9 100644 --- a/sys/fs/fdescfs/fdesc_vfsops.c +++ b/sys/fs/fdescfs/fdesc_vfsops.c @@ -213,7 +213,7 @@ static struct vfsops fdesc_vfsops = { fdesc_root, vfs_stdquotactl, fdesc_statfs, - vfs_stdsync, + vfs_stdnosync, vfs_stdvget, vfs_stdfhtovp, vfs_stdcheckexp, diff --git a/sys/fs/hpfs/hpfs_vfsops.c b/sys/fs/hpfs/hpfs_vfsops.c index 1242e84..225f340 100644 --- a/sys/fs/hpfs/hpfs_vfsops.c +++ b/sys/fs/hpfs/hpfs_vfsops.c @@ -577,7 +577,7 @@ static struct vfsops hpfs_vfsops = { hpfs_root, vfs_stdquotactl, hpfs_statfs, - vfs_stdsync, + vfs_stdnosync, hpfs_vget, hpfs_fhtovp, vfs_stdcheckexp, diff --git a/sys/fs/ntfs/ntfs_vfsops.c b/sys/fs/ntfs/ntfs_vfsops.c index 1e267a9..2506b28 100644 --- a/sys/fs/ntfs/ntfs_vfsops.c +++ b/sys/fs/ntfs/ntfs_vfsops.c @@ -781,7 +781,7 @@ static struct vfsops ntfs_vfsops = { ntfs_root, vfs_stdquotactl, ntfs_statfs, - vfs_stdsync, + vfs_stdnosync, ntfs_vget, ntfs_fhtovp, vfs_stdcheckexp, diff --git a/sys/fs/nwfs/nwfs_vfsops.c b/sys/fs/nwfs/nwfs_vfsops.c index f097b3e..868bcec 100644 --- a/sys/fs/nwfs/nwfs_vfsops.c +++ b/sys/fs/nwfs/nwfs_vfsops.c @@ -76,7 +76,6 @@ static int nwfs_quotactl(struct mount *, int, uid_t, caddr_t, struct thread *); static int nwfs_root(struct mount *, struct vnode **); static int nwfs_start(struct mount *, int, struct thread *); static int nwfs_statfs(struct mount *, struct statfs *, struct thread *); -static int nwfs_sync(struct mount *, int, struct ucred *, struct thread *); static int nwfs_unmount(struct mount *, int, struct thread *); static int nwfs_init(struct vfsconf *vfsp); static int nwfs_uninit(struct vfsconf *vfsp); @@ -88,7 +87,7 @@ static struct vfsops nwfs_vfsops = { nwfs_root, nwfs_quotactl, nwfs_statfs, - nwfs_sync, + vfs_stdsync, vfs_stdvget, vfs_stdfhtovp, /* shouldn't happen */ vfs_stdcheckexp, @@ -460,53 +459,3 @@ nwfs_statfs(mp, sbp, td) strncpy(sbp->f_fstypename, mp->mnt_vfc->vfc_name, MFSNAMELEN); return 0; } - -/* - * Flush out the buffer cache - */ -/* ARGSUSED */ -static int -nwfs_sync(mp, waitfor, cred, td) - struct mount *mp; - int waitfor; - struct ucred *cred; - struct thread *td; -{ - struct vnode *vp, *nvp; - int error, allerror = 0; - /* - * Force stale buffer cache information to be flushed. - */ - mtx_lock(&mntvnode_mtx); -loop: - for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); - vp != NULL; - vp = nvp) { - /* - * If the vnode that we are about to sync is no longer - * associated with this mount point, start over. - */ - if (vp->v_mount != mp) - goto loop; - nvp = TAILQ_NEXT(vp, v_nmntvnodes); - mtx_unlock(&mntvnode_mtx); - VI_LOCK(vp); - if (VOP_ISLOCKED(vp, NULL) || TAILQ_EMPTY(&vp->v_dirtyblkhd) || - waitfor == MNT_LAZY) { - VI_UNLOCK(vp); - mtx_lock(&mntvnode_mtx); - continue; - } - if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) { - mtx_lock(&mntvnode_mtx); - goto loop; - } - error = VOP_FSYNC(vp, cred, waitfor, td); - if (error) - allerror = error; - vput(vp); - mtx_lock(&mntvnode_mtx); - } - mtx_unlock(&mntvnode_mtx); - return (allerror); -} diff --git a/sys/fs/portalfs/portal_vfsops.c b/sys/fs/portalfs/portal_vfsops.c index 66e516d..f731dc0 100644 --- a/sys/fs/portalfs/portal_vfsops.c +++ b/sys/fs/portalfs/portal_vfsops.c @@ -249,7 +249,7 @@ static struct vfsops portal_vfsops = { portal_root, vfs_stdquotactl, portal_statfs, - vfs_stdsync, + vfs_stdnosync, vfs_stdvget, vfs_stdfhtovp, vfs_stdcheckexp, diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h index e09f25d..3c9b34a 100644 --- a/sys/fs/pseudofs/pseudofs.h +++ b/sys/fs/pseudofs/pseudofs.h @@ -256,7 +256,7 @@ static struct vfsops name##_vfsops = { \ pfs_root, \ vfs_stdquotactl, \ pfs_statfs, \ - vfs_stdsync, \ + vfs_stdnosync, \ vfs_stdvget, \ vfs_stdfhtovp, \ vfs_stdcheckexp, \ diff --git a/sys/fs/smbfs/smbfs_vfsops.c b/sys/fs/smbfs/smbfs_vfsops.c index b1d1c68..17ce21d 100644 --- a/sys/fs/smbfs/smbfs_vfsops.c +++ b/sys/fs/smbfs/smbfs_vfsops.c @@ -83,7 +83,6 @@ static int smbfs_quotactl(struct mount *, int, uid_t, caddr_t, struct thread *); static int smbfs_root(struct mount *, struct vnode **); static int smbfs_start(struct mount *, int, struct thread *); static int smbfs_statfs(struct mount *, struct statfs *, struct thread *); -static int smbfs_sync(struct mount *, int, struct ucred *, struct thread *); static int smbfs_unmount(struct mount *, int, struct thread *); static int smbfs_init(struct vfsconf *vfsp); static int smbfs_uninit(struct vfsconf *vfsp); @@ -95,7 +94,7 @@ static struct vfsops smbfs_vfsops = { smbfs_root, smbfs_quotactl, smbfs_statfs, - smbfs_sync, + vfs_stdsync, vfs_stdvget, vfs_stdfhtovp, /* shouldn't happen */ vfs_stdcheckexp, @@ -401,46 +400,3 @@ smbfs_statfs(struct mount *mp, struct statfs *sbp, struct thread *td) strncpy(sbp->f_fstypename, mp->mnt_vfc->vfc_name, MFSNAMELEN); return 0; } - -/* - * Flush out the buffer cache - */ -/* ARGSUSED */ -static int -smbfs_sync(mp, waitfor, cred, td) - struct mount *mp; - int waitfor; - struct ucred *cred; - struct thread *td; -{ - struct vnode *vp; - int error, allerror = 0; - /* - * Force stale buffer cache information to be flushed. - */ -loop: - for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); - vp != NULL; - vp = TAILQ_NEXT(vp, v_nmntvnodes)) { - /* - * If the vnode that we are about to sync is no longer - * associated with this mount point, start over. - */ - if (vp->v_mount != mp) - goto loop; - VI_LOCK(vp); - if (VOP_ISLOCKED(vp, NULL) || TAILQ_EMPTY(&vp->v_dirtyblkhd) || - waitfor == MNT_LAZY) { - VI_UNLOCK(vp); - continue; - } - if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) - goto loop; - error = VOP_FSYNC(vp, cred, waitfor, td); - if (error) - allerror = error; - vput(vp); - } - return (allerror); -} - diff --git a/sys/fs/udf/udf_vfsops.c b/sys/fs/udf/udf_vfsops.c index b41b86b..fed899e 100644 --- a/sys/fs/udf/udf_vfsops.c +++ b/sys/fs/udf/udf_vfsops.c @@ -119,7 +119,7 @@ static struct vfsops udf_vfsops = { udf_root, vfs_stdquotactl, udf_statfs, - vfs_stdsync, + vfs_stdnosync, udf_vget, udf_fhtovp, vfs_stdcheckexp, diff --git a/sys/fs/umapfs/umap_vfsops.c b/sys/fs/umapfs/umap_vfsops.c index c1ed751..17bee46 100644 --- a/sys/fs/umapfs/umap_vfsops.c +++ b/sys/fs/umapfs/umap_vfsops.c @@ -443,7 +443,7 @@ static struct vfsops umap_vfsops = { umapfs_root, umapfs_quotactl, umapfs_statfs, - vfs_stdsync, + vfs_stdnosync, umapfs_vget, umapfs_fhtovp, umapfs_checkexp, diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c index 637b350..0da935e 100644 --- a/sys/fs/unionfs/union_vfsops.c +++ b/sys/fs/unionfs/union_vfsops.c @@ -502,7 +502,7 @@ static struct vfsops union_vfsops = { union_root, vfs_stdquotactl, union_statfs, - vfs_stdsync, /* XXX assumes no cached data on union level */ + vfs_stdnosync, /* XXX assumes no cached data on union level */ vfs_stdvget, vfs_stdfhtovp, vfs_stdcheckexp, diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c index a44df4c..b5aff73 100644 --- a/sys/isofs/cd9660/cd9660_vfsops.c +++ b/sys/isofs/cd9660/cd9660_vfsops.c @@ -79,7 +79,7 @@ static struct vfsops cd9660_vfsops = { cd9660_root, vfs_stdquotactl, cd9660_statfs, - vfs_stdsync, + vfs_stdnosync, cd9660_vget, cd9660_fhtovp, vfs_stdcheckexp, diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index 10d1154..1921abf 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -879,7 +879,62 @@ vfs_stdquotactl (mp, cmds, uid, arg, td) } int -vfs_stdsync (mp, waitfor, cred, td) +vfs_stdsync(mp, waitfor, cred, td) + struct mount *mp; + int waitfor; + struct ucred *cred; + struct thread *td; +{ + struct vnode *vp, *nvp; + int error, lockreq, allerror = 0; + + lockreq = LK_EXCLUSIVE | LK_INTERLOCK; + if (waitfor != MNT_WAIT) + lockreq |= LK_NOWAIT; + /* + * Force stale buffer cache information to be flushed. + */ + mtx_lock(&mntvnode_mtx); +loop: + for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nvp) { + /* + * If the vnode that we are about to sync is no longer + * associated with this mount point, start over. + */ + if (vp->v_mount != mp) + goto loop; + + nvp = TAILQ_NEXT(vp, v_nmntvnodes); + + VI_LOCK(vp); + if (TAILQ_EMPTY(&vp->v_dirtyblkhd)) { + VI_UNLOCK(vp); + continue; + } + mtx_unlock(&mntvnode_mtx); + + if ((error = vget(vp, lockreq, td)) != 0) { + if (error == ENOENT) + goto loop; + continue; + } + error = VOP_FSYNC(vp, cred, waitfor, td); + if (error) + allerror = error; + + mtx_lock(&mntvnode_mtx); + if (nvp != TAILQ_NEXT(vp, v_nmntvnodes)) { + vput(vp); + goto loop; + } + vput(vp); + } + mtx_unlock(&mntvnode_mtx); + return (allerror); +} + +int +vfs_stdnosync (mp, waitfor, cred, td) struct mount *mp; int waitfor; struct ucred *cred; diff --git a/sys/sys/mount.h b/sys/sys/mount.h index 7c4a935..0d834e7 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -499,6 +499,7 @@ vfs_root_t vfs_stdroot; vfs_quotactl_t vfs_stdquotactl; vfs_statfs_t vfs_stdstatfs; vfs_sync_t vfs_stdsync; +vfs_sync_t vfs_stdnosync; vfs_vget_t vfs_stdvget; vfs_fhtovp_t vfs_stdfhtovp; vfs_checkexp_t vfs_stdcheckexp; |