1047c81d3SSaso Kiselkov /* 2047c81d3SSaso Kiselkov * This file and its contents are supplied under the terms of the 3047c81d3SSaso Kiselkov * Common Development and Distribution License ("CDDL"), version 1.0. 4047c81d3SSaso Kiselkov * You may only use this file in accordance with the terms of version 5047c81d3SSaso Kiselkov * 1.0 of the CDDL. 6047c81d3SSaso Kiselkov * 7047c81d3SSaso Kiselkov * A full copy of the text of the CDDL should have accompanied this 8047c81d3SSaso Kiselkov * source. A copy of the CDDL is also available via the Internet at 9047c81d3SSaso Kiselkov * http://www.illumos.org/license/CDDL. 10047c81d3SSaso Kiselkov */ 11047c81d3SSaso Kiselkov 12047c81d3SSaso Kiselkov /* 13047c81d3SSaso Kiselkov * Copyright 2017 Nexenta Inc. All rights reserved. 14*1a5ae140SJason King * Copyright 2020 Joyent, Inc. 15047c81d3SSaso Kiselkov */ 16047c81d3SSaso Kiselkov 17047c81d3SSaso Kiselkov #ifndef _SYS_DKIOC_FREE_UTIL_H 18047c81d3SSaso Kiselkov #define _SYS_DKIOC_FREE_UTIL_H 19047c81d3SSaso Kiselkov 20047c81d3SSaso Kiselkov #include <sys/dkio.h> 21047c81d3SSaso Kiselkov 22047c81d3SSaso Kiselkov #ifdef __cplusplus 23047c81d3SSaso Kiselkov extern "C" { 24047c81d3SSaso Kiselkov #endif 25047c81d3SSaso Kiselkov 26047c81d3SSaso Kiselkov #define DFL_COPYIN_MAX_EXTS (1024 * 1024) 27047c81d3SSaso Kiselkov 28*1a5ae140SJason King #define DFL_ISSYNC(dfl) (((dfl)->dfl_flags & DF_WAIT_SYNC) ? B_TRUE : B_FALSE) 29*1a5ae140SJason King 30*1a5ae140SJason King /* 31*1a5ae140SJason King * Since dkioc_free_list_t and in general DKIOCFREE use bytes to express 32*1a5ae140SJason King * values instead of blocks, dkioc_free_info_t uses bytes as well for 33*1a5ae140SJason King * consistency. 34*1a5ae140SJason King */ 35*1a5ae140SJason King typedef struct dkioc_free_info { 36*1a5ae140SJason King /* log2(block size) */ 37*1a5ae140SJason King uint64_t dfi_bshift; 38*1a5ae140SJason King 39*1a5ae140SJason King /* Maximum number of extents in a single request. 0 == no limit */ 40*1a5ae140SJason King uint64_t dfi_max_ext; 41*1a5ae140SJason King 42*1a5ae140SJason King /* 43*1a5ae140SJason King * Maximum total number of bytes in a single request. 0 == no limit. 44*1a5ae140SJason King * Must by a multiple of 1U << dfi_bshift (e.g. dfi_bshift == 9, 45*1a5ae140SJason King * dfk_max_bytes must be a multiple of 512). 46*1a5ae140SJason King */ 47*1a5ae140SJason King uint64_t dfi_max_bytes; 48*1a5ae140SJason King 49*1a5ae140SJason King /* 50*1a5ae140SJason King * Maximum length of an extent. 0 == same as dfi_max_bytes. If > 0, 51*1a5ae140SJason King * must be a multiple of 1U << dfi_shift (the block size) and 52*1a5ae140SJason King * <= dfi_max_bytes. 53*1a5ae140SJason King */ 54*1a5ae140SJason King uint64_t dfi_max_ext_bytes; 55*1a5ae140SJason King 56*1a5ae140SJason King /* 57*1a5ae140SJason King * Minimum alignment for starting extent offsets in bytes 58*1a5ae140SJason King * Must be > 0, and a multiple of 1U << dfi_shift. 59*1a5ae140SJason King * 60*1a5ae140SJason King * A possible future extention might be to also express a preferred 61*1a5ae140SJason King * alignment when splitting extents. 62*1a5ae140SJason King */ 63*1a5ae140SJason King uint64_t dfi_align; 64*1a5ae140SJason King } dkioc_free_info_t; 65*1a5ae140SJason King 66*1a5ae140SJason King typedef int (*dfl_iter_fn_t)(dkioc_free_list_t *dfl, void *arg, int kmflag); 67*1a5ae140SJason King 68047c81d3SSaso Kiselkov int dfl_copyin(void *arg, dkioc_free_list_t **out, int ddi_flags, int kmflags); 69047c81d3SSaso Kiselkov void dfl_free(dkioc_free_list_t *dfl); 70*1a5ae140SJason King int dfl_iter(dkioc_free_list_t *dfl, const dkioc_free_info_t *dfi, uint64_t len, 71*1a5ae140SJason King dfl_iter_fn_t fn, void *arg, int kmflag); 72047c81d3SSaso Kiselkov 73047c81d3SSaso Kiselkov #ifdef __cplusplus 74047c81d3SSaso Kiselkov } 75047c81d3SSaso Kiselkov #endif 76047c81d3SSaso Kiselkov 77047c81d3SSaso Kiselkov #endif /* _SYS_DKIOC_FREE_UTIL_H */ 78