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);
 }
 
 /*
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to