mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
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:
@@ -457,7 +457,7 @@ vdev_geom_read_config(struct g_consumer *cp, nvlist_t **configp)
|
||||
ZFS_LOG(1, "Reading config from %s...", pp->name);
|
||||
|
||||
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 -
|
||||
((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)) {
|
||||
start = P2ROUNDUP(start, zv->zv_volblocksize);
|
||||
end = P2ALIGN(end, zv->zv_volblocksize);
|
||||
end = P2ALIGN_TYPED(end, zv->zv_volblocksize, uint64_t);
|
||||
size = end - start;
|
||||
}
|
||||
|
||||
|
||||
@@ -471,7 +471,8 @@ fletcher_4_native(const void *buf, uint64_t size,
|
||||
const void *ctx_template, zio_cksum_t *zcp)
|
||||
{
|
||||
(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)));
|
||||
|
||||
@@ -519,7 +520,8 @@ fletcher_4_byteswap(const void *buf, uint64_t size,
|
||||
const void *ctx_template, zio_cksum_t *zcp)
|
||||
{
|
||||
(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)));
|
||||
|
||||
@@ -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_ops_t *ops = (fletcher_4_ops_t *)cdp->acd_private;
|
||||
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)));
|
||||
|
||||
|
||||
+1
-1
@@ -218,7 +218,7 @@ zfs_btree_create_custom(zfs_btree_t *tree,
|
||||
zfs_btree_find_in_buf : bt_find_in_buf;
|
||||
tree->bt_elem_size = size;
|
||||
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_bulk = NULL;
|
||||
}
|
||||
|
||||
+3
-2
@@ -537,7 +537,8 @@ dmu_buf_hold_array_by_dnode(dnode_t *dn, uint64_t offset, uint64_t length,
|
||||
if (dn->dn_datablkshift) {
|
||||
int blkshift = dn->dn_datablkshift;
|
||||
nblks = (P2ROUNDUP(offset + length, 1ULL << blkshift) -
|
||||
P2ALIGN(offset, 1ULL << blkshift)) >> blkshift;
|
||||
P2ALIGN_TYPED(offset, 1ULL << blkshift, uint64_t))
|
||||
>> blkshift;
|
||||
} else {
|
||||
if (offset + length > dn->dn_datablksz) {
|
||||
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 */
|
||||
*start = P2ALIGN(*start, iblkrange);
|
||||
*start = P2ALIGN_TYPED(*start, iblkrange, uint64_t);
|
||||
}
|
||||
if (*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.
|
||||
*/
|
||||
os->os_obj_next_chunk =
|
||||
P2ALIGN(object, dnodes_per_chunk) +
|
||||
P2ALIGN_TYPED(object, dnodes_per_chunk, uint64_t) +
|
||||
dnodes_per_chunk;
|
||||
(void) atomic_swap_64(cpuobj, object);
|
||||
mutex_exit(&os->os_obj_lock);
|
||||
|
||||
@@ -627,8 +627,8 @@ metaslab_class_expandable_space(metaslab_class_t *mc)
|
||||
* metaslabs. We report the expandable space in terms
|
||||
* of the metaslab size since that's the unit of expansion.
|
||||
*/
|
||||
space += P2ALIGN(tvd->vdev_max_asize - tvd->vdev_asize,
|
||||
1ULL << tvd->vdev_ms_shift);
|
||||
space += P2ALIGN_TYPED(tvd->vdev_max_asize - tvd->vdev_asize,
|
||||
1ULL << tvd->vdev_ms_shift, uint64_t);
|
||||
}
|
||||
spa_config_exit(mc->mc_spa, SCL_VDEV, FTAG);
|
||||
return (space);
|
||||
|
||||
+6
-5
@@ -348,7 +348,8 @@ vdev_get_min_asize(vdev_t *vd)
|
||||
* to the nearest metaslab.
|
||||
*/
|
||||
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));
|
||||
}
|
||||
@@ -2115,8 +2116,8 @@ vdev_open(vdev_t *vd)
|
||||
}
|
||||
}
|
||||
|
||||
osize = P2ALIGN(osize, (uint64_t)sizeof (vdev_label_t));
|
||||
max_osize = P2ALIGN(max_osize, (uint64_t)sizeof (vdev_label_t));
|
||||
osize = P2ALIGN_TYPED(osize, sizeof (vdev_label_t), uint64_t);
|
||||
max_osize = P2ALIGN_TYPED(max_osize, sizeof (vdev_label_t), uint64_t);
|
||||
|
||||
if (vd->vdev_children == 0) {
|
||||
if (osize < SPA_MINDEVSIZE) {
|
||||
@@ -4764,9 +4765,9 @@ vdev_get_stats_ex(vdev_t *vd, vdev_stat_t *vs, vdev_stat_ex_t *vsx)
|
||||
* can expand.
|
||||
*/
|
||||
if (vd->vdev_aux == NULL && tvd != NULL) {
|
||||
vs->vs_esize = P2ALIGN(
|
||||
vs->vs_esize = P2ALIGN_TYPED(
|
||||
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
|
||||
|
||||
@@ -4039,7 +4039,8 @@ raidz_reflow_scratch_sync(void *arg, dmu_tx_t *tx)
|
||||
spa_config_enter(spa, SCL_STATE, FTAG, RW_READER);
|
||||
vdev_t *raidvd = vdev_lookup_top(spa, vre->vre_vdev_id);
|
||||
int ashift = raidvd->vdev_ashift;
|
||||
uint64_t write_size = P2ALIGN(VDEV_BOOT_SIZE, 1 << ashift);
|
||||
uint64_t write_size = P2ALIGN_TYPED(VDEV_BOOT_SIZE, 1 << ashift,
|
||||
uint64_t);
|
||||
uint64_t logical_size = write_size * raidvd->vdev_children;
|
||||
uint64_t read_size =
|
||||
P2ROUNDUP(DIV_ROUND_UP(logical_size, (raidvd->vdev_children - 1)),
|
||||
|
||||
Reference in New Issue
Block a user