Skip to content

Commit 0168627

Browse files
committed
Zpool: add NetBSD support
Signed-off-by: hoshinomori <hoshinomori@owarisekai.moe>
1 parent e04cc9c commit 0168627

File tree

3 files changed

+178
-13
lines changed

3 files changed

+178
-13
lines changed

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ cmake_dependent_option(ENABLE_DDCUTIL "Enable ddcutil" ON "LINUX" OFF)
9292
cmake_dependent_option(ENABLE_DIRECTX_HEADERS "Enable DirectX headers for WSL" ON "LINUX" OFF)
9393
cmake_dependent_option(ENABLE_ELF "Enable libelf" ON "LINUX OR ANDROID OR DragonFly OR Haiku OR GNU" OFF)
9494
cmake_dependent_option(ENABLE_THREADS "Enable multithreading" ON "Threads_FOUND" OFF)
95-
cmake_dependent_option(ENABLE_LIBZFS "Enable libzfs" ON "LINUX OR FreeBSD OR SunOS" OFF)
95+
cmake_dependent_option(ENABLE_LIBZFS "Enable libzfs" ON "LINUX OR FreeBSD OR NetBSD OR SunOS" OFF)
9696
cmake_dependent_option(ENABLE_PCIACCESS "Enable libpciaccess" ON "GNU" OFF)
9797

