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
This commit is contained in:
parent
6c9e56b231
commit
ad579d984f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=348370
@ -643,7 +643,7 @@ zio_create(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
|
|||||||
{
|
{
|
||||||
zio_t *zio;
|
zio_t *zio;
|
||||||
|
|
||||||
ASSERT3U(type == ZIO_TYPE_FREE || psize, <=, SPA_MAXBLOCKSIZE);
|
IMPLY(type != ZIO_TYPE_FREE, psize <= SPA_MAXBLOCKSIZE);
|
||||||
ASSERT(P2PHASE(psize, SPA_MINBLOCKSIZE) == 0);
|
ASSERT(P2PHASE(psize, SPA_MINBLOCKSIZE) == 0);
|
||||||
ASSERT(P2PHASE(offset, SPA_MINBLOCKSIZE) == 0);
|
ASSERT(P2PHASE(offset, SPA_MINBLOCKSIZE) == 0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user