Replace P2ALIGN with P2ALIGN_TYPED and delete P2ALIGN.
In P2ALIGN, the result would be incorrect when align is unsigned integer and x is larger than max value of the type of align. In that case, -(align) would be a positive integer, which means high bits would be zero and finally stay zero after '&' when align is converted to a larger integer type. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Youzhong Yang <yyang@mathworks.com> Signed-off-by: Qiuhao Chen <chenqiuhao1997@gmail.com> Closes #15940
This commit is contained in:
parent
2566592045
commit
9edf6af4ae
|
@ -5217,7 +5217,7 @@ dump_label(const char *dev)
|
||||||
sizeof (cksum_record_t), offsetof(cksum_record_t, link));
|
sizeof (cksum_record_t), offsetof(cksum_record_t, link));
|
||||||
|
|
||||||
psize = statbuf.st_size;
|
psize = statbuf.st_size;
|
||||||
psize = P2ALIGN(psize, (uint64_t)sizeof (vdev_label_t));
|
psize = P2ALIGN_TYPED(psize, sizeof (vdev_label_t), uint64_t);
|
||||||
ashift = SPA_MINBLOCKSHIFT;
|
ashift = SPA_MINBLOCKSHIFT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
12
cmd/ztest.c
12
cmd/ztest.c
|
@ -2448,7 +2448,7 @@ ztest_get_data(void *arg, uint64_t arg2, lr_write_t *lr, char *buf,
|
||||||
ASSERT3P(zio, !=, NULL);
|
ASSERT3P(zio, !=, NULL);
|
||||||
size = doi.doi_data_block_size;
|
size = doi.doi_data_block_size;
|
||||||
if (ISP2(size)) {
|
if (ISP2(size)) {
|
||||||
offset = P2ALIGN(offset, size);
|
offset = P2ALIGN_TYPED(offset, size, uint64_t);
|
||||||
} else {
|
} else {
|
||||||
ASSERT3U(offset, <, size);
|
ASSERT3U(offset, <, size);
|
||||||
offset = 0;
|
offset = 0;
|
||||||
|
@ -4668,7 +4668,8 @@ ztest_dmu_object_next_chunk(ztest_ds_t *zd, uint64_t id)
|
||||||
*/
|
*/
|
||||||
mutex_enter(&os->os_obj_lock);
|
mutex_enter(&os->os_obj_lock);
|
||||||
object = ztest_random(os->os_obj_next_chunk);
|
object = ztest_random(os->os_obj_next_chunk);
|
||||||
os->os_obj_next_chunk = P2ALIGN(object, dnodes_per_chunk);
|
os->os_obj_next_chunk = P2ALIGN_TYPED(object, dnodes_per_chunk,
|
||||||
|
uint64_t);
|
||||||
mutex_exit(&os->os_obj_lock);
|
mutex_exit(&os->os_obj_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6284,7 +6285,8 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
|
||||||
* the end of the disk (vdev_psize) is aligned to
|
* the end of the disk (vdev_psize) is aligned to
|
||||||
* sizeof (vdev_label_t).
|
* sizeof (vdev_label_t).
|
||||||
*/
|
*/
|
||||||
uint64_t psize = P2ALIGN(fsize, sizeof (vdev_label_t));
|
uint64_t psize = P2ALIGN_TYPED(fsize, sizeof (vdev_label_t),
|
||||||
|
uint64_t);
|
||||||
if ((leaf & 1) == 1 &&
|
if ((leaf & 1) == 1 &&
|
||||||
offset + sizeof (bad) > psize - VDEV_LABEL_END_SIZE)
|
offset + sizeof (bad) > psize - VDEV_LABEL_END_SIZE)
|
||||||
continue;
|
continue;
|
||||||
|
@ -6600,8 +6602,8 @@ ztest_fletcher_incr(ztest_ds_t *zd, uint64_t id)
|
||||||
size_t inc = 64 * ztest_random(size / 67);
|
size_t inc = 64 * ztest_random(size / 67);
|
||||||
/* sometimes add few bytes to test non-simd */
|
/* sometimes add few bytes to test non-simd */
|
||||||
if (ztest_random(100) < 10)
|
if (ztest_random(100) < 10)
|
||||||
inc += P2ALIGN(ztest_random(64),
|
inc += P2ALIGN_TYPED(ztest_random(64),
|
||||||
sizeof (uint32_t));
|
sizeof (uint32_t), uint64_t);
|
||||||
|
|
||||||
if (inc > (size - pos))
|
if (inc > (size - pos))
|
||||||
inc = size - pos;
|
inc = size - pos;
|
||||||
|
|
|
@ -138,7 +138,8 @@ typedef int enum_t;
|
||||||
#define readdir64 readdir
|
#define readdir64 readdir
|
||||||
#define dirent64 dirent
|
#define dirent64 dirent
|
||||||
#endif
|
#endif
|
||||||
#define P2ALIGN(x, align) ((x) & -(align))
|
// Deprecated. Use P2ALIGN_TYPED instead.
|
||||||
|
// #define P2ALIGN(x, align) ((x) & -(align))
|
||||||
#define P2CROSS(x, y, align) (((x) ^ (y)) > (align) - 1)
|
#define P2CROSS(x, y, align) (((x) ^ (y)) > (align) - 1)
|
||||||
#define P2ROUNDUP(x, align) ((((x) - 1) | ((align) - 1)) + 1)
|
#define P2ROUNDUP(x, align) ((((x) - 1) | ((align) - 1)) + 1)
|
||||||
#define P2PHASE(x, align) ((x) & ((align) - 1))
|
#define P2PHASE(x, align) ((x) & ((align) - 1))
|
||||||
|
|
|
@ -191,7 +191,8 @@ extern unsigned char bcd_to_byte[256];
|
||||||
* eg, P2ALIGN(0x1234, 0x100) == 0x1200 (0x12*align)
|
* eg, P2ALIGN(0x1234, 0x100) == 0x1200 (0x12*align)
|
||||||
* eg, P2ALIGN(0x5600, 0x100) == 0x5600 (0x56*align)
|
* eg, P2ALIGN(0x5600, 0x100) == 0x5600 (0x56*align)
|
||||||
*/
|
*/
|
||||||
#define P2ALIGN(x, align) ((x) & -(align))
|
// Deprecated. Use P2ALIGN_TYPED instead.
|
||||||
|
// #define P2ALIGN(x, align) ((x) & -(align))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return x % (mod) align
|
* return x % (mod) align
|
||||||
|
|
|
@ -159,7 +159,8 @@ makedev(unsigned int major, unsigned int minor)
|
||||||
/*
|
/*
|
||||||
* Compatibility macros/typedefs needed for Solaris -> Linux port
|
* Compatibility macros/typedefs needed for Solaris -> Linux port
|
||||||
*/
|
*/
|
||||||
#define P2ALIGN(x, align) ((x) & -(align))
|
// Deprecated. Use P2ALIGN_TYPED instead.
|
||||||
|
// #define P2ALIGN(x, align) ((x) & -(align))
|
||||||
#define P2CROSS(x, y, align) (((x) ^ (y)) > (align) - 1)
|
#define P2CROSS(x, y, align) (((x) ^ (y)) > (align) - 1)
|
||||||
#define P2ROUNDUP(x, align) ((((x) - 1) | ((align) - 1)) + 1)
|
#define P2ROUNDUP(x, align) ((((x) - 1) | ((align) - 1)) + 1)
|
||||||
#define P2PHASE(x, align) ((x) & ((align) - 1))
|
#define P2PHASE(x, align) ((x) & ((align) - 1))
|
||||||
|
|
|
@ -1175,8 +1175,8 @@ efi_use_whole_disk(int fd)
|
||||||
* (for performance reasons). The alignment should match the
|
* (for performance reasons). The alignment should match the
|
||||||
* alignment used by the "zpool_label_disk" function.
|
* alignment used by the "zpool_label_disk" function.
|
||||||
*/
|
*/
|
||||||
limit = P2ALIGN(efi_label->efi_last_lba - nblocks - EFI_MIN_RESV_SIZE,
|
limit = P2ALIGN_TYPED(efi_label->efi_last_lba - nblocks -
|
||||||
PARTITION_END_ALIGNMENT);
|
EFI_MIN_RESV_SIZE, PARTITION_END_ALIGNMENT, diskaddr_t);
|
||||||
if (data_start + data_size != limit || resv_start != limit)
|
if (data_start + data_size != limit || resv_start != limit)
|
||||||
sync_needed = B_TRUE;
|
sync_needed = B_TRUE;
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,8 @@
|
||||||
/*
|
/*
|
||||||
* Compatibility macros/typedefs needed for Solaris -> Linux port
|
* Compatibility macros/typedefs needed for Solaris -> Linux port
|
||||||
*/
|
*/
|
||||||
#define P2ALIGN(x, align) ((x) & -(align))
|
// Deprecated. Use P2ALIGN_TYPED instead.
|
||||||
|
// #define P2ALIGN(x, align) ((x) & -(align))
|
||||||
#define P2CROSS(x, y, align) (((x) ^ (y)) > (align) - 1)
|
#define P2CROSS(x, y, align) (((x) ^ (y)) > (align) - 1)
|
||||||
#define P2ROUNDUP(x, align) ((((x) - 1) | ((align) - 1)) + 1)
|
#define P2ROUNDUP(x, align) ((((x) - 1) | ((align) - 1)) + 1)
|
||||||
#define P2BOUNDARY(off, len, align) \
|
#define P2BOUNDARY(off, len, align) \
|
||||||
|
|
|
@ -268,7 +268,8 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name)
|
||||||
if (start_block == MAXOFFSET_T)
|
if (start_block == MAXOFFSET_T)
|
||||||
start_block = NEW_START_BLOCK;
|
start_block = NEW_START_BLOCK;
|
||||||
slice_size -= start_block;
|
slice_size -= start_block;
|
||||||
slice_size = P2ALIGN(slice_size, PARTITION_END_ALIGNMENT);
|
slice_size = P2ALIGN_TYPED(slice_size, PARTITION_END_ALIGNMENT,
|
||||||
|
uint64_t);
|
||||||
|
|
||||||
vtoc->efi_parts[0].p_start = start_block;
|
vtoc->efi_parts[0].p_start = start_block;
|
||||||
vtoc->efi_parts[0].p_size = slice_size;
|
vtoc->efi_parts[0].p_size = slice_size;
|
||||||
|
|
|
@ -457,7 +457,7 @@ vdev_geom_read_config(struct g_consumer *cp, nvlist_t **configp)
|
||||||
ZFS_LOG(1, "Reading config from %s...", pp->name);
|
ZFS_LOG(1, "Reading config from %s...", pp->name);
|
||||||
|
|
||||||
psize = pp->mediasize;
|
psize = pp->mediasize;
|
||||||
psize = P2ALIGN(psize, (uint64_t)sizeof (vdev_label_t));
|
psize = P2ALIGN_TYPED(psize, sizeof (vdev_label_t), uint64_t);
|
||||||
|
|
||||||
size = sizeof (*vdev_lists[0]) + pp->sectorsize -
|
size = sizeof (*vdev_lists[0]) + pp->sectorsize -
|
||||||
((sizeof (*vdev_lists[0]) - 1) % pp->sectorsize) - 1;
|
((sizeof (*vdev_lists[0]) - 1) % pp->sectorsize) - 1;
|
||||||
|
|
|
@ -384,7 +384,7 @@ zvol_discard(zv_request_t *zvr)
|
||||||
*/
|
*/
|
||||||
if (!io_is_secure_erase(bio, rq)) {
|
if (!io_is_secure_erase(bio, rq)) {
|
||||||
start = P2ROUNDUP(start, zv->zv_volblocksize);
|
start = P2ROUNDUP(start, zv->zv_volblocksize);
|
||||||
end = P2ALIGN(end, zv->zv_volblocksize);
|
end = P2ALIGN_TYPED(end, zv->zv_volblocksize, uint64_t);
|
||||||
size = end - start;
|
size = end - start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -471,7 +471,8 @@ fletcher_4_native(const void *buf, uint64_t size,
|
||||||
const void *ctx_template, zio_cksum_t *zcp)
|
const void *ctx_template, zio_cksum_t *zcp)
|
||||||
{
|
{
|
||||||
(void) ctx_template;
|
(void) ctx_template;
|
||||||
const uint64_t p2size = P2ALIGN(size, FLETCHER_MIN_SIMD_SIZE);
|
const uint64_t p2size = P2ALIGN_TYPED(size, FLETCHER_MIN_SIMD_SIZE,
|
||||||
|
uint64_t);
|
||||||
|
|
||||||
ASSERT(IS_P2ALIGNED(size, sizeof (uint32_t)));
|
ASSERT(IS_P2ALIGNED(size, sizeof (uint32_t)));
|
||||||
|
|
||||||
|
@ -519,7 +520,8 @@ fletcher_4_byteswap(const void *buf, uint64_t size,
|
||||||
const void *ctx_template, zio_cksum_t *zcp)
|
const void *ctx_template, zio_cksum_t *zcp)
|
||||||
{
|
{
|
||||||
(void) ctx_template;
|
(void) ctx_template;
|
||||||
const uint64_t p2size = P2ALIGN(size, FLETCHER_MIN_SIMD_SIZE);
|
const uint64_t p2size = P2ALIGN_TYPED(size, FLETCHER_MIN_SIMD_SIZE,
|
||||||
|
uint64_t);
|
||||||
|
|
||||||
ASSERT(IS_P2ALIGNED(size, sizeof (uint32_t)));
|
ASSERT(IS_P2ALIGNED(size, sizeof (uint32_t)));
|
||||||
|
|
||||||
|
@ -878,7 +880,7 @@ abd_fletcher_4_iter(void *data, size_t size, void *private)
|
||||||
fletcher_4_ctx_t *ctx = cdp->acd_ctx;
|
fletcher_4_ctx_t *ctx = cdp->acd_ctx;
|
||||||
fletcher_4_ops_t *ops = (fletcher_4_ops_t *)cdp->acd_private;
|
fletcher_4_ops_t *ops = (fletcher_4_ops_t *)cdp->acd_private;
|
||||||
boolean_t native = cdp->acd_byteorder == ZIO_CHECKSUM_NATIVE;
|
boolean_t native = cdp->acd_byteorder == ZIO_CHECKSUM_NATIVE;
|
||||||
uint64_t asize = P2ALIGN(size, FLETCHER_MIN_SIMD_SIZE);
|
uint64_t asize = P2ALIGN_TYPED(size, FLETCHER_MIN_SIMD_SIZE, uint64_t);
|
||||||
|
|
||||||
ASSERT(IS_P2ALIGNED(size, sizeof (uint32_t)));
|
ASSERT(IS_P2ALIGNED(size, sizeof (uint32_t)));
|
||||||
|
|
||||||
|
|
|
@ -218,7 +218,7 @@ zfs_btree_create_custom(zfs_btree_t *tree,
|
||||||
zfs_btree_find_in_buf : bt_find_in_buf;
|
zfs_btree_find_in_buf : bt_find_in_buf;
|
||||||
tree->bt_elem_size = size;
|
tree->bt_elem_size = size;
|
||||||
tree->bt_leaf_size = lsize;
|
tree->bt_leaf_size = lsize;
|
||||||
tree->bt_leaf_cap = P2ALIGN(esize / size, 2);
|
tree->bt_leaf_cap = P2ALIGN_TYPED(esize / size, 2, size_t);
|
||||||
tree->bt_height = -1;
|
tree->bt_height = -1;
|
||||||
tree->bt_bulk = NULL;
|
tree->bt_bulk = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -537,7 +537,8 @@ dmu_buf_hold_array_by_dnode(dnode_t *dn, uint64_t offset, uint64_t length,
|
||||||
if (dn->dn_datablkshift) {
|
if (dn->dn_datablkshift) {
|
||||||
int blkshift = dn->dn_datablkshift;
|
int blkshift = dn->dn_datablkshift;
|
||||||
nblks = (P2ROUNDUP(offset + length, 1ULL << blkshift) -
|
nblks = (P2ROUNDUP(offset + length, 1ULL << blkshift) -
|
||||||
P2ALIGN(offset, 1ULL << blkshift)) >> blkshift;
|
P2ALIGN_TYPED(offset, 1ULL << blkshift, uint64_t))
|
||||||
|
>> blkshift;
|
||||||
} else {
|
} else {
|
||||||
if (offset + length > dn->dn_datablksz) {
|
if (offset + length > dn->dn_datablksz) {
|
||||||
zfs_panic_recover("zfs: accessing past end of object "
|
zfs_panic_recover("zfs: accessing past end of object "
|
||||||
|
@ -854,7 +855,7 @@ get_next_chunk(dnode_t *dn, uint64_t *start, uint64_t minimum, uint64_t *l1blks)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set start to the beginning of this L1 indirect */
|
/* set start to the beginning of this L1 indirect */
|
||||||
*start = P2ALIGN(*start, iblkrange);
|
*start = P2ALIGN_TYPED(*start, iblkrange, uint64_t);
|
||||||
}
|
}
|
||||||
if (*start < minimum)
|
if (*start < minimum)
|
||||||
*start = minimum;
|
*start = minimum;
|
||||||
|
|
|
@ -160,7 +160,7 @@ dmu_object_alloc_impl(objset_t *os, dmu_object_type_t ot, int blocksize,
|
||||||
* is not suitably aligned.
|
* is not suitably aligned.
|
||||||
*/
|
*/
|
||||||
os->os_obj_next_chunk =
|
os->os_obj_next_chunk =
|
||||||
P2ALIGN(object, dnodes_per_chunk) +
|
P2ALIGN_TYPED(object, dnodes_per_chunk, uint64_t) +
|
||||||
dnodes_per_chunk;
|
dnodes_per_chunk;
|
||||||
(void) atomic_swap_64(cpuobj, object);
|
(void) atomic_swap_64(cpuobj, object);
|
||||||
mutex_exit(&os->os_obj_lock);
|
mutex_exit(&os->os_obj_lock);
|
||||||
|
|
|
@ -629,8 +629,8 @@ metaslab_class_expandable_space(metaslab_class_t *mc)
|
||||||
* metaslabs. We report the expandable space in terms
|
* metaslabs. We report the expandable space in terms
|
||||||
* of the metaslab size since that's the unit of expansion.
|
* of the metaslab size since that's the unit of expansion.
|
||||||
*/
|
*/
|
||||||
space += P2ALIGN(tvd->vdev_max_asize - tvd->vdev_asize,
|
space += P2ALIGN_TYPED(tvd->vdev_max_asize - tvd->vdev_asize,
|
||||||
1ULL << tvd->vdev_ms_shift);
|
1ULL << tvd->vdev_ms_shift, uint64_t);
|
||||||
}
|
}
|
||||||
spa_config_exit(mc->mc_spa, SCL_VDEV, FTAG);
|
spa_config_exit(mc->mc_spa, SCL_VDEV, FTAG);
|
||||||
return (space);
|
return (space);
|
||||||
|
|
|
@ -347,7 +347,8 @@ vdev_get_min_asize(vdev_t *vd)
|
||||||
* to the nearest metaslab.
|
* to the nearest metaslab.
|
||||||
*/
|
*/
|
||||||
if (vd == vd->vdev_top)
|
if (vd == vd->vdev_top)
|
||||||
return (P2ALIGN(vd->vdev_asize, 1ULL << vd->vdev_ms_shift));
|
return (P2ALIGN_TYPED(vd->vdev_asize, 1ULL << vd->vdev_ms_shift,
|
||||||
|
uint64_t));
|
||||||
|
|
||||||
return (pvd->vdev_ops->vdev_op_min_asize(pvd));
|
return (pvd->vdev_ops->vdev_op_min_asize(pvd));
|
||||||
}
|
}
|
||||||
|
@ -2107,8 +2108,8 @@ vdev_open(vdev_t *vd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
osize = P2ALIGN(osize, (uint64_t)sizeof (vdev_label_t));
|
osize = P2ALIGN_TYPED(osize, sizeof (vdev_label_t), uint64_t);
|
||||||
max_osize = P2ALIGN(max_osize, (uint64_t)sizeof (vdev_label_t));
|
max_osize = P2ALIGN_TYPED(max_osize, sizeof (vdev_label_t), uint64_t);
|
||||||
|
|
||||||
if (vd->vdev_children == 0) {
|
if (vd->vdev_children == 0) {
|
||||||
if (osize < SPA_MINDEVSIZE) {
|
if (osize < SPA_MINDEVSIZE) {
|
||||||
|
@ -4730,9 +4731,9 @@ vdev_get_stats_ex(vdev_t *vd, vdev_stat_t *vs, vdev_stat_ex_t *vsx)
|
||||||
* can expand.
|
* can expand.
|
||||||
*/
|
*/
|
||||||
if (vd->vdev_aux == NULL && tvd != NULL) {
|
if (vd->vdev_aux == NULL && tvd != NULL) {
|
||||||
vs->vs_esize = P2ALIGN(
|
vs->vs_esize = P2ALIGN_TYPED(
|
||||||
vd->vdev_max_asize - vd->vdev_asize,
|
vd->vdev_max_asize - vd->vdev_asize,
|
||||||
1ULL << tvd->vdev_ms_shift);
|
1ULL << tvd->vdev_ms_shift, uint64_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
vs->vs_configured_ashift = vd->vdev_top != NULL
|
vs->vs_configured_ashift = vd->vdev_top != NULL
|
||||||
|
|
Loading…
Reference in New Issue