On 2/9/21 10:07 PM, Coly Li wrote: > +struct bch_nvm_pgalloc_recs { > +union { > + struct { > + struct bch_nvm_pages_owner_head *owner; > + struct bch_nvm_pgalloc_recs *next; > + __u8 magic[16]; > + __u8 owner_uuid[16]; > + __u32 size; > + __u32 used; > + __u64 _pad[4]; > + struct bch_pgalloc_rec recs[]; > + }; > + __u8 pad[8192]; > +}; > +}; This doesn't look right in a user header, any user API should be 32-bit and 64-bit agnostic. > +struct bch_nvm_pages_owner_head { > + __u8 uuid[16]; > + char label[BCH_NVM_PAGES_LABEL_SIZE]; > + /* Per-namespace own lists */ > + struct bch_nvm_pgalloc_recs *recs[BCH_NVM_PAGES_NAMESPACES_MAX]; > +}; Same here. > +/* heads[0] is always for nvm_pages internal usage */ > +struct bch_owner_list_head { > +union { > + struct { > + __u32 size; > + __u32 used; > + __u64 _pad[4]; > + struct bch_nvm_pages_owner_head heads[]; > + }; > + __u8 pad[8192]; > +}; > +}; And here. > +#define BCH_MAX_OWNER_LIST \ > + ((sizeof(struct bch_owner_list_head) - \ > + offsetof(struct bch_owner_list_head, heads)) / \ > + sizeof(struct bch_nvm_pages_owner_head)) > + > +/* The on-media bit order is local CPU order */ > +struct bch_nvm_pages_sb { > + __u64 csum; > + __u64 ns_start; > + __u64 sb_offset; > + __u64 version; > + __u8 magic[16]; > + __u8 uuid[16]; > + __u32 page_size; > + __u32 total_namespaces_nr; > + __u32 this_namespace_nr; > + union { > + __u8 set_uuid[16]; > + __u64 set_magic; > + }; This doesn't look like it packs right either. > + > + __u64 flags; > + __u64 seq; > + > + __u64 feature_compat; > + __u64 feature_incompat; > + __u64 feature_ro_compat; > + > + /* For allocable nvm pages from buddy systems */ > + __u64 pages_offset; > + __u64 pages_total; > + > + __u64 pad[8]; > + > + /* Only on the first name space */ > + struct bch_owner_list_head *owner_list_head; And here's another pointer... -- Jens Axboe