HomeFreeBSD

Fix assertion in ZFS TRIM code

Description

Fix assertion in ZFS TRIM code

Due to an attempt to check two conditions at once in a macro not designed
as such, the assertion would always evaluate to true.

#define VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE) do { \

const TYPE __left = (TYPE)(LEFT); \
const TYPE __right = (TYPE)(RIGHT); \
if (!(__left OP __right)) \
        assfail3(#LEFT " " #OP " " #RIGHT, \
                (uintmax_t)__left, #OP, (uintmax_t)__right, \
                __FILE__, __LINE__); \

_NOTE(CONSTCOND) } while (0)
#define ASSERT3U(x, y, z) VERIFY3_IMPL(x, y, z, uint64_t)

Mean that we compared:
left = (type == ZIO_TYPE_FREE || psize)
OP = "<="
right = (SPA_MAXBLOCKSIZE)

If the type was not FREE, 0 is less than SPA_MAXBLOCKSIZE (16MB)
If the type is ZIO_TYPE_FREE, 1 is less than SPA_MAXBLOCKSIZE
The constraint on psize (physical size of the FREE operation) is never
checked against SPA_MAXBLOCKSIZE

Reported by: Ka Ho Ng <khng300@gmail.com>
Reviewed by: kevans
MFC after: 2 weeks
Sponsored by: Klara Systems

Details

Committed
allanjudeMay 29 2019, 8:34 PM
Reviewer
kevans
Parents
rS348369: MFC r347642:
Branches
Unknown
Tags
Unknown