summaryrefslogtreecommitdiffstats
path: root/module/zfs
diff options
context:
space:
mode:
authorAlexander Motin <[email protected]>2019-06-10 12:52:25 -0400
committerBrian Behlendorf <[email protected]>2019-06-10 09:52:25 -0700
commit5a902f5aaa1fbf6f7e459ec29f6d1d988ec78b0a (patch)
tree4c4e462c049d319ddde249fac3efa5252b5b14ae /module/zfs
parentc08c30ed131800635576282e1d142b12fa33c76b (diff)
Fix comparison signedness in arc_is_overflowing()
When ARC size is very small, aggsum_lower_bound(&arc_size) may return negative values, that due to unsigned comparison caused delays, waiting for arc_adjust() to "fix" it by calling aggsum_value(&arc_size). Use of signed comparison there fixes the problem. Reviewed-by: Matt Ahrens <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: George Melikov <[email protected]> Signed-off-by: Alexander Motin <[email protected]> Closes #8873
Diffstat (limited to 'module/zfs')
-rw-r--r--module/zfs/arc.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
index c387fd88f..946ea3415 100644
--- a/module/zfs/arc.c
+++ b/module/zfs/arc.c
@@ -5480,7 +5480,7 @@ static boolean_t
arc_is_overflowing(void)
{
/* Always allow at least one block of overflow */
- uint64_t overflow = MAX(SPA_MAXBLOCKSIZE,
+ int64_t overflow = MAX(SPA_MAXBLOCKSIZE,
arc_c >> zfs_arc_overflow_shift);
/*
@@ -5492,7 +5492,7 @@ arc_is_overflowing(void)
* in the ARC. In practice, that's in the tens of MB, which is low
* enough to be safe.
*/
- return (aggsum_lower_bound(&arc_size) >= arc_c + overflow);
+ return (aggsum_lower_bound(&arc_size) >= (int64_t)arc_c + overflow);
}
static abd_t *