]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/util.c
Update bcachefs sources to 82c5cc8f00 bcachefs: Improve transaction restart handling...
[bcachefs-tools-debian] / libbcachefs / util.c
index e69d03d1109ff0cf4cd3acb1ecc886b65c5e3a4c..52de7c49cacb62db540b64b4f51477f8688a49ec 100644 (file)
@@ -154,7 +154,7 @@ void bch2_flags_to_text(struct printbuf *out,
 u64 bch2_read_flag_list(char *opt, const char * const list[])
 {
        u64 ret = 0;
-       char *p, *s, *d = kstrndup(opt, PAGE_SIZE - 1, GFP_KERNEL);
+       char *p, *s, *d = kstrdup(opt, GFP_KERNEL);
 
        if (!d)
                return -ENOMEM;
@@ -318,43 +318,40 @@ static void pr_time_units(struct printbuf *out, u64 ns)
        pr_buf(out, "%llu %s", div_u64(ns, u->nsecs), u->name);
 }
 
-size_t bch2_time_stats_print(struct time_stats *stats, char *buf, size_t len)
+void bch2_time_stats_to_text(struct printbuf *out, struct time_stats *stats)
 {
-       struct printbuf out = _PBUF(buf, len);
        const struct time_unit *u;
        u64 freq = READ_ONCE(stats->average_frequency);
        u64 q, last_q = 0;
        int i;
 
-       pr_buf(&out, "count:\t\t%llu\n",
+       pr_buf(out, "count:\t\t%llu\n",
                         stats->count);
-       pr_buf(&out, "rate:\t\t%llu/sec\n",
+       pr_buf(out, "rate:\t\t%llu/sec\n",
               freq ?  div64_u64(NSEC_PER_SEC, freq) : 0);
 
-       pr_buf(&out, "frequency:\t");
-       pr_time_units(&out, freq);
+       pr_buf(out, "frequency:\t");
+       pr_time_units(out, freq);
 
-       pr_buf(&out, "\navg duration:\t");
-       pr_time_units(&out, stats->average_duration);
+       pr_buf(out, "\navg duration:\t");
+       pr_time_units(out, stats->average_duration);
 
-       pr_buf(&out, "\nmax duration:\t");
-       pr_time_units(&out, stats->max_duration);
+       pr_buf(out, "\nmax duration:\t");
+       pr_time_units(out, stats->max_duration);
 
        i = eytzinger0_first(NR_QUANTILES);
        u = pick_time_units(stats->quantiles.entries[i].m);
 
-       pr_buf(&out, "\nquantiles (%s):\t", u->name);
+       pr_buf(out, "\nquantiles (%s):\t", u->name);
        eytzinger0_for_each(i, NR_QUANTILES) {
                bool is_last = eytzinger0_next(i, NR_QUANTILES) == -1;
 
                q = max(stats->quantiles.entries[i].m, last_q);
-               pr_buf(&out, "%llu%s",
+               pr_buf(out, "%llu%s",
                       div_u64(q, u->nsecs),
                       is_last ? "\n" : " ");
                last_q = q;
        }
-
-       return out.pos - buf;
 }
 
 void bch2_time_stats_exit(struct time_stats *stats)
@@ -523,12 +520,16 @@ int bch2_bio_alloc_pages(struct bio *bio, size_t size, gfp_t gfp_mask)
 {
        while (size) {
                struct page *page = alloc_page(gfp_mask);
-               unsigned len = min(PAGE_SIZE, size);
+               unsigned len = min_t(size_t, PAGE_SIZE, size);
 
                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;
        }
 
@@ -893,6 +894,7 @@ u64 *bch2_acc_percpu_u64s(u64 __percpu *p, unsigned nr)
        u64 *ret;
        int cpu;
 
+       /* access to pcpu vars has to be blocked by other locking */
        preempt_disable();
        ret = this_cpu_ptr(p);
        preempt_enable();