9898
option(ENABLE_ZLIB "Enable zlib" ON)
@@ -1726,6 +1726,7 @@ elseif(NetBSD)
17261726
PRIVATE "bluetooth"
17271727
PRIVATE "m"
17281728
PRIVATE "prop"
1729+
PRIVATE $<$<BOOL:${ENABLE_LIBZFS}>:zfs;nvpair>
17291730
)
17301731
elseif(SunOS)
17311732
target_link_libraries(libfastfetch

src/detection/zpool/libzfs_simplified.h

Lines changed: 162 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
#include "fastfetch.h"
44

5-
// From https://github.com/openzfs/zfs/blob/master/include/libzfs.h
6-
75
/*
86
* CDDL HEADER START
97
*
@@ -25,6 +23,18 @@
2523
* CDDL HEADER END
2624
*/
2725

26+
// From https://github.com/NetBSD/src/blob/trunk/external/cddl/osnet/sys/sys/opentypes.h
27+
28+
#ifndef __NetBSD__
29+
typedef long long longlong_t;
30+
#endif
31+
typedef longlong_t hrtime_t;
32+
typedef unsigned int uint_t;
33+
34+
35+
// From https://github.com/openzfs/zfs/blob/master/include/libzfs.h
36+
// From https://github.com/NetBSD/src/blob/trunk/external/cddl/osnet/dist/uts/common/sys/fs/zfs.h
37+
2838
typedef enum {
2939
ZPOOL_PROP_INVAL = -1,
3040
ZPOOL_PROP_NAME,
@@ -46,13 +56,16 @@ typedef enum {
4656
ZPOOL_PROP_FREE,
4757
ZPOOL_PROP_ALLOCATED,
4858
ZPOOL_PROP_READONLY,
59+
#ifndef __NetBSD__
4960
ZPOOL_PROP_ASHIFT,
61+
#endif
5062
ZPOOL_PROP_COMMENT,
5163
ZPOOL_PROP_EXPANDSZ,
5264
ZPOOL_PROP_FREEING,
5365
ZPOOL_PROP_FRAGMENTATION,
5466
ZPOOL_PROP_LEAKED,
5567
ZPOOL_PROP_MAXBLOCKSIZE,
68+
#ifndef __NetBSD__
5669
ZPOOL_PROP_TNAME,
5770
ZPOOL_PROP_MAXDNODESIZE,
5871
ZPOOL_PROP_MULTIHOST,
@@ -63,6 +76,7 @@ typedef enum {
6376
ZPOOL_PROP_BCLONEUSED,
6477
ZPOOL_PROP_BCLONESAVED,
6578
ZPOOL_PROP_BCLONERATIO,
79+
#endif
6680
ZPOOL_NUM_PROPS
6781
} zpool_prop_t;
6882

@@ -75,15 +89,158 @@ typedef enum {
7589
ZPROP_SRC_RECEIVED = 0x20
7690
} zprop_source_t;
7791

78-
typedef bool boolean_t;
92+
#ifdef __NetBSD__
93+
94+
#define ZPOOL_CONFIG_VDEV_TREE "vdev_tree"
95+
#define ZPOOL_CONFIG_VDEV_STATS "vdev_stats"
96+
97+
typedef enum vdev_state {
98+
VDEV_STATE_UNKNOWN = 0,
99+
VDEV_STATE_CLOSED,
100+
VDEV_STATE_OFFLINE,
101+
VDEV_STATE_REMOVED,
102+
VDEV_STATE_CANT_OPEN,
103+
VDEV_STATE_FAULTED,
104+
VDEV_STATE_DEGRADED,
105+
VDEV_STATE_HEALTHY
106+
} vdev_state_t;
107+
108+
typedef enum vdev_aux {
109+
VDEV_AUX_NONE,
110+
VDEV_AUX_OPEN_FAILED,
111+
VDEV_AUX_CORRUPT_DATA,
112+
VDEV_AUX_NO_REPLICAS,
113+
VDEV_AUX_BAD_GUID_SUM,
114+
VDEV_AUX_TOO_SMALL,
115+
VDEV_AUX_BAD_LABEL,
116+
VDEV_AUX_VERSION_NEWER,
117+
VDEV_AUX_VERSION_OLDER,
118+
VDEV_AUX_UNSUP_FEAT,
119+
VDEV_AUX_SPARED,
120+
VDEV_AUX_ERR_EXCEEDED,
121+
VDEV_AUX_IO_FAILURE,
122+
VDEV_AUX_BAD_LOG,
123+
VDEV_AUX_EXTERNAL,
124+
VDEV_AUX_SPLIT_POOL,
125+
VDEV_AUX_ASHIFT_TOO_BIG
126+
} vdev_aux_t;
127+
128+
typedef enum pool_state {
129+
POOL_STATE_ACTIVE = 0,
130+
POOL_STATE_EXPORTED,
131+
POOL_STATE_DESTROYED,
132+
POOL_STATE_SPARE,
133+
POOL_STATE_L2CACHE,
134+
POOL_STATE_UNINITIALIZED,
135+
POOL_STATE_UNAVAIL,
136+
POOL_STATE_POTENTIALLY_ACTIVE
137+
} pool_state_t;
138+
139+
typedef enum zio_type {
140+
ZIO_TYPE_NULL = 0,
141+
ZIO_TYPE_READ,
142+
ZIO_TYPE_WRITE,
143+
ZIO_TYPE_FREE,
144+
ZIO_TYPE_CLAIM,
145+
ZIO_TYPE_IOCTL,
146+
ZIO_TYPES
147+
} zio_type_t;
148+
149+
typedef struct vdev_stat {
150+
hrtime_t vs_timestamp;
151+
uint64_t vs_state;
152+
uint64_t vs_aux;
153+
uint64_t vs_alloc;
154+
uint64_t vs_space;
155+
uint64_t vs_dspace;
156+
uint64_t vs_rsize;
157+
uint64_t vs_esize;
158+
uint64_t vs_ops[ZIO_TYPES];
159+
uint64_t vs_bytes[ZIO_TYPES];
160+
uint64_t vs_read_errors;
161+
uint64_t vs_write_errors;
162+
uint64_t vs_checksum_errors;
163+
uint64_t vs_self_healed;
164+
uint64_t vs_scan_removing;
165+
uint64_t vs_scan_processed;
166+
uint64_t vs_configured_ashift;
167+
uint64_t vs_logical_ashift;
168+
uint64_t vs_physical_ashift;
169+
uint64_t vs_fragmentation;
170+
} vdev_stat_t;
171+
172+
// From https://github.com/NetBSD/src/blob/trunk/external/cddl/osnet/uts/common/sys/nvpair.h
173+
174+
typedef struct nvlist {
175+
int32_t nvl_version;
176+
uint32_t nvl_nvflag;
177+
uint64_t nvl_priv;
178+
uint32_t nvl_flag;
179+
int32_t nvl_pad;
180+
} nvlist_t;
181+
182+
// From https://github.com/NetBSD/src/blob/trunk/external/cddl/osnet/dist/lib/libzfs/common/libzfs.h
183+
184+
typedef enum {
185+
ZPOOL_STATUS_CORRUPT_CACHE,
186+
ZPOOL_STATUS_MISSING_DEV_R,
187+
ZPOOL_STATUS_MISSING_DEV_NR,
188+
ZPOOL_STATUS_CORRUPT_LABEL_R,
189+
ZPOOL_STATUS_CORRUPT_LABEL_NR,
190+
ZPOOL_STATUS_BAD_GUID_SUM,
191+
ZPOOL_STATUS_CORRUPT_POOL,
192+
ZPOOL_STATUS_CORRUPT_DATA,
193+
ZPOOL_STATUS_FAILING_DEV,
194+
ZPOOL_STATUS_VERSION_NEWER,
195+
ZPOOL_STATUS_HOSTID_MISMATCH,
196+
ZPOOL_STATUS_IO_FAILURE_WAIT,
197+
ZPOOL_STATUS_IO_FAILURE_CONTINUE,
198+
ZPOOL_STATUS_BAD_LOG,
199+
ZPOOL_STATUS_UNSUP_FEAT_READ,
200+
ZPOOL_STATUS_UNSUP_FEAT_WRITE,
201+
ZPOOL_STATUS_FAULTED_DEV_R,
202+
ZPOOL_STATUS_FAULTED_DEV_NR,
203+
ZPOOL_STATUS_VERSION_OLDER,
204+
ZPOOL_STATUS_FEAT_DISABLED,
205+
ZPOOL_STATUS_RESILVERING,
206+
ZPOOL_STATUS_OFFLINE_DEV,
207+
ZPOOL_STATUS_REMOVED_DEV,
208+
ZPOOL_STATUS_NON_NATIVE_ASHIFT,
209+
ZPOOL_STATUS_OK
210+
} zpool_status_t;
211+
#endif /*__NetBSD__*/
79212

80-
typedef struct libzfs_handle libzfs_handle_t;
81213
typedef struct zpool_handle zpool_handle_t;
214+
typedef struct libzfs_handle libzfs_handle_t;
82215
typedef int (*zpool_iter_f)(zpool_handle_t *, void *);
83-
extern int zpool_iter(libzfs_handle_t *, zpool_iter_f, void *);
84216

217+
extern int zpool_iter(libzfs_handle_t *, zpool_iter_f, void *);
85218
extern libzfs_handle_t *libzfs_init(void);
86219
extern void libzfs_fini(libzfs_handle_t *);
87220
extern uint64_t zpool_get_prop_int(zpool_handle_t *, zpool_prop_t, zprop_source_t *);
88221
extern const char *zpool_get_name(zpool_handle_t *);
89222
extern const char *zpool_get_state_str(zpool_handle_t *);
223+
224+
#ifdef __NetBSD__
225+
extern int zpool_get_state(zpool_handle_t *);
226+
extern const char *zpool_state_to_name(vdev_state_t, vdev_aux_t);
227+
extern zpool_status_t zpool_get_status(zpool_handle_t *, char **);
228+
extern nvlist_t *zpool_get_config(zpool_handle_t *, nvlist_t **);
229+
230+
// From https://github.com/NetBSD/src/blob/trunk/external/cddl/osnet/dist/uts/common/sys/nvpair.h
231+
232+
extern nvlist_t *opensolaris_fnvlist_lookup_nvlist(nvlist_t *, const char *);
233+
static inline nvlist_t *fnvlist_lookup_nvlist(nvlist_t *nvl, const char *name) {
234+
return opensolaris_fnvlist_lookup_nvlist(nvl, name);
235+
}
236+
237+
extern int opensolaris_nvlist_lookup_uint64_array(nvlist_t *, const char *, uint64_t **, uint_t *);
238+
static inline int nvlist_lookup_uint64_array(nvlist_t *nvl, const char *name, uint64_t **a, uint_t *n) {
239+
return opensolaris_nvlist_lookup_uint64_array(nvl, name, a, n);
240+
}
241+
242+
extern int opensolaris_nvlist_lookup_uint32_array(nvlist_t *, const char *, uint32_t **, uint_t *);
243+
static inline int nvlist_lookup_uint32_array(nvlist_t *nvl, const char *name, uint32_t **a, uint_t *n) {
244+
return opensolaris_nvlist_lookup_uint32_array(nvl, name, a, n);
245+
}
246+
#endif /*__NetBSD__*/

src/detection/zpool/zpool_linux.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,30 @@
44
#include "util/kmod.h"
55

66
#ifdef __sun
7-
#define FF_DISABLE_DLOPEN
87
#include <libzfs.h>
8+
#else
9+
#include "libzfs_simplified.h"
10+
#endif
911

12+
#if defined(__sun) || defined(__NetBSD__)
13+
#define FF_DISABLE_DLOPEN
1014
const char* zpool_get_state_str(zpool_handle_t* zpool)
1115
{
1216
if (zpool_get_state(zpool) == POOL_STATE_UNAVAIL)
1317
return "FAULTED";
1418
else
1519
{
1620
const char *str;
21+
#ifdef __sun
1722
zpool_errata_t errata;
1823
zpool_status_t status = zpool_get_status(zpool, (char**) &str, &errata);
19-
if (status == ZPOOL_STATUS_IO_FAILURE_WAIT ||
20-
status == ZPOOL_STATUS_IO_FAILURE_CONTINUE ||
21-
status == ZPOOL_STATUS_IO_FAILURE_MMP)
24+
if (status == ZPOOL_STATUS_IO_FAILURE_MMP ||
25+
#else
26+
zpool_status_t status = zpool_get_status(zpool, (char**) &str);
27+
if (
28+
#endif
29+
status == ZPOOL_STATUS_IO_FAILURE_WAIT ||
30+
status == ZPOOL_STATUS_IO_FAILURE_CONTINUE)
2231
return "SUSPENDED";
2332
else
2433
{
@@ -36,9 +45,7 @@ const char* zpool_get_state_str(zpool_handle_t* zpool)
3645
}
3746
}
3847
}
39-
#else
40-
#include "libzfs_simplified.h"
41-
#endif
48+
#endif /* __sun || __NetBSD__ */
4249

4350
#include "common/library.h"
4451

0 commit comments

Comments
 (0)