svn commit: r359665 - in stable/12/sys: kern ufs/ffs vm
Konstantin Belousov
kib at FreeBSD.org
Mon Apr 6 18:48:56 UTC 2020
Author: kib
Date: Mon Apr 6 18:48:55 2020
New Revision: 359665
URL: https://svnweb.freebsd.org/changeset/base/359665
Log:
MFC r359466:
VOP_GETPAGES_ASYNC(): consistently call iodone() callback in case of error.
Modified:
stable/12/sys/kern/vfs_default.c
stable/12/sys/ufs/ffs/ffs_vnops.c
stable/12/sys/vm/vnode_pager.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/kern/vfs_default.c
==============================================================================
--- stable/12/sys/kern/vfs_default.c Mon Apr 6 18:47:15 2020 (r359664)
+++ stable/12/sys/kern/vfs_default.c Mon Apr 6 18:48:55 2020 (r359665)
@@ -682,7 +682,8 @@ vop_stdgetpages_async(struct vop_getpages_async_args *
error = VOP_GETPAGES(ap->a_vp, ap->a_m, ap->a_count, ap->a_rbehind,
ap->a_rahead);
- ap->a_iodone(ap->a_arg, ap->a_m, ap->a_count, error);
+ if (ap->a_iodone != NULL)
+ ap->a_iodone(ap->a_arg, ap->a_m, ap->a_count, error);
return (error);
}
Modified: stable/12/sys/ufs/ffs/ffs_vnops.c
==============================================================================
--- stable/12/sys/ufs/ffs/ffs_vnops.c Mon Apr 6 18:47:15 2020 (r359664)
+++ stable/12/sys/ufs/ffs/ffs_vnops.c Mon Apr 6 18:48:55 2020 (r359665)
@@ -1749,18 +1749,25 @@ ffs_getpages_async(struct vop_getpages_async_args *ap)
{
struct vnode *vp;
struct ufsmount *um;
+ bool do_iodone;
int error;
vp = ap->a_vp;
um = VFSTOUFS(vp->v_mount);
+ do_iodone = true;
- if (um->um_devvp->v_bufobj.bo_bsize <= PAGE_SIZE)
- return (vnode_pager_generic_getpages(vp, ap->a_m, ap->a_count,
- ap->a_rbehind, ap->a_rahead, ap->a_iodone, ap->a_arg));
-
- error = vfs_bio_getpages(vp, ap->a_m, ap->a_count, ap->a_rbehind,
- ap->a_rahead, ffs_gbp_getblkno, ffs_gbp_getblksz);
- ap->a_iodone(ap->a_arg, ap->a_m, ap->a_count, error);
+ if (um->um_devvp->v_bufobj.bo_bsize <= PAGE_SIZE) {
+ error = vnode_pager_generic_getpages(vp, ap->a_m, ap->a_count,
+ ap->a_rbehind, ap->a_rahead, ap->a_iodone, ap->a_arg);
+ if (error == 0)
+ do_iodone = false;
+ } else {
+ error = vfs_bio_getpages(vp, ap->a_m, ap->a_count,
+ ap->a_rbehind, ap->a_rahead, ffs_gbp_getblkno,
+ ffs_gbp_getblksz);
+ }
+ if (do_iodone && ap->a_iodone != NULL)
+ ap->a_iodone(ap->a_arg, ap->a_m, ap->a_count, error);
return (error);
}
Modified: stable/12/sys/vm/vnode_pager.c
==============================================================================
--- stable/12/sys/vm/vnode_pager.c Mon Apr 6 18:47:15 2020 (r359664)
+++ stable/12/sys/vm/vnode_pager.c Mon Apr 6 18:48:55 2020 (r359665)
@@ -767,9 +767,13 @@ vnode_pager_local_getpages(struct vop_getpages_args *a
int
vnode_pager_local_getpages_async(struct vop_getpages_async_args *ap)
{
+ int error;
- return (vnode_pager_generic_getpages(ap->a_vp, ap->a_m, ap->a_count,
- ap->a_rbehind, ap->a_rahead, ap->a_iodone, ap->a_arg));
+ error = vnode_pager_generic_getpages(ap->a_vp, ap->a_m, ap->a_count,
+ ap->a_rbehind, ap->a_rahead, ap->a_iodone, ap->a_arg);
+ if (error != 0 && ap->a_iodone != NULL)
+ ap->a_iodone(ap->a_arg, ap->a_m, ap->a_count, error);
+ return (error);
}
/*
More information about the svn-src-stable
mailing list