]> www.infradead.org Git - linux.git/commitdiff
bcachefs: Replace div_u64 with div64_u64 where second param is u64
authorReed Riley <reed@riley.engineer>
Thu, 5 Sep 2024 16:59:29 +0000 (16:59 +0000)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 9 Sep 2024 13:41:47 +0000 (09:41 -0400)
Bcachefs often uses this function to divide by nanosecond times - which
can easily cause problems when cast to u32.  For example, `cat
/sys/fs/bcachefs/*/internal/rebalance_status` would return invalid data
in the `duration waited` field because dividing by the number of
nanoseconds in a minute requires the divisor parameter to be u64.

Signed-off-by: Reed Riley <reed@riley.engineer>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/sysfs.c
fs/bcachefs/util.c

index 33f2a64c14c900d6630ceaa4a11839dae0ccc43a..abaf9510fd96b13effa2c33e6e39f554590ef2af 100644 (file)
@@ -288,7 +288,7 @@ static int bch2_compression_stats_to_text(struct printbuf *out, struct bch_fs *c
                prt_tab_rjust(out);
 
                prt_human_readable_u64(out, nr_extents
-                                      ? div_u64(sectors_uncompressed << 9, nr_extents)
+                                      ? div64_u64(sectors_uncompressed << 9, nr_extents)
                                       : 0);
                prt_tab_rjust(out);
                prt_newline(out);
index a6c9c96955f1efca57f161c63d0852025e9a30e5..144d8df48b1e3edcd0bc29a2b4557f3883c81ff7 100644 (file)
@@ -64,7 +64,7 @@ static int bch2_pow(u64 n, u64 p, u64 *res)
        *res = 1;
 
        while (p--) {
-               if (*res > div_u64(U64_MAX, n))
+               if (*res > div64_u64(U64_MAX, n))
                        return -ERANGE;
                *res *= n;
        }
@@ -140,14 +140,14 @@ static int __bch2_strtou64_h(const char *cp, u64 *res)
 
        parse_or_ret(cp, parse_unit_suffix(cp, &b));
 
-       if (v > div_u64(U64_MAX, b))
+       if (v > div64_u64(U64_MAX, b))
                return -ERANGE;
        v *= b;
 
-       if (f_n > div_u64(U64_MAX, b))
+       if (f_n > div64_u64(U64_MAX, b))
                return -ERANGE;
 
-       f_n = div_u64(f_n * b, f_d);
+       f_n = div64_u64(f_n * b, f_d);
        if (v + f_n < v)
                return -ERANGE;
        v += f_n;
@@ -477,7 +477,7 @@ void bch2_time_stats_to_text(struct printbuf *out, struct bch2_time_stats *stats
                        bool is_last = eytzinger0_next(i, NR_QUANTILES) == -1;
 
                        u64 q = max(quantiles->entries[i].m, last_q);
-                       prt_printf(out, "%llu ", div_u64(q, u->nsecs));
+                       prt_printf(out, "%llu ", div64_u64(q, u->nsecs));
                        if (is_last)
                                prt_newline(out);
                        last_q = q;