svn commit: r348370 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Allan Jude
allanjude at FreeBSD.org
Wed May 29 20:34:36 UTC 2019
Author: allanjude
Date: Wed May 29 20:34:35 2019
New Revision: 348370
URL: https://svnweb.freebsd.org/changeset/base/348370
Log:
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 at gmail.com>
Reviewed by: kevans
MFC after: 2 weeks
Sponsored by: Klara Systems
Modified:
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c Wed May 29 19:11:09 2019 (r348369)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c Wed May 29 20:34:35 2019 (r348370)
@@ -643,7 +643,7 @@ zio_create(zio_t *pio, spa_t *spa, uint64_t txg, const
{
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(offset, SPA_MINBLOCKSIZE) == 0);
More information about the svn-src-all
mailing list