svn commit: r359466 - in head/sys: kern ufs/ffs vm
Konstantin Belousov
kib at FreeBSD.org
Mon Mar 30 22:02:58 UTC 2020
Author: kib
Date: Mon Mar 30 21:44:30 2020
New Revision: 359466
URL: https://svnweb.freebsd.org/changeset/base/359466
Log:
VOP_GETPAGES_ASYNC(): consistently call iodone() callback in case of error.
Reviewed by: glebius, markj
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D24038
Modified:
head/sys/kern/vfs_default.c
head/sys/ufs/ffs/ffs_vnops.c
head/sys/vm/vnode_pager.c
Modified: head/sys/kern/vfs_default.c
==============================================================================
--- head/sys/kern/vfs_default.c Mon Mar 30 21:44:00 2020 (r359465)
+++ head/sys/kern/vfs_default.c Mon Mar 30 21:44:30 2020 (r359466)
@@ -765,7 +765,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: head/sys/ufs/ffs/ffs_vnops.c
==============================================================================
--- head/sys/ufs/ffs/ffs_vnops.c Mon Mar 30 21:44:00 2020 (r359465)
+++ head/sys/ufs/ffs/ffs_vnops.c Mon Mar 30 21:44:30 2020 (r359466)
@@ -1780,18 +1780,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: head/sys/vm/vnode_pager.c
==============================================================================
--- head/sys/vm/vnode_pager.c Mon Mar 30 21:44:00 2020 (r359465)
+++ head/sys/vm/vnode_pager.c Mon Mar 30 21:44:30 2020 (r359466)
@@ -776,9 +776,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-all
mailing list