Index: swap_pager.c =================================================================== --- swap_pager.c +++ swap_pager.c @@ -906,10 +906,19 @@ for (i = 0; i < size; i += n) { n = size - i; blk = swp_pager_getswapspace(&n, 1); + if (blk == SWAPBLK_NONE && n_free > 0) { + blk = s_free; + if (n < n_free) { + s_free += n; + n_free -= n; + } else { + n = n_free; + swp_pager_init_freerange(&s_free, &n_free); + } + } if (blk == SWAPBLK_NONE) { swp_pager_meta_free(object, start, i); - VM_OBJECT_WUNLOCK(object); - return (-1); + break; } for (j = 0; j < n; ++j) { addr = swp_pager_meta_build(object, @@ -921,7 +930,7 @@ } swp_pager_freeswapspace(s_free, n_free); VM_OBJECT_WUNLOCK(object); - return (0); + return (i == size ? 0 : -1); } /*