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
This commit is contained in:
Konstantin Belousov 2020-03-30 21:44:30 +00:00
parent e42b096439
commit abfdf76791
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=359466
3 changed files with 22 additions and 10 deletions

View file

@ -765,7 +765,8 @@ vop_stdgetpages_async(struct vop_getpages_async_args *ap)
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);
}

View file

@ -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);
}

View file

@ -776,9 +776,13 @@ vnode_pager_local_getpages(struct vop_getpages_args *ap)
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);
}
/*