@@ -18,6 +18,19 @@ typedef struct FFZfsData
1818 FF_LIBRARY_SYMBOL (zpool_get_prop )
1919 FF_LIBRARY_SYMBOL (zpool_close )
2020
21+ // The fields in this struct store property IDs returned by `zpool_name_to_prop`,
22+ // not the property values themselves.
23+ struct {
24+ int name ;
25+ int health ;
26+ int guid ;
27+ int size ;
28+ int free ;
29+ int allocated ;
30+ int fragmentation ;
31+ int readonly ;
32+ } props ;
33+
2134 libzfs_handle_t * handle ;
2235 FFlist * result ;
2336} FFZfsData ;
@@ -37,21 +50,21 @@ static int enumZpoolCallback(zpool_handle_t* zpool, void* param)
3750 zprop_source_t source ;
3851 FFZpoolResult * item = ffListAdd (data -> result );
3952 char buf [1024 ];
40- if (data -> ffzpool_get_prop (zpool , ZPOOL_PROP_NAME , buf , ARRAY_SIZE (buf ), & source , false) == 0 )
53+ if (data -> ffzpool_get_prop (zpool , data -> props . name , buf , ARRAY_SIZE (buf ), & source , false) == 0 )
4154 ffStrbufInitS (& item -> name , buf );
4255 else
4356 ffStrbufInitStatic (& item -> name , "unknown" );
44- if (data -> ffzpool_get_prop (zpool , ZPOOL_PROP_HEALTH , buf , ARRAY_SIZE (buf ), & source , false) == 0 )
57+ if (data -> ffzpool_get_prop (zpool , data -> props . health , buf , ARRAY_SIZE (buf ), & source , false) == 0 )
4558 ffStrbufInitS (& item -> state , buf );
4659 else
4760 ffStrbufInitStatic (& item -> state , "unknown" );
48- item -> guid = data -> ffzpool_get_prop_int (zpool , ZPOOL_PROP_GUID , & source );
49- item -> total = data -> ffzpool_get_prop_int (zpool , ZPOOL_PROP_SIZE , & source );
50- item -> used = item -> total - data -> ffzpool_get_prop_int (zpool , ZPOOL_PROP_FREE , & source );
51- item -> allocated = data -> ffzpool_get_prop_int (zpool , ZPOOL_PROP_ALLOCATED , & source );
52- uint64_t fragmentation = data -> ffzpool_get_prop_int (zpool , ZPOOL_PROP_FRAGMENTATION , & source );
61+ item -> guid = data -> ffzpool_get_prop_int (zpool , data -> props . guid , & source );
62+ item -> total = data -> ffzpool_get_prop_int (zpool , data -> props . size , & source );
63+ item -> used = item -> total - data -> ffzpool_get_prop_int (zpool , data -> props . free , & source );
64+ item -> allocated = data -> ffzpool_get_prop_int (zpool , data -> props . allocated , & source );
65+ uint64_t fragmentation = data -> ffzpool_get_prop_int (zpool , data -> props . fragmentation , & source );
5366 item -> fragmentation = fragmentation == UINT64_MAX ? - DBL_MAX : (double ) fragmentation ;
54- item -> readOnly = (bool ) data -> ffzpool_get_prop_int (zpool , ZPOOL_PROP_READONLY , & source );
67+ item -> readOnly = (bool ) data -> ffzpool_get_prop_int (zpool , data -> props . readonly , & source );
5568 data -> ffzpool_close (zpool );
5669 return 0 ;
5770}
@@ -73,6 +86,23 @@ const char* ffDetectZpool(FFlist* result /* list of FFZpoolResult */)
7386 .result = result ,
7487 };
7588
89+ FF_LIBRARY_LOAD_SYMBOL_MESSAGE (libzfs , zpool_name_to_prop );
90+
91+ #define FF_QUERY_ZPOOL_PROP_FROM_NAME (prop_name ) do { \
92+ data.props.prop_name = ffzpool_name_to_prop(#prop_name); \
93+ if (data.props.prop_name < 0) \
94+ return "Failed to query prop: " #prop_name; \
95+ } while (false)
96+ FF_QUERY_ZPOOL_PROP_FROM_NAME (name );
97+ FF_QUERY_ZPOOL_PROP_FROM_NAME (health );
98+ FF_QUERY_ZPOOL_PROP_FROM_NAME (guid );
99+ FF_QUERY_ZPOOL_PROP_FROM_NAME (size );
100+ FF_QUERY_ZPOOL_PROP_FROM_NAME (free );
101+ FF_QUERY_ZPOOL_PROP_FROM_NAME (allocated );
102+ FF_QUERY_ZPOOL_PROP_FROM_NAME (fragmentation );
103+ FF_QUERY_ZPOOL_PROP_FROM_NAME (readonly );
104+ #undef FF_QUERY_ZPOOL_PROP_FROM_NAME
105+
76106 FF_LIBRARY_LOAD_SYMBOL_MESSAGE (libzfs , zpool_iter );
77107 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (libzfs , data , libzfs_fini );
78108 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (libzfs , data , zpool_get_prop_int );
0 commit comments