diff options
Diffstat (limited to 'sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c')
-rw-r--r-- | sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c index d72fb92..425d791 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c @@ -272,18 +272,33 @@ zio_fini(void) * useful to inspect ZFS metadata, but if possible, we should avoid keeping * excess / transient data in-core during a crashdump. */ -void * -zio_buf_alloc(size_t size) +static void * +zio_buf_alloc_impl(size_t size, boolean_t canwait) { size_t c = (size - 1) >> SPA_MINBLOCKSHIFT; int flags = zio_exclude_metadata ? KM_NODEBUG : 0; VERIFY3U(c, <, SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT); - if (zio_use_uma) - return (kmem_cache_alloc(zio_buf_cache[c], KM_PUSHPAGE)); - else - return (kmem_alloc(size, KM_SLEEP|flags)); + if (zio_use_uma) { + return (kmem_cache_alloc(zio_buf_cache[c], + canwait ? KM_PUSHPAGE : KM_NOSLEEP)); + } else { + return (kmem_alloc(size, + (canwait ? KM_SLEEP : KM_NOSLEEP) | flags)); + } +} + +void * +zio_buf_alloc(size_t size) +{ + return (zio_buf_alloc_impl(size, B_TRUE)); +} + +void * +zio_buf_alloc_nowait(size_t size) +{ + return (zio_buf_alloc_impl(size, B_FALSE)); } /* |