Skip to content

Commit 06fa8f3

Browse files
authored
zfs_cmd: reorganise zfs_cmd_t to match original size
2aa3fbe extended zinject_record_t, and in doing so inadvertently extended zfs_cmd_t, which broke compatibility with userspace tools without the change. This fixes that by using some of the unused space in zfs_cmd_t for the extra fields. We also add an assert to trigger a compile error if the size ever changes. Sponsored-by: https://despairlabs.com/sponsor/ Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Alexander Motin <[email protected]> Signed-off-by: Rob Norris <[email protected]> Closes #17367
1 parent 087d7d8 commit 06fa8f3

File tree

3 files changed

+164
-87
lines changed

3 files changed

+164
-87
lines changed

include/sys/zfs_ioctl.h

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -534,10 +534,22 @@ typedef struct zfs_cmd {
534534
zfs_share_t zc_share;
535535
dmu_objset_stats_t zc_objset_stats;
536536
struct drr_begin zc_begin_record;
537-
zinject_record_t zc_inject_record;
538-
uint32_t zc_defer_destroy;
539-
uint32_t zc_flags;
540-
uint64_t zc_action_handle;
537+
538+
/*
539+
* zinject_record_t grew past its original size, which would push out
540+
* the size of zfs_cmd_t. To adjust for this, we allow it to use the
541+
* space after it, since those fields aren't used with ZFS_IOC_INJECT.
542+
*/
543+
union {
544+
zinject_record_t zc_inject_record;
545+
struct {
546+
char zc_pad1[sizeof (zinject_record_t) - 16];
547+
uint32_t zc_defer_destroy;
548+
uint32_t zc_flags;
549+
uint64_t zc_action_handle;
550+
};
551+
};
552+
541553
int zc_cleanup_fd;
542554
uint8_t zc_simple;
543555
uint8_t zc_pad[3]; /* alignment */
@@ -548,6 +560,20 @@ typedef struct zfs_cmd {
548560
uint64_t zc_zoneid;
549561
} zfs_cmd_t;
550562

563+
/*
564+
* zfs_cmd_t (and by extension, it's member structs) must always be the same
565+
* size. Changing it will break compatibility between the kernel module and the
566+
* userspace tools.
567+
*
568+
* This test is convoluted because MAXPATHLEN and MAXNAMELEN can vary across
569+
* platforms. We include them directly here, which means it won't trip if those
570+
* ever change, but if that happens we likely have other things to worry about.
571+
*/
572+
#define _expected_zfs_cmd_size ((MAXPATHLEN*3)+MAXNAMELEN+1200)
573+
_Static_assert(sizeof (zfs_cmd_t) == _expected_zfs_cmd_size,
574+
"zfs_cmd_t has wrong size");
575+
#undef _expected_zfs_cmd_size
576+
551577
typedef struct zfs_useracct {
552578
char zu_domain[256];
553579
uid_t zu_rid;

lib/libzfs/libzfs.abi

Lines changed: 74 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2617,6 +2617,9 @@
26172617
</function-type>
26182618
</abi-instr>
26192619
<abi-instr address-size='64' path='lib/libzfs/libzfs_config.c' language='LANG_C99'>
2620+
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='2816' id='514368c7'>
2621+
<subrange length='352' type-id='7359adad' id='b715cd6f'/>
2622+
</array-type-def>
26202623
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32768' id='d16c6df4'>
26212624
<subrange length='4096' type-id='7359adad' id='bc1b5ddc'/>
26222625
</array-type-def>
@@ -2789,7 +2792,7 @@
27892792
</data-member>
27902793
</class-decl>
27912794
<typedef-decl name='zfs_share_t' type-id='feb6f2da' id='ee5cec36'/>
2792-
<class-decl name='zfs_cmd' size-in-bits='110080' is-struct='yes' visibility='default' id='3522cd69'>
2795+
<class-decl name='zfs_cmd' size-in-bits='109952' is-struct='yes' visibility='default' id='3522cd69'>
27932796
<data-member access='public' layout-offset-in-bits='0'>
27942797
<var-decl name='zc_name' type-id='d16c6df4' visibility='default'/>
27952798
</data-member>
@@ -2860,42 +2863,55 @@
28602863
<var-decl name='zc_begin_record' type-id='09fcdc01' visibility='default'/>
28612864
</data-member>
28622865
<data-member access='public' layout-offset-in-bits='106368'>
2863-
<var-decl name='zc_inject_record' type-id='a4301ca6' visibility='default'/>
2866+
<var-decl name='' type-id='ac5ab595' visibility='default'/>
28642867
</data-member>
28652868
<data-member access='public' layout-offset-in-bits='109312'>
2866-
<var-decl name='zc_defer_destroy' type-id='8f92235e' visibility='default'/>
2867-
</data-member>
2868-
<data-member access='public' layout-offset-in-bits='109344'>
2869-
<var-decl name='zc_flags' type-id='8f92235e' visibility='default'/>
2870-
</data-member>
2871-
<data-member access='public' layout-offset-in-bits='109376'>
2872-
<var-decl name='zc_action_handle' type-id='9c313c2d' visibility='default'/>
2873-
</data-member>
2874-
<data-member access='public' layout-offset-in-bits='109440'>
28752869
<var-decl name='zc_cleanup_fd' type-id='95e97e5e' visibility='default'/>
28762870
</data-member>
2877-
<data-member access='public' layout-offset-in-bits='109472'>
2871+
<data-member access='public' layout-offset-in-bits='109344'>
28782872
<var-decl name='zc_simple' type-id='b96825af' visibility='default'/>
28792873
</data-member>
2880-
<data-member access='public' layout-offset-in-bits='109480'>
2874+
<data-member access='public' layout-offset-in-bits='109352'>
28812875
<var-decl name='zc_pad' type-id='d3490169' visibility='default'/>
28822876
</data-member>
2883-
<data-member access='public' layout-offset-in-bits='109504'>
2877+
<data-member access='public' layout-offset-in-bits='109376'>
28842878
<var-decl name='zc_sendobj' type-id='9c313c2d' visibility='default'/>
28852879
</data-member>
2886-
<data-member access='public' layout-offset-in-bits='109568'>
2880+
<data-member access='public' layout-offset-in-bits='109440'>
28872881
<var-decl name='zc_fromobj' type-id='9c313c2d' visibility='default'/>
28882882
</data-member>
2889-
<data-member access='public' layout-offset-in-bits='109632'>
2883+
<data-member access='public' layout-offset-in-bits='109504'>
28902884
<var-decl name='zc_createtxg' type-id='9c313c2d' visibility='default'/>
28912885
</data-member>
2892-
<data-member access='public' layout-offset-in-bits='109696'>
2886+
<data-member access='public' layout-offset-in-bits='109568'>
28932887
<var-decl name='zc_stat' type-id='0371a9c7' visibility='default'/>
28942888
</data-member>
2895-
<data-member access='public' layout-offset-in-bits='110016'>
2889+
<data-member access='public' layout-offset-in-bits='109888'>
28962890
<var-decl name='zc_zoneid' type-id='9c313c2d' visibility='default'/>
28972891
</data-member>
28982892
</class-decl>
2893+
<union-decl name='__anonymous_union__' size-in-bits='2944' is-anonymous='yes' visibility='default' id='ac5ab595'>
2894+
<data-member access='public'>
2895+
<var-decl name='zc_inject_record' type-id='a4301ca6' visibility='default'/>
2896+
</data-member>
2897+
<data-member access='public'>
2898+
<var-decl name='' type-id='e7f43f73' visibility='default'/>
2899+
</data-member>
2900+
</union-decl>
2901+
<class-decl name='__anonymous_struct__' size-in-bits='2944' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f73'>
2902+
<data-member access='public' layout-offset-in-bits='0'>
2903+
<var-decl name='zc_pad1' type-id='514368c7' visibility='default'/>
2904+
</data-member>
2905+
<data-member access='public' layout-offset-in-bits='2816'>
2906+
<var-decl name='zc_defer_destroy' type-id='8f92235e' visibility='default'/>
2907+
</data-member>
2908+
<data-member access='public' layout-offset-in-bits='2848'>
2909+
<var-decl name='zc_flags' type-id='8f92235e' visibility='default'/>
2910+
</data-member>
2911+
<data-member access='public' layout-offset-in-bits='2880'>
2912+
<var-decl name='zc_action_handle' type-id='9c313c2d' visibility='default'/>
2913+
</data-member>
2914+
</class-decl>
28992915
<typedef-decl name='zfs_cmd_t' type-id='3522cd69' id='a5559cdd'/>
29002916
<class-decl name='zfs_stat' size-in-bits='320' is-struct='yes' visibility='default' id='6417f0b9'>
29012917
<data-member access='public' layout-offset-in-bits='0'>
@@ -3171,7 +3187,7 @@
31713187
<typedef-decl name='ssize_t' type-id='41060289' id='79a0948f'/>
31723188
<class-decl name='sigaction' size-in-bits='1216' is-struct='yes' visibility='default' id='fe391c48'>
31733189
<data-member access='public' layout-offset-in-bits='0'>
3174-
<var-decl name='__sigaction_handler' type-id='ac5ab595' visibility='default'/>
3190+
<var-decl name='__sigaction_handler' type-id='ac5ab596' visibility='default'/>
31753191
</data-member>
31763192
<data-member access='public' layout-offset-in-bits='64'>
31773193
<var-decl name='sa_mask' type-id='b9c97942' visibility='default'/>
@@ -3183,7 +3199,7 @@
31833199
<var-decl name='sa_restorer' type-id='953b12f8' visibility='default'/>
31843200
</data-member>
31853201
</class-decl>
3186-
<union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' id='ac5ab595'>
3202+
<union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' id='ac5ab596'>
31873203
<data-member access='public'>
31883204
<var-decl name='sa_handler' type-id='8cdd9566' visibility='default'/>
31893205
</data-member>
@@ -3256,44 +3272,44 @@
32563272
<var-decl name='__pad0' type-id='95e97e5e' visibility='default'/>
32573273
</data-member>
32583274
<data-member access='public' layout-offset-in-bits='128'>
3259-
<var-decl name='_sifields' type-id='ac5ab596' visibility='default'/>
3275+
<var-decl name='_sifields' type-id='ac5ab597' visibility='default'/>
32603276
</data-member>
32613277
</class-decl>
3262-
<union-decl name='__anonymous_union__1' size-in-bits='896' is-anonymous='yes' visibility='default' id='ac5ab596'>
3278+
<union-decl name='__anonymous_union__1' size-in-bits='896' is-anonymous='yes' visibility='default' id='ac5ab597'>
32633279
<data-member access='public'>
32643280
<var-decl name='_pad' type-id='47394ee0' visibility='default'/>
32653281
</data-member>
32663282
<data-member access='public'>
3267-
<var-decl name='_kill' type-id='e7f43f73' visibility='default'/>
3283+
<var-decl name='_kill' type-id='e7f43f74' visibility='default'/>
32683284
</data-member>
32693285
<data-member access='public'>
3270-
<var-decl name='_timer' type-id='e7f43f74' visibility='default'/>
3286+
<var-decl name='_timer' type-id='e7f43f75' visibility='default'/>
32713287
</data-member>
32723288
<data-member access='public'>
3273-
<var-decl name='_rt' type-id='e7f43f75' visibility='default'/>
3289+
<var-decl name='_rt' type-id='e7f43f76' visibility='default'/>
32743290
</data-member>
32753291
<data-member access='public'>
3276-
<var-decl name='_sigchld' type-id='e7f43f76' visibility='default'/>
3292+
<var-decl name='_sigchld' type-id='e7f43f77' visibility='default'/>
32773293
</data-member>
32783294
<data-member access='public'>
3279-
<var-decl name='_sigfault' type-id='e7f43f77' visibility='default'/>
3295+
<var-decl name='_sigfault' type-id='e7f43f78' visibility='default'/>
32803296
</data-member>
32813297
<data-member access='public'>
3282-
<var-decl name='_sigpoll' type-id='e7f43f78' visibility='default'/>
3298+
<var-decl name='_sigpoll' type-id='e7f43f79' visibility='default'/>
32833299
</data-member>
32843300
<data-member access='public'>
3285-
<var-decl name='_sigsys' type-id='e7f43f79' visibility='default'/>
3301+
<var-decl name='_sigsys' type-id='e7f43f7a' visibility='default'/>
32863302
</data-member>
32873303
</union-decl>
3288-
<class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f73'>
3304+
<class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f74'>
32893305
<data-member access='public' layout-offset-in-bits='0'>
32903306
<var-decl name='si_pid' type-id='3629bad8' visibility='default'/>
32913307
</data-member>
32923308
<data-member access='public' layout-offset-in-bits='32'>
32933309
<var-decl name='si_uid' type-id='cc5fcceb' visibility='default'/>
32943310
</data-member>
32953311
</class-decl>
3296-
<class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f74'>
3312+
<class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f75'>
32973313
<data-member access='public' layout-offset-in-bits='0'>
32983314
<var-decl name='si_tid' type-id='95e97e5e' visibility='default'/>
32993315
</data-member>
@@ -3304,7 +3320,7 @@
33043320
<var-decl name='si_sigval' type-id='eabacd01' visibility='default'/>
33053321
</data-member>
33063322
</class-decl>
3307-
<class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f75'>
3323+
<class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f76'>
33083324
<data-member access='public' layout-offset-in-bits='0'>
33093325
<var-decl name='si_pid' type-id='3629bad8' visibility='default'/>
33103326
</data-member>
@@ -3315,7 +3331,7 @@
33153331
<var-decl name='si_sigval' type-id='eabacd01' visibility='default'/>
33163332
</data-member>
33173333
</class-decl>
3318-
<class-decl name='__anonymous_struct__4' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f76'>
3334+
<class-decl name='__anonymous_struct__4' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f77'>
33193335
<data-member access='public' layout-offset-in-bits='0'>
33203336
<var-decl name='si_pid' type-id='3629bad8' visibility='default'/>
33213337
</data-member>
@@ -3332,42 +3348,42 @@
33323348
<var-decl name='si_stime' type-id='4d66c6d7' visibility='default'/>
33333349
</data-member>
33343350
</class-decl>
3335-
<class-decl name='__anonymous_struct__5' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f77'>
3351+
<class-decl name='__anonymous_struct__5' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f78'>
33363352
<data-member access='public' layout-offset-in-bits='0'>
33373353
<var-decl name='si_addr' type-id='eaa32e2f' visibility='default'/>
33383354
</data-member>
33393355
<data-member access='public' layout-offset-in-bits='64'>
33403356
<var-decl name='si_addr_lsb' type-id='a2185560' visibility='default'/>
33413357
</data-member>
33423358
<data-member access='public' layout-offset-in-bits='128'>
3343-
<var-decl name='_bounds' type-id='ac5ab597' visibility='default'/>
3359+
<var-decl name='_bounds' type-id='ac5ab598' visibility='default'/>
33443360
</data-member>
33453361
</class-decl>
3346-
<union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' id='ac5ab597'>
3362+
<union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' id='ac5ab598'>
33473363
<data-member access='public'>
3348-
<var-decl name='_addr_bnd' type-id='e7f43f7a' visibility='default'/>
3364+
<var-decl name='_addr_bnd' type-id='e7f43f7b' visibility='default'/>
33493365
</data-member>
33503366
<data-member access='public'>
33513367
<var-decl name='_pkey' type-id='62f1140c' visibility='default'/>
33523368
</data-member>
33533369
</union-decl>
3354-
<class-decl name='__anonymous_struct__6' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7a'>
3370+
<class-decl name='__anonymous_struct__6' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7b'>
33553371
<data-member access='public' layout-offset-in-bits='0'>
33563372
<var-decl name='_lower' type-id='eaa32e2f' visibility='default'/>
33573373
</data-member>
33583374
<data-member access='public' layout-offset-in-bits='64'>
33593375
<var-decl name='_upper' type-id='eaa32e2f' visibility='default'/>
33603376
</data-member>
33613377
</class-decl>
3362-
<class-decl name='__anonymous_struct__7' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f78'>
3378+
<class-decl name='__anonymous_struct__7' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f79'>
33633379
<data-member access='public' layout-offset-in-bits='0'>
33643380
<var-decl name='si_band' type-id='bd54fe1a' visibility='default'/>
33653381
</data-member>
33663382
<data-member access='public' layout-offset-in-bits='64'>
33673383
<var-decl name='si_fd' type-id='95e97e5e' visibility='default'/>
33683384
</data-member>
33693385
</class-decl>
3370-
<class-decl name='__anonymous_struct__8' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f79'>
3386+
<class-decl name='__anonymous_struct__8' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7a'>
33713387
<data-member access='public' layout-offset-in-bits='0'>
33723388
<var-decl name='_call_addr' type-id='eaa32e2f' visibility='default'/>
33733389
</data-member>
@@ -4152,6 +4168,12 @@
41524168
<parameter type-id='5d6479ae'/>
41534169
<return type-id='95e97e5e'/>
41544170
</function-decl>
4171+
<function-decl name='lzc_ioctl_fd' visibility='default' binding='global' size-in-bits='64'>
4172+
<parameter type-id='95e97e5e'/>
4173+
<parameter type-id='7359adad'/>
4174+
<parameter type-id='b65f7fd1'/>
4175+
<return type-id='95e97e5e'/>
4176+
</function-decl>
41554177
<function-decl name='lzc_snapshot' visibility='default' binding='global' size-in-bits='64'>
41564178
<parameter type-id='5ce45b60'/>
41574179
<parameter type-id='5ce45b60'/>
@@ -4590,12 +4612,6 @@
45904612
<parameter is-variadic='yes'/>
45914613
<return type-id='95e97e5e'/>
45924614
</function-decl>
4593-
<function-decl name='ioctl' visibility='default' binding='global' size-in-bits='64'>
4594-
<parameter type-id='95e97e5e'/>
4595-
<parameter type-id='7359adad'/>
4596-
<parameter is-variadic='yes'/>
4597-
<return type-id='95e97e5e'/>
4598-
</function-decl>
45994615
<function-decl name='zfs_type_to_name' mangled-name='zfs_type_to_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_type_to_name'>
46004616
<parameter type-id='2e45de5d' name='type'/>
46014617
<return type-id='80f4b756'/>
@@ -5277,6 +5293,12 @@
52775293
<parameter type-id='b59d7dce'/>
52785294
<return type-id='79a0948f'/>
52795295
</function-decl>
5296+
<function-decl name='ioctl' visibility='default' binding='global' size-in-bits='64'>
5297+
<parameter type-id='95e97e5e'/>
5298+
<parameter type-id='7359adad'/>
5299+
<parameter is-variadic='yes'/>
5300+
<return type-id='95e97e5e'/>
5301+
</function-decl>
52805302
<function-decl name='fstat64' visibility='default' binding='global' size-in-bits='64'>
52815303
<parameter type-id='95e97e5e'/>
52825304
<parameter type-id='62f7a03d'/>
@@ -7237,7 +7259,7 @@
72377259
<var-decl name='drr_payloadlen' type-id='8f92235e' visibility='default'/>
72387260
</data-member>
72397261
<data-member access='public' layout-offset-in-bits='64'>
7240-
<var-decl name='drr_u' type-id='ac5ab598' visibility='default'/>
7262+
<var-decl name='drr_u' type-id='ac5ab599' visibility='default'/>
72417263
</data-member>
72427264
</class-decl>
72437265
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='08f5ca17'>
@@ -7255,7 +7277,7 @@
72557277
<enumerator name='DRR_REDACT' value='10'/>
72567278
<enumerator name='DRR_NUMTYPES' value='11'/>
72577279
</enum-decl>
7258-
<union-decl name='__anonymous_union__' size-in-bits='2432' is-anonymous='yes' visibility='default' id='ac5ab598'>
7280+
<union-decl name='__anonymous_union__' size-in-bits='2432' is-anonymous='yes' visibility='default' id='ac5ab599'>
72597281
<data-member access='public'>
72607282
<var-decl name='drr_begin' type-id='09fcdc01' visibility='default'/>
72617283
</data-member>
@@ -7602,21 +7624,21 @@
76027624
<var-decl name='sigev_notify' type-id='95e97e5e' visibility='default'/>
76037625
</data-member>
76047626
<data-member access='public' layout-offset-in-bits='128'>
7605-
<var-decl name='_sigev_un' type-id='ac5ab599' visibility='default'/>
7627+
<var-decl name='_sigev_un' type-id='ac5ab59a' visibility='default'/>
76067628
</data-member>
76077629
</class-decl>
7608-
<union-decl name='__anonymous_union__1' size-in-bits='384' is-anonymous='yes' visibility='default' id='ac5ab599'>
7630+
<union-decl name='__anonymous_union__1' size-in-bits='384' is-anonymous='yes' visibility='default' id='ac5ab59a'>
76097631
<data-member access='public'>
76107632
<var-decl name='_pad' type-id='73b82f0f' visibility='default'/>
76117633
</data-member>
76127634
<data-member access='public'>
76137635
<var-decl name='_tid' type-id='3629bad8' visibility='default'/>
76147636
</data-member>
76157637
<data-member access='public'>
7616-
<var-decl name='_sigev_thread' type-id='e7f43f7b' visibility='default'/>
7638+
<var-decl name='_sigev_thread' type-id='e7f43f7c' visibility='default'/>
76177639
</data-member>
76187640
</union-decl>
7619-
<class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7b'>
7641+
<class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7c'>
76207642
<data-member access='public' layout-offset-in-bits='0'>
76217643
<var-decl name='_function' type-id='5f147c28' visibility='default'/>
76227644
</data-member>

0 commit comments

Comments
 (0)