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-12 mailing list