]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/util.c
New upstream snapshot
[bcachefs-tools-debian] / libbcachefs / util.c
index 463260c0458575c2492c165087e4e6eb05c3d58f..0bbea332fcaaf7cecc6ce62695fe0367c011bab2 100644 (file)
@@ -114,7 +114,7 @@ void bch2_hprint(struct printbuf *buf, s64 v)
         * 103 is magic: t is in the range [-1023, 1023] and we want
         * to turn it into [-9, 9]
         */
-       if (u && v < 100 && v > -100)
+       if (u && t && v < 100 && v > -100)
                pr_buf(buf, ".%i", t / 103);
        if (u)
                pr_buf(buf, "%c", si_units[u]);
@@ -525,7 +525,11 @@ int bch2_bio_alloc_pages(struct bio *bio, size_t size, gfp_t gfp_mask)
                if (!page)
                        return -ENOMEM;
 
-               BUG_ON(!bio_add_page(bio, page, len, 0));
+               if (unlikely(!bio_add_page(bio, page, len, 0))) {
+                       __free_page(page);
+                       break;
+               }
+
                size -= len;
        }
 
@@ -887,9 +891,14 @@ void eytzinger0_find_test(void)
  */
 u64 *bch2_acc_percpu_u64s(u64 __percpu *p, unsigned nr)
 {
-       u64 *ret = this_cpu_ptr(p);
+       u64 *ret;
        int cpu;
 
+       /* access to pcpu vars has to be blocked by other locking */
+       preempt_disable();
+       ret = this_cpu_ptr(p);
+       preempt_enable();
+
        for_each_possible_cpu(cpu) {
                u64 *i = per_cpu_ptr(p, cpu);