]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/super-io.c
Update bcachefs sources to 31718a2: bcachefs: Don't spin in journal reclaim
[bcachefs-tools-debian] / libbcachefs / super-io.c
index c22e2c03fc063b4c8c2b778dfde2aea9d047a9a8..08966f4004fbfd3d39ea2abdd1ecc0afd2849c93 100644 (file)
@@ -567,16 +567,10 @@ int bch2_read_super(const char *path, struct bch_opts *opts,
 {
        u64 offset = opt_get(*opts, sb);
        struct bch_sb_layout layout;
-       char *_err;
-       struct printbuf err;
+       struct printbuf err = PRINTBUF;
        __le64 *i;
        int ret;
 
-       _err = kmalloc(4096, GFP_KERNEL);
-       if (!_err)
-               return -ENOMEM;
-       err = _PBUF(_err, 4096);
-
        pr_verbose_init(*opts, "");
 
        memset(sb, 0, sizeof(*sb));
@@ -625,8 +619,8 @@ int bch2_read_super(const char *path, struct bch_opts *opts,
                goto err;
 
        printk(KERN_ERR "bcachefs (%s): error reading default superblock: %s",
-              path, _err);
-       err = _PBUF(_err, 4096);
+              path, err.buf);
+       printbuf_reset(&err);
 
        /*
         * Error reading primary superblock - read location of backup
@@ -683,16 +677,16 @@ got_super:
        ret = bch2_sb_validate(sb, &err);
        if (ret) {
                printk(KERN_ERR "bcachefs (%s): error validating superblock: %s",
-                      path, _err);
+                      path, err.buf);
                goto err_no_print;
        }
 out:
        pr_verbose_init(*opts, "ret %i", ret);
-       kfree(_err);
+       printbuf_exit(&err);
        return ret;
 err:
        printk(KERN_ERR "bcachefs (%s): error reading superblock: %s",
-              path, _err);
+              path, err.buf);
 err_no_print:
        bch2_free_super(sb);
        goto out;
@@ -766,6 +760,7 @@ int bch2_write_super(struct bch_fs *c)
 {
        struct closure *cl = &c->sb_write;
        struct bch_dev *ca;
+       struct printbuf err = PRINTBUF;
        unsigned i, sb = 0, nr_wrote;
        struct bch_devs_mask sb_written;
        bool wrote, can_mount_without_written, can_mount_with_written;
@@ -793,18 +788,11 @@ int bch2_write_super(struct bch_fs *c)
                bch2_sb_from_fs(c, ca);
 
        for_each_online_member(ca, c, i) {
-               struct printbuf buf = { NULL, NULL };
+               printbuf_reset(&err);
 
-               ret = bch2_sb_validate(&ca->disk_sb, &buf);
+               ret = bch2_sb_validate(&ca->disk_sb, &err);
                if (ret) {
-                       char *_buf = kmalloc(4096, GFP_NOFS);
-                       if (_buf) {
-                               buf = _PBUF(_buf, 4096);
-                               bch2_sb_validate(&ca->disk_sb, &buf);
-                       }
-
-                       bch2_fs_inconsistent(c, "sb invalid before write: %s", _buf);
-                       kfree(_buf);
+                       bch2_fs_inconsistent(c, "sb invalid before write: %s", err.buf);
                        percpu_ref_put(&ca->io_ref);
                        goto out;
                }
@@ -895,6 +883,7 @@ int bch2_write_super(struct bch_fs *c)
 out:
        /* Make new options visible after they're persistent: */
        bch2_sb_update(c);
+       printbuf_exit(&err);
        return ret;
 }
 
@@ -1145,7 +1134,7 @@ static int bch2_sb_crypt_validate(struct bch_sb *sb,
        struct bch_sb_field_crypt *crypt = field_to_type(f, crypt);
 
        if (vstruct_bytes(&crypt->field) < sizeof(*crypt)) {
-               pr_buf(err, "wrong size (got %llu should be %zu)",
+               pr_buf(err, "wrong size (got %zu should be %zu)",
                       vstruct_bytes(&crypt->field), sizeof(*crypt));
                return -EINVAL;
        }
@@ -1387,7 +1376,7 @@ static int bch2_sb_clean_validate(struct bch_sb *sb,
        struct bch_sb_field_clean *clean = field_to_type(f, clean);
 
        if (vstruct_bytes(&clean->field) < sizeof(*clean)) {
-               pr_buf(err, "wrong size (got %llu should be %zu)",
+               pr_buf(err, "wrong size (got %zu should be %zu)",
                       vstruct_bytes(&clean->field), sizeof(*clean));
                return -EINVAL;
        }
@@ -1464,7 +1453,7 @@ void bch2_sb_field_to_text(struct printbuf *out, struct bch_sb *sb,
        else
                pr_buf(out, "(unknown field %u)", type);
 
-       pr_buf(out, " (size %llu):", vstruct_bytes(f));
+       pr_buf(out, " (size %zu):", vstruct_bytes(f));
        pr_newline(out);
 
        if (ops && ops->to_text) {
@@ -1540,7 +1529,7 @@ void bch2_sb_to_text(struct printbuf *out, struct bch_sb *sb,
 
        pr_buf(out, "Created:                   ");
        if (sb->time_base_lo)
-               pr_time(out, le64_to_cpu(sb->time_base_lo) / NSEC_PER_SEC);
+               pr_time(out, div_u64(le64_to_cpu(sb->time_base_lo), NSEC_PER_SEC));
        else
                pr_buf(out, "(not set)");
        pr_newline(out);
@@ -1646,7 +1635,7 @@ void bch2_sb_to_text(struct printbuf *out, struct bch_sb *sb,
        bch2_flags_to_text(out, bch2_sb_fields, fields_have);
        pr_newline(out);
 
-       pr_buf(out, "Superblock size:           %llu", vstruct_bytes(sb));
+       pr_buf(out, "Superblock size:           %zu", vstruct_bytes(sb));
        pr_newline(out);
 
        if (print_layout) {