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:
parent
e42b096439
commit
abfdf76791
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user