Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109469583
D43356.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
14 KB
Referenced Files
None
Subscribers
None
D43356.diff
View Options
diff --git a/sys/contrib/openzfs/include/os/freebsd/spl/sys/vnode.h b/sys/contrib/openzfs/include/os/freebsd/spl/sys/vnode.h
--- a/sys/contrib/openzfs/include/os/freebsd/spl/sys/vnode.h
+++ b/sys/contrib/openzfs/include/os/freebsd/spl/sys/vnode.h
@@ -66,6 +66,7 @@
#include <sys/syscallsubr.h>
#include <sys/vm.h>
#include <vm/vm_object.h>
+#include <vm/vnode_pager.h>
typedef struct vop_vector vnodeops_t;
#define VOP_FID VOP_VPTOFH
@@ -100,11 +101,11 @@
#else
if (vp->v_object->flags & OBJ_MIGHTBEDIRTY) {
#endif
- int flags = sync ? OBJPC_SYNC : 0;
vn_lock(vp, LK_SHARED | LK_RETRY);
- zfs_vmobject_wlock(vp->v_object);
- vm_object_page_clean(vp->v_object, 0, 0, flags);
- zfs_vmobject_wunlock(vp->v_object);
+ if (sync)
+ vnode_pager_clean_sync(vp);
+ else
+ vnode_pager_clean_async(vp);
VOP_UNLOCK1(vp);
}
}
diff --git a/sys/fs/fuse/fuse_io.c b/sys/fs/fuse/fuse_io.c
--- a/sys/fs/fuse/fuse_io.c
+++ b/sys/fs/fuse/fuse_io.c
@@ -95,6 +95,7 @@
#include <vm/vm_map.h>
#include <vm/vm_page.h>
#include <vm/vm_object.h>
+#include <vm/vnode_pager.h>
#include "fuse.h"
#include "fuse_file.h"
@@ -945,11 +946,7 @@
}
fvdat->flag |= FN_FLUSHINPROG;
- if (vp->v_bufobj.bo_object != NULL) {
- VM_OBJECT_WLOCK(vp->v_bufobj.bo_object);
- vm_object_page_clean(vp->v_bufobj.bo_object, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(vp->v_bufobj.bo_object);
- }
+ vnode_pager_clean_sync(vp);
error = vinvalbuf(vp, V_SAVE, PCATCH, 0);
while (error) {
if (error == ERESTART || error == EINTR) {
diff --git a/sys/fs/nfsclient/nfs_clbio.c b/sys/fs/nfsclient/nfs_clbio.c
--- a/sys/fs/nfsclient/nfs_clbio.c
+++ b/sys/fs/nfsclient/nfs_clbio.c
@@ -1428,11 +1428,9 @@
/*
* Now, flush as required.
*/
- if ((flags & (V_SAVE | V_VMIO)) == V_SAVE &&
- vp->v_bufobj.bo_object != NULL) {
- VM_OBJECT_WLOCK(vp->v_bufobj.bo_object);
- vm_object_page_clean(vp->v_bufobj.bo_object, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(vp->v_bufobj.bo_object);
+ if ((flags & (V_SAVE | V_VMIO)) == V_SAVE) {
+ vnode_pager_clean_sync(vp);
+
/*
* If the page clean was interrupted, fail the invalidation.
* Not doing so, we run the risk of losing dirty pages in the
diff --git a/sys/fs/nfsclient/nfs_clnode.c b/sys/fs/nfsclient/nfs_clnode.c
--- a/sys/fs/nfsclient/nfs_clnode.c
+++ b/sys/fs/nfsclient/nfs_clnode.c
@@ -47,6 +47,8 @@
#include <sys/taskqueue.h>
#include <sys/vnode.h>
+#include <vm/vm_param.h>
+#include <vm/vnode_pager.h>
#include <vm/uma.h>
#include <fs/nfs/nfsport.h>
@@ -236,7 +238,6 @@
struct vnode *vp = ap->a_vp;
struct nfsnode *np;
struct thread *td;
- boolean_t retv;
td = curthread;
np = VTONFS(vp);
@@ -250,17 +251,9 @@
* buffers/pages must be flushed before the close, so that the
* stateid is available for the writes.
*/
- if (vp->v_object != NULL) {
- VM_OBJECT_WLOCK(vp->v_object);
- retv = vm_object_page_clean(vp->v_object, 0, 0,
- OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(vp->v_object);
- } else
- retv = TRUE;
- if (retv == TRUE) {
- (void)ncl_flush(vp, MNT_WAIT, td, 1, 0);
- (void)nfsrpc_close(vp, 1, td);
- }
+ vnode_pager_clean_sync(vp);
+ (void)ncl_flush(vp, MNT_WAIT, td, 1, 0);
+ (void)nfsrpc_close(vp, 1, td);
}
NFSLOCKNODE(np);
diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c
--- a/sys/fs/nfsclient/nfs_clvnops.c
+++ b/sys/fs/nfsclient/nfs_clvnops.c
@@ -67,6 +67,7 @@
#include <vm/vm.h>
#include <vm/vm_extern.h>
#include <vm/vm_object.h>
+#include <vm/vnode_pager.h>
#include <fs/nfs/nfsport.h>
#include <fs/nfsclient/nfsnode.h>
@@ -766,9 +767,7 @@
if (VN_IS_DOOMED(vp))
return (EBADF);
}
- VM_OBJECT_WLOCK(obj);
- vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(obj);
+ vnode_pager_clean_sync(vp);
}
/* Now, flush the buffer cache. */
@@ -854,9 +853,7 @@
if (VN_IS_DOOMED(vp) && ap->a_fflag != FNONBLOCK)
return (EBADF);
}
- VM_OBJECT_WLOCK(vp->v_object);
- vm_object_page_clean(vp->v_object, 0, 0, 0);
- VM_OBJECT_WUNLOCK(vp->v_object);
+ vnode_pager_clean_async(vp);
}
NFSLOCKNODE(np);
if (np->n_flag & NMODIFIED) {
@@ -3637,7 +3634,6 @@
{
struct vnode *vp = ap->a_vp;
struct thread *td = curthread;
- vm_object_t obj;
struct nfsvattr nfsva;
struct nfsmount *nmp;
struct nfsnode *np;
@@ -3667,12 +3663,7 @@
* file's allocation on the server.
*/
if (error == 0) {
- obj = vp->v_object;
- if (obj != NULL) {
- VM_OBJECT_WLOCK(obj);
- vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(obj);
- }
+ vnode_pager_clean_sync(vp);
error = ncl_flush(vp, MNT_WAIT, td, 1, 0);
}
if (error == 0)
@@ -3908,9 +3899,7 @@
vn_finished_write(mp);
goto relock;
}
- VM_OBJECT_WLOCK(invp_obj);
- vm_object_page_clean(invp_obj, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(invp_obj);
+ vnode_pager_clean_sync(invp);
}
error = ncl_flush(invp, MNT_WAIT, curthread, 1, 0);
}
@@ -4069,7 +4058,6 @@
nfs_ioctl(struct vop_ioctl_args *ap)
{
struct vnode *vp = ap->a_vp;
- vm_object_t obj;
struct nfsvattr nfsva;
struct nfsmount *nmp;
int attrflag, content, error, ret;
@@ -4114,10 +4102,7 @@
* size is up to date on the Metadata Server.
*/
- obj = vp->v_object;
- VM_OBJECT_WLOCK(obj);
- vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(obj);
+ vnode_pager_clean_sync(vp);
error = ncl_flush(vp, MNT_WAIT, ap->a_td, 1, 0);
if (error == 0)
error = nfsrpc_seek(vp, (off_t *)ap->a_data, &eof,
diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -51,6 +51,8 @@
#include <sys/sysctl.h>
#include <nlm/nlm_prot.h>
#include <nlm/nlm.h>
+#include <vm/vm_param.h>
+#include <vm/vnode_pager.h>
FEATURE(nfsd, "NFSv4 server");
@@ -1715,11 +1717,7 @@
/*
* Give up and do the whole thing
*/
- if (vp->v_object && vm_object_mightbedirty(vp->v_object)) {
- VM_OBJECT_WLOCK(vp->v_object);
- vm_object_page_clean(vp->v_object, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(vp->v_object);
- }
+ vnode_pager_clean_sync(vp);
error = VOP_FSYNC(vp, MNT_WAIT, td);
} else {
/*
diff --git a/sys/fs/smbfs/smbfs_io.c b/sys/fs/smbfs/smbfs_io.c
--- a/sys/fs/smbfs/smbfs_io.c
+++ b/sys/fs/smbfs/smbfs_io.c
@@ -636,12 +636,7 @@
}
np->n_flag |= NFLUSHINPROG;
- if (vp->v_bufobj.bo_object != NULL) {
- VM_OBJECT_WLOCK(vp->v_bufobj.bo_object);
- vm_object_page_clean(vp->v_bufobj.bo_object, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(vp->v_bufobj.bo_object);
- }
-
+ vnode_pager_clean_sync(vp);
error = vinvalbuf(vp, V_SAVE, PCATCH, 0);
while (error) {
if (error == ERESTART || error == EINTR) {
diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c
--- a/sys/kern/vfs_aio.c
+++ b/sys/kern/vfs_aio.c
@@ -67,6 +67,7 @@
#include <vm/pmap.h>
#include <vm/vm_map.h>
#include <vm/vm_object.h>
+#include <vm/vnode_pager.h>
#include <vm/uma.h>
#include <sys/aio.h>
@@ -717,7 +718,6 @@
aio_fsync_vnode(struct thread *td, struct vnode *vp, int op)
{
struct mount *mp;
- vm_object_t obj;
int error;
for (;;) {
@@ -725,12 +725,7 @@
if (error != 0)
break;
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
- obj = vp->v_object;
- if (obj != NULL) {
- VM_OBJECT_WLOCK(obj);
- vm_object_page_clean(obj, 0, 0, 0);
- VM_OBJECT_WUNLOCK(obj);
- }
+ vnode_pager_clean_async(vp);
if (op == LIO_DSYNC)
error = VOP_FDATASYNC(vp, td);
else
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -94,6 +94,7 @@
#include <vm/vm_map.h>
#include <vm/vm_page.h>
#include <vm/vm_kern.h>
+#include <vm/vnode_pager.h>
#include <vm/uma.h>
#if defined(DEBUG_VFS_LOCKS) && (!defined(INVARIANTS) || !defined(WITNESS))
@@ -3989,7 +3990,6 @@
static int
vinactivef(struct vnode *vp)
{
- struct vm_object *obj;
int error;
ASSERT_VOP_ELOCKED(vp, "vinactive");
@@ -3999,6 +3999,7 @@
vp->v_iflag |= VI_DOINGINACT;
vp->v_iflag &= ~VI_OWEINACT;
VI_UNLOCK(vp);
+
/*
* Before moving off the active list, we must be sure that any
* modified pages are converted into the vnode's dirty
@@ -4009,12 +4010,9 @@
* point that VOP_INACTIVE() is called, there could still be
* pending I/O and dirty pages in the object.
*/
- if ((obj = vp->v_object) != NULL && (vp->v_vflag & VV_NOSYNC) == 0 &&
- vm_object_mightbedirty(obj)) {
- VM_OBJECT_WLOCK(obj);
- vm_object_page_clean(obj, 0, 0, 0);
- VM_OBJECT_WUNLOCK(obj);
- }
+ if ((vp->v_vflag & VV_NOSYNC) == 0)
+ vnode_pager_clean_async(vp);
+
error = VOP_INACTIVE(vp);
VI_LOCK(vp);
VNPASS(vp->v_iflag & VI_DOINGINACT, vp);
@@ -4112,11 +4110,7 @@
* vnodes open for writing.
*/
if (flags & WRITECLOSE) {
- if (vp->v_object != NULL) {
- VM_OBJECT_WLOCK(vp->v_object);
- vm_object_page_clean(vp->v_object, 0, 0, 0);
- VM_OBJECT_WUNLOCK(vp->v_object);
- }
+ vnode_pager_clean_async(vp);
do {
error = VOP_FSYNC(vp, MNT_WAIT, td);
} while (error == ERELOOKUP);
@@ -5094,17 +5088,12 @@
vfs_periodic_msync_inactive(struct mount *mp, int flags)
{
struct vnode *vp, *mvp;
- struct vm_object *obj;
- int lkflags, objflags;
+ int lkflags;
bool seen_defer;
lkflags = LK_EXCLUSIVE | LK_INTERLOCK;
- if (flags != MNT_WAIT) {
+ if (flags != MNT_WAIT)
lkflags |= LK_NOWAIT;
- objflags = OBJPC_NOSYNC;
- } else {
- objflags = OBJPC_SYNC;
- }
MNT_VNODE_FOREACH_LAZY(vp, mp, mvp, vfs_periodic_msync_inactive_filter, NULL) {
seen_defer = false;
@@ -5120,11 +5109,11 @@
continue;
}
if (vget(vp, lkflags) == 0) {
- obj = vp->v_object;
- if (obj != NULL && (vp->v_vflag & VV_NOSYNC) == 0) {
- VM_OBJECT_WLOCK(obj);
- vm_object_page_clean(obj, 0, 0, objflags);
- VM_OBJECT_WUNLOCK(obj);
+ if ((vp->v_vflag & VV_NOSYNC) == 0) {
+ if (flags == MNT_WAIT)
+ vnode_pager_clean_sync(vp);
+ else
+ vnode_pager_clean_async(vp);
}
vput(vp);
if (seen_defer)
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -83,6 +83,7 @@
#include <vm/vm.h>
#include <vm/vm_object.h>
#include <vm/vm_page.h>
+#include <vm/vnode_pager.h>
#include <vm/uma.h>
#include <fs/devfs/devfs.h>
@@ -3546,11 +3547,7 @@
goto drop;
vn_lock(vp, vn_lktype_write(mp, vp) | LK_RETRY);
AUDIT_ARG_VNODE1(vp);
- if (vp->v_object != NULL) {
- VM_OBJECT_WLOCK(vp->v_object);
- vm_object_page_clean(vp->v_object, 0, 0, 0);
- VM_OBJECT_WUNLOCK(vp->v_object);
- }
+ vnode_pager_clean_async(vp);
error = fullsync ? VOP_FSYNC(vp, MNT_WAIT, td) : VOP_FDATASYNC(vp, td);
VOP_UNLOCK(vp);
vn_finished_write(mp);
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -88,6 +88,7 @@
#include <vm/vm_object.h>
#include <vm/vm_page.h>
#include <vm/vm_pager.h>
+#include <vm/vnode_pager.h>
#ifdef HWPMC_HOOKS
#include <sys/pmckern.h>
@@ -2575,7 +2576,6 @@
vn_bmap_seekhole_locked(struct vnode *vp, u_long cmd, off_t *off,
struct ucred *cred)
{
- vm_object_t obj;
off_t size;
daddr_t bn, bnp;
uint64_t bsize;
@@ -2600,12 +2600,7 @@
}
/* See the comment in ufs_bmap_seekdata(). */
- obj = vp->v_object;
- if (obj != NULL) {
- VM_OBJECT_WLOCK(obj);
- vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(obj);
- }
+ vnode_pager_clean_sync(vp);
bsize = vp->v_mount->mnt_stat.f_iosize;
for (bn = noff / bsize; noff < size; bn++, noff += bsize -
diff --git a/sys/sys/param.h b/sys/sys/param.h
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -73,7 +73,7 @@
* cannot include sys/param.h and should only be updated here.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1500008
+#define __FreeBSD_version 1500009
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
diff --git a/sys/ufs/ffs/ffs_rawread.c b/sys/ufs/ffs/ffs_rawread.c
--- a/sys/ufs/ffs/ffs_rawread.c
+++ b/sys/ufs/ffs/ffs_rawread.c
@@ -52,6 +52,7 @@
#include <vm/vm.h>
#include <vm/vm_extern.h>
#include <vm/vm_object.h>
+#include <vm/vnode_pager.h>
static int ffs_rawread_readahead(struct vnode *vp,
caddr_t udata,
@@ -132,15 +133,10 @@
vn_finished_write(mp);
return (EIO);
}
- /* Attempt to msync mmap() regions to clean dirty mmap */
- if ((obj = vp->v_object) != NULL &&
- vm_object_mightbedirty(obj)) {
- VI_UNLOCK(vp);
- VM_OBJECT_WLOCK(obj);
- vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(obj);
- } else
- VI_UNLOCK(vp);
+ VI_UNLOCK(vp);
+
+ /* Attempt to msync mmap() regions to clean dirty mmap */
+ vnode_pager_clean_sync(vp);
/* Wait for pending writes to complete */
BO_LOCK(bo);
diff --git a/sys/ufs/ufs/ufs_bmap.c b/sys/ufs/ufs/ufs_bmap.c
--- a/sys/ufs/ufs/ufs_bmap.c
+++ b/sys/ufs/ufs/ufs_bmap.c
@@ -48,6 +48,7 @@
#include <vm/vm.h>
#include <vm/vm_object.h>
+#include <vm/vnode_pager.h>
#include <ufs/ufs/extattr.h>
#include <ufs/ufs/quota.h>
@@ -347,7 +348,6 @@
struct inode *ip;
struct mount *mp;
struct ufsmount *ump;
- vm_object_t obj;
ufs2_daddr_t bn, daddr, nextbn;
uint64_t bsize;
off_t numblks;
@@ -370,12 +370,7 @@
* pages into buffer writes to ensure that we see all
* allocated data.
*/
- obj = vp->v_object;
- if (obj != NULL) {
- VM_OBJECT_WLOCK(obj);
- vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
- VM_OBJECT_WUNLOCK(obj);
- }
+ vnode_pager_clean_sync(vp);
bsize = mp->mnt_stat.f_iosize;
for (bn = *offp / bsize, numblks = howmany(ip->i_size, bsize);
diff --git a/sys/vm/vnode_pager.h b/sys/vm/vnode_pager.h
--- a/sys/vm/vnode_pager.h
+++ b/sys/vm/vnode_pager.h
@@ -39,6 +39,9 @@
#ifdef _KERNEL
+struct vnode;
+void vnode_pager_clean_sync(struct vnode *vp);
+void vnode_pager_clean_async(struct vnode *vp);
int vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m,
int count, int *rbehind, int *rahead, vop_getpages_iodone_t iodone,
void *arg);
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -1690,3 +1690,30 @@
{
*vpp = object->handle;
}
+
+static void
+vnode_pager_clean1(struct vnode *vp, int sync_flags)
+{
+ struct vm_object *obj;
+
+ ASSERT_VOP_LOCKED(vp, "needs lock for writes");
+ obj = vp->v_object;
+ if (obj == NULL)
+ return;
+
+ VM_OBJECT_WLOCK(obj);
+ vm_object_page_clean(obj, 0, 0, sync_flags);
+ VM_OBJECT_WUNLOCK(obj);
+}
+
+void
+vnode_pager_clean_sync(struct vnode *vp)
+{
+ vnode_pager_clean1(vp, OBJPC_SYNC);
+}
+
+void
+vnode_pager_clean_async(struct vnode *vp)
+{
+ vnode_pager_clean1(vp, 0);
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Feb 6, 11:53 AM (20 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16493026
Default Alt Text
D43356.diff (14 KB)
Attached To
Mode
D43356: Add vnode_pager_clean(9)
Attached
Detach File
Event Timeline
Log In to Comment