From nobody Thu Jan 11 16:45:18 2024 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4T9rBR2PvTz56RHS; Thu, 11 Jan 2024 16:45:19 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4T9rBQ5mYYz4vH4; Thu, 11 Jan 2024 16:45:18 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1704991518; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=PWjBbN0e6d3l6plwPZ/f+3jfRHzjePqcct9N7Q6ZRLo=; b=qL4v+K6Ty7sQ1exodwT6ml965uL/phtnrRXkd95FO4gEbx6hLlGTFTmTR5GF5mDXViAbGR PPlG3LyrAb7GH/15VNukOA4kYgucUn4PQTxIVd0m0JvoQ/Rtwh2TxryqSt43fRDcVN+ZPg rysP0OI9d/InOAEjPmkHg28vF2piB6pZky6Zy1jjVWnn6C79IKU/FMG8cHoyOmxK+WQlTf jUhVBtZwHVz1dHGSPmUZiSDbRRLc41OiNUuDFNH8J1IYFXm9ux8BwGC4h6FXy7MQoaRzhG ZLswhAlpzWHUMiOksbxt68TGo86fg3cpXeRmahsYB+z4vfF025nB7YJfI8ZGng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1704991518; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=PWjBbN0e6d3l6plwPZ/f+3jfRHzjePqcct9N7Q6ZRLo=; b=iiZUo+hVfPz2JsVyGE3fBNj5cA+vni4+4NU7vx3NroGy7lZ+iD0wYxQT+h3WIJGaGLfC43 vTjHLJT3BcuoV3FFTt/QWkolcabX/TKuQQOTdlJAG1bcdsvgxIkwxtZtLKSwq+w7cAlb+V 1u5f5PtJzrtp0mo98Ix0XaTLoqNw9qp7QG4j9XtZwNm45PEIqCNCs3YZJY4yCsUp9PKqup fsYZ+u4eQkNYHSMTqt9NWln/CUEuJWYeGKLv+EQLPxvRODyTVhzp+Y6xzdOOCkU+0CqXZJ rapRP2wwD9jKei/avqMAfxMpd+ra7pppaVOPGsReEEjRWQuSWOu10PazCKW1XA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1704991518; a=rsa-sha256; cv=none; b=A0wJEoxLmBMcGyou+jbFiglGWhkxZxDVZyStnck5KmVVtLBjGO43yRDPInBqJZmL1+okWR JX8nRMv3a0GhscEvA7+/t7doaA6TvlS6TO78mkIMWPz+1FD9upQUuPbU4YzrqnS0b8hpky kvbwOddIMvhvEn6rEDpj3PqsX3itFBEuBpdz0KTYXW40kbGML/deolbFLrCiwQ1ARHPgjT 8vsqSB7EPhy8/avHW5VPilDMjN4lkkbqugn43eFWDyYps3ix8Nr1c5wctlBfSV2PX/6l6u qpjsSTXNMbT5VtRIxTDd09Mkb1eORRWTyZCxgM8f3ZwFYELuFRlqpMbNdbZ6ng== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4T9rBQ4r4HzR0G; Thu, 11 Jan 2024 16:45:18 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 40BGjI5A045485; Thu, 11 Jan 2024 16:45:18 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 40BGjIHb045482; Thu, 11 Jan 2024 16:45:18 GMT (envelope-from git) Date: Thu, 11 Jan 2024 16:45:18 GMT Message-Id: <202401111645.40BGjIHb045482@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: b068bb09a1a8 - main - Add vnode_pager_clean_{a,}sync(9) List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: b068bb09a1a82d9fef0e939ad6135443a959e290 Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=b068bb09a1a82d9fef0e939ad6135443a959e290 commit b068bb09a1a82d9fef0e939ad6135443a959e290 Author: Konstantin Belousov AuthorDate: 2024-01-08 05:18:40 +0000 Commit: Konstantin Belousov CommitDate: 2024-01-11 16:44:53 +0000 Add vnode_pager_clean_{a,}sync(9) Bump __FreeBSD_version for ZFS use. Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D43356 --- .../openzfs/include/os/freebsd/spl/sys/vnode.h | 9 +++--- sys/fs/fuse/fuse_io.c | 7 ++-- sys/fs/nfsclient/nfs_clbio.c | 8 ++--- sys/fs/nfsclient/nfs_clnode.c | 17 +++------- sys/fs/nfsclient/nfs_clvnops.c | 27 ++++------------ sys/fs/nfsserver/nfs_nfsdport.c | 8 ++--- sys/fs/smbfs/smbfs_io.c | 7 +--- sys/kern/vfs_aio.c | 9 ++---- sys/kern/vfs_subr.c | 37 ++++++++-------------- sys/kern/vfs_syscalls.c | 7 ++-- sys/kern/vfs_vnops.c | 9 ++---- sys/sys/param.h | 2 +- sys/ufs/ffs/ffs_rawread.c | 14 +++----- sys/ufs/ufs/ufs_bmap.c | 9 ++---- sys/vm/vnode_pager.c | 27 ++++++++++++++++ sys/vm/vnode_pager.h | 3 ++ 16 files changed, 82 insertions(+), 118 deletions(-) diff --git a/sys/contrib/openzfs/include/os/freebsd/spl/sys/vnode.h b/sys/contrib/openzfs/include/os/freebsd/spl/sys/vnode.h index 75c32f221ffd..7a3b38736a58 100644 --- 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 @@ enum symfollow { NO_FOLLOW = NOFOLLOW }; #include #include #include +#include typedef struct vop_vector vnodeops_t; #define VOP_FID VOP_VPTOFH @@ -100,11 +101,11 @@ vn_flush_cached_data(vnode_t *vp, boolean_t sync) #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 index 63e28f5f46b7..00b348814642 100644 --- a/sys/fs/fuse/fuse_io.c +++ b/sys/fs/fuse/fuse_io.c @@ -95,6 +95,7 @@ #include #include #include +#include #include "fuse.h" #include "fuse_file.h" @@ -945,11 +946,7 @@ fuse_io_invalbuf(struct vnode *vp, struct thread *td) } 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 index f6506e34ee59..c027d7d7c3fd 100644 --- a/sys/fs/nfsclient/nfs_clbio.c +++ b/sys/fs/nfsclient/nfs_clbio.c @@ -1428,11 +1428,9 @@ ncl_vinvalbuf(struct vnode *vp, int flags, struct thread *td, int intrflg) /* * 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 index fdb94aee9139..be2024730cf0 100644 --- a/sys/fs/nfsclient/nfs_clnode.c +++ b/sys/fs/nfsclient/nfs_clnode.c @@ -47,6 +47,8 @@ #include #include +#include +#include #include #include @@ -236,7 +238,6 @@ ncl_inactive(struct vop_inactive_args *ap) struct vnode *vp = ap->a_vp; struct nfsnode *np; struct thread *td; - boolean_t retv; td = curthread; np = VTONFS(vp); @@ -250,17 +251,9 @@ ncl_inactive(struct vop_inactive_args *ap) * 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 index 3f1ab9741673..0014f8a26d20 100644 --- a/sys/fs/nfsclient/nfs_clvnops.c +++ b/sys/fs/nfsclient/nfs_clvnops.c @@ -67,6 +67,7 @@ #include #include #include +#include #include #include @@ -766,9 +767,7 @@ nfs_open(struct vop_open_args *ap) 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 @@ nfs_close(struct vop_close_args *ap) 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 @@ nfs_allocate(struct vop_allocate_args *ap) { 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 @@ nfs_allocate(struct vop_allocate_args *ap) * 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 @@ relock: 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 @@ static int 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 @@ nfs_ioctl(struct vop_ioctl_args *ap) * 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 index 374019a2a643..5eb16564cf00 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -51,6 +51,8 @@ #include #include #include +#include +#include FEATURE(nfsd, "NFSv4 server"); @@ -1715,11 +1717,7 @@ nfsvno_fsync(struct vnode *vp, u_int64_t off, int cnt, struct ucred *cred, /* * 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 index f09254289769..324f38abd10e 100644 --- a/sys/fs/smbfs/smbfs_io.c +++ b/sys/fs/smbfs/smbfs_io.c @@ -636,12 +636,7 @@ smbfs_vinvalbuf(struct vnode *vp, struct thread *td) } 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 index 0a0c1cd2f2a0..13f99a71ef04 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -67,6 +67,7 @@ #include #include #include +#include #include #include @@ -717,7 +718,6 @@ static int 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 @@ aio_fsync_vnode(struct thread *td, struct vnode *vp, int op) 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 index e18c34656af4..20e220135b15 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -94,6 +94,7 @@ #include #include #include +#include #include #if defined(DEBUG_VFS_LOCKS) && (!defined(INVARIANTS) || !defined(WITNESS)) @@ -3989,7 +3990,6 @@ vdrop_recycle(struct vnode *vp) static int vinactivef(struct vnode *vp) { - struct vm_object *obj; int error; ASSERT_VOP_ELOCKED(vp, "vinactive"); @@ -3999,6 +3999,7 @@ vinactivef(struct vnode *vp) 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 @@ vinactivef(struct vnode *vp) * 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 @@ loop: * 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 @@ static void __noinline 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 @@ vfs_periodic_msync_inactive(struct mount *mp, int flags) 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 index 1401cc6da667..c739b5d5beaa 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -83,6 +83,7 @@ #include #include #include +#include #include #include @@ -3546,11 +3547,7 @@ retry: 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 index 1852f2b1ef00..40596263d551 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -88,6 +88,7 @@ #include #include #include +#include #ifdef HWPMC_HOOKS #include @@ -2575,7 +2576,6 @@ int 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 @@ vn_bmap_seekhole_locked(struct vnode *vp, u_long cmd, off_t *off, } /* 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 index de6b56dd748a..33b07a431813 100644 --- 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 index ef93c1ab6783..3a415d766303 100644 --- a/sys/ufs/ffs/ffs_rawread.c +++ b/sys/ufs/ffs/ffs_rawread.c @@ -52,6 +52,7 @@ #include #include #include +#include static int ffs_rawread_readahead(struct vnode *vp, caddr_t udata, @@ -132,15 +133,10 @@ ffs_rawread_sync(struct vnode *vp) 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 index 14775cace408..9d21eaa0cb56 100644 --- a/sys/ufs/ufs/ufs_bmap.c +++ b/sys/ufs/ufs/ufs_bmap.c @@ -48,6 +48,7 @@ #include #include +#include #include #include @@ -347,7 +348,6 @@ ufs_bmap_seekdata(struct vnode *vp, off_t *offp) 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 @@ ufs_bmap_seekdata(struct vnode *vp, off_t *offp) * 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.c b/sys/vm/vnode_pager.c index f9fb1ba23655..d32fec845043 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -1690,3 +1690,30 @@ vnode_pager_getvp(vm_object_t object, struct vnode **vpp, bool *vp_heldp) { *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); +} diff --git a/sys/vm/vnode_pager.h b/sys/vm/vnode_pager.h index 77252a4fc9c2..7b8d79022a31 100644 --- 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);