mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
spa_preferred_class: pass the entire zio
Rather than picking out specific values out of the properties, just pass the entire zio in, to make it easier in the future to use more of that info to decide on the storage class. I would have rathered just pass io_prop in, but having spa.h include zio.h gets a bit tricky. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rob Norris <rob.norris@klarasystems.com> Sponsored-by: Klara, Inc. Sponsored-by: iXsystems, Inc. Closes #15894
This commit is contained in:
committed by
Brian Behlendorf
parent
ed87d456e4
commit
e26b3771ee
@@ -2007,9 +2007,11 @@ spa_special_has_ddt(spa_t *spa)
|
||||
* Locate an appropriate allocation class
|
||||
*/
|
||||
metaslab_class_t *
|
||||
spa_preferred_class(spa_t *spa, uint64_t size, dmu_object_type_t objtype,
|
||||
uint_t level, uint_t special_smallblk)
|
||||
spa_preferred_class(spa_t *spa, const zio_t *zio)
|
||||
{
|
||||
const zio_prop_t *zp = &zio->io_prop;
|
||||
dmu_object_type_t objtype = zp->zp_type;
|
||||
|
||||
/*
|
||||
* ZIL allocations determine their class in zio_alloc_zil().
|
||||
*/
|
||||
@@ -2027,14 +2029,15 @@ spa_preferred_class(spa_t *spa, uint64_t size, dmu_object_type_t objtype,
|
||||
}
|
||||
|
||||
/* Indirect blocks for user data can land in special if allowed */
|
||||
if (level > 0 && (DMU_OT_IS_FILE(objtype) || objtype == DMU_OT_ZVOL)) {
|
||||
if (zp->zp_level > 0 &&
|
||||
(DMU_OT_IS_FILE(objtype) || objtype == DMU_OT_ZVOL)) {
|
||||
if (has_special_class && zfs_user_indirect_is_special)
|
||||
return (spa_special_class(spa));
|
||||
else
|
||||
return (spa_normal_class(spa));
|
||||
}
|
||||
|
||||
if (DMU_OT_IS_METADATA(objtype) || level > 0) {
|
||||
if (DMU_OT_IS_METADATA(objtype) || zp->zp_level > 0) {
|
||||
if (has_special_class)
|
||||
return (spa_special_class(spa));
|
||||
else
|
||||
@@ -2047,7 +2050,7 @@ spa_preferred_class(spa_t *spa, uint64_t size, dmu_object_type_t objtype,
|
||||
* zfs_special_class_metadata_reserve_pct exclusively for metadata.
|
||||
*/
|
||||
if (DMU_OT_IS_FILE(objtype) &&
|
||||
has_special_class && size <= special_smallblk) {
|
||||
has_special_class && zio->io_size <= zp->zp_zpl_smallblk) {
|
||||
metaslab_class_t *special = spa_special_class(spa);
|
||||
uint64_t alloc = metaslab_class_get_alloc(special);
|
||||
uint64_t space = metaslab_class_get_space(special);
|
||||
|
||||
+2
-5
@@ -3637,8 +3637,7 @@ zio_dva_throttle(zio_t *zio)
|
||||
metaslab_class_t *mc;
|
||||
|
||||
/* locate an appropriate allocation class */
|
||||
mc = spa_preferred_class(spa, zio->io_size, zio->io_prop.zp_type,
|
||||
zio->io_prop.zp_level, zio->io_prop.zp_zpl_smallblk);
|
||||
mc = spa_preferred_class(spa, zio);
|
||||
|
||||
if (zio->io_priority == ZIO_PRIORITY_SYNC_WRITE ||
|
||||
!mc->mc_alloc_throttle_enabled ||
|
||||
@@ -3710,9 +3709,7 @@ zio_dva_allocate(zio_t *zio)
|
||||
*/
|
||||
mc = zio->io_metaslab_class;
|
||||
if (mc == NULL) {
|
||||
mc = spa_preferred_class(spa, zio->io_size,
|
||||
zio->io_prop.zp_type, zio->io_prop.zp_level,
|
||||
zio->io_prop.zp_zpl_smallblk);
|
||||
mc = spa_preferred_class(spa, zio);
|
||||
zio->io_metaslab_class = mc;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user