mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-23 19:04:45 +03:00
vs_alloc can underflow in L2ARC vdevs
The current L2 ARC device code consistently uses psize to increment vs_alloc but varies between psize and lsize when decrementing it. The result of this behavior is that vs_alloc can be decremented more that it is incremented and underflow. This patch changes the code so asize is used anywhere. In addition, it ensures that vs_alloc gets incremented by the L2 ARC device code as buffers are written and not at the end of the l2arc_write_buffers() routine. The latter (and old) way would temporarily underflow vs_alloc as buffers that were just written, would be destroyed while l2arc_write_buffers() was still looping. Reviewed-by: Matt Ahrens <mahrens@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Serapheim Dimitropoulos <serapheim@delphix.com> Closes #8298
This commit is contained in:
committed by
Brian Behlendorf
parent
2747f599ff
commit
7558997d2f
@@ -4162,6 +4162,11 @@ vdev_space_update(vdev_t *vd, int64_t alloc_delta, int64_t defer_delta,
|
||||
dspace_delta = vdev_deflated_space(vd, space_delta);
|
||||
|
||||
mutex_enter(&vd->vdev_stat_lock);
|
||||
/* ensure we won't underflow */
|
||||
if (alloc_delta < 0) {
|
||||
ASSERT3U(vd->vdev_stat.vs_alloc, >=, -alloc_delta);
|
||||
}
|
||||
|
||||
vd->vdev_stat.vs_alloc += alloc_delta;
|
||||
vd->vdev_stat.vs_space += space_delta;
|
||||
vd->vdev_stat.vs_dspace += dspace_delta;
|
||||
@@ -4169,6 +4174,7 @@ vdev_space_update(vdev_t *vd, int64_t alloc_delta, int64_t defer_delta,
|
||||
|
||||
/* every class but log contributes to root space stats */
|
||||
if (vd->vdev_mg != NULL && !vd->vdev_islog) {
|
||||
ASSERT(!vd->vdev_isl2cache);
|
||||
mutex_enter(&rvd->vdev_stat_lock);
|
||||
rvd->vdev_stat.vs_alloc += alloc_delta;
|
||||
rvd->vdev_stat.vs_space += space_delta;
|
||||
|
||||
Reference in New Issue
Block a user