]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/super.c
Move c_src dirs back to toplevel
[bcachefs-tools-debian] / libbcachefs / super.c
index e7b81dbda55f332934e4d5c3fb8d0d184d01c2c9..9dbc35940197f1c55c1bc48746bc23a3983ac203 100644 (file)
@@ -88,14 +88,11 @@ const char * const bch2_fs_flag_strs[] = {
 
 void __bch2_print(struct bch_fs *c, const char *fmt, ...)
 {
-       struct log_output *output = c->output;
-       va_list args;
-
-       if (c->output_filter && c->output_filter != current)
-               output = NULL;
+       struct stdio_redirect *stdio = bch2_fs_stdio_redirect(c);
 
+       va_list args;
        va_start(args, fmt);
-       if (likely(!output)) {
+       if (likely(!stdio)) {
                vprintk(fmt, args);
        } else {
                unsigned long flags;
@@ -103,11 +100,11 @@ void __bch2_print(struct bch_fs *c, const char *fmt, ...)
                if (fmt[0] == KERN_SOH[0])
                        fmt += 2;
 
-               spin_lock_irqsave(&output->lock, flags);
-               prt_vprintf(&output->buf, fmt, args);
-               spin_unlock_irqrestore(&output->lock, flags);
+               spin_lock_irqsave(&stdio->output_lock, flags);
+               prt_vprintf(&stdio->output_buf, fmt, args);
+               spin_unlock_irqrestore(&stdio->output_lock, flags);
 
-               wake_up(&output->wait);
+               wake_up(&stdio->output_wait);
        }
        va_end(args);
 }
@@ -433,16 +430,6 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool early)
        if (test_bit(BCH_FS_rw, &c->flags))
                return 0;
 
-       if (c->opts.norecovery)
-               return -BCH_ERR_erofs_norecovery;
-
-       /*
-        * nochanges is used for fsck -n mode - we have to allow going rw
-        * during recovery for that to work:
-        */
-       if (c->opts.nochanges && (!early || c->opts.read_only))
-               return -BCH_ERR_erofs_nochanges;
-
        bch_info(c, "going read-write");
 
        ret = bch2_sb_members_v2_init(c);
@@ -510,6 +497,12 @@ err:
 
 int bch2_fs_read_write(struct bch_fs *c)
 {
+       if (c->opts.norecovery)
+               return -BCH_ERR_erofs_norecovery;
+
+       if (c->opts.nochanges)
+               return -BCH_ERR_erofs_nochanges;
+
        return __bch2_fs_read_write(c, false);
 }
 
@@ -728,7 +721,7 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts)
                goto out;
        }
 
-       c->output = (void *)(unsigned long) opts.log_output;
+       c->stdio = (void *)(unsigned long) opts.stdio;
 
        __module_get(THIS_MODULE);
 
@@ -875,7 +868,7 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts)
            !(c->copygc_wq = alloc_workqueue("bcachefs_copygc",
                                WQ_FREEZABLE|WQ_MEM_RECLAIM|WQ_CPU_INTENSIVE, 1)) ||
            !(c->io_complete_wq = alloc_workqueue("bcachefs_io",
-                               WQ_FREEZABLE|WQ_HIGHPRI|WQ_MEM_RECLAIM, 1)) ||
+                               WQ_FREEZABLE|WQ_HIGHPRI|WQ_MEM_RECLAIM, 512)) ||
            !(c->write_ref_wq = alloc_workqueue("bcachefs_write_ref",
                                WQ_FREEZABLE, 0)) ||
 #ifndef BCH_WRITE_REF_DEBUG
@@ -1033,7 +1026,7 @@ int bch2_fs_start(struct bch_fs *c)
 
        set_bit(BCH_FS_started, &c->flags);
 
-       if (c->opts.read_only || c->opts.nochanges) {
+       if (c->opts.read_only) {
                bch2_fs_read_only(c);
        } else {
                ret = !test_bit(BCH_FS_rw, &c->flags)
@@ -1044,12 +1037,13 @@ int bch2_fs_start(struct bch_fs *c)
        }
 
        ret = 0;
-out:
+err:
+       if (ret)
+               bch_err_msg(c, ret, "starting filesystem");
+       else
+               bch_verbose(c, "done starting filesystem");
        up_write(&c->state_lock);
        return ret;
-err:
-       bch_err_msg(c, ret, "starting filesystem");
-       goto out;
 }
 
 static int bch2_dev_may_add(struct bch_sb *sb, struct bch_fs *c)
@@ -1089,17 +1083,22 @@ static int bch2_dev_in_fs(struct bch_sb_handle *fs,
            fs->sb->write_time != sb->sb->write_time) {
                struct printbuf buf = PRINTBUF;
 
-               prt_printf(&buf, "Split brain detected between %pg and %pg:",
-                          sb->bdev, fs->bdev);
+               prt_str(&buf, "Split brain detected between ");
+               prt_bdevname(&buf, sb->bdev);
+               prt_str(&buf, " and ");
+               prt_bdevname(&buf, fs->bdev);
+               prt_char(&buf, ':');
                prt_newline(&buf);
                prt_printf(&buf, "seq=%llu but write_time different, got", le64_to_cpu(sb->sb->seq));
                prt_newline(&buf);
 
-               prt_printf(&buf, "%pg ", fs->bdev);
+               prt_bdevname(&buf, fs->bdev);
+               prt_char(&buf, ' ');
                bch2_prt_datetime(&buf, le64_to_cpu(fs->sb->write_time));;
                prt_newline(&buf);
 
-               prt_printf(&buf, "%pg ", sb->bdev);
+               prt_bdevname(&buf, sb->bdev);
+               prt_char(&buf, ' ');
                bch2_prt_datetime(&buf, le64_to_cpu(sb->sb->write_time));;
                prt_newline(&buf);
 
@@ -1115,13 +1114,26 @@ static int bch2_dev_in_fs(struct bch_sb_handle *fs,
        u64 seq_from_member     = le64_to_cpu(sb->sb->seq);
 
        if (seq_from_fs && seq_from_fs < seq_from_member) {
-               pr_err("Split brain detected between %pg and %pg:\n"
-                      "%pg believes seq of %pg to be %llu, but %pg has %llu\n"
-                      "Not using %pg",
-                      sb->bdev, fs->bdev,
-                      fs->bdev, sb->bdev, seq_from_fs,
-                      sb->bdev, seq_from_member,
-                      sb->bdev);
+               struct printbuf buf = PRINTBUF;
+
+               prt_str(&buf, "Split brain detected between ");
+               prt_bdevname(&buf, sb->bdev);
+               prt_str(&buf, " and ");
+               prt_bdevname(&buf, fs->bdev);
+               prt_char(&buf, ':');
+               prt_newline(&buf);
+
+               prt_bdevname(&buf, fs->bdev);
+               prt_str(&buf, "believes seq of ");
+               prt_bdevname(&buf, sb->bdev);
+               prt_printf(&buf, " to be %llu, but ", seq_from_fs);
+               prt_bdevname(&buf, sb->bdev);
+               prt_printf(&buf, " has %llu\n", seq_from_member);
+               prt_str(&buf, "Not using ");
+               prt_bdevname(&buf, sb->bdev);
+
+               pr_err("%s", buf.buf);
+               printbuf_exit(&buf);
                return -BCH_ERR_device_splitbrain;
        }
 
@@ -1370,9 +1382,14 @@ static int bch2_dev_attach_bdev(struct bch_fs *c, struct bch_sb_handle *sb)
 
        bch2_dev_sysfs_online(c, ca);
 
+       struct printbuf name = PRINTBUF;
+       prt_bdevname(&name, ca->disk_sb.bdev);
+
        if (c->sb.nr_devices == 1)
-               snprintf(c->name, sizeof(c->name), "%pg", ca->disk_sb.bdev);
-       snprintf(ca->name, sizeof(ca->name), "%pg", ca->disk_sb.bdev);
+               strlcpy(c->name, name.buf, sizeof(c->name));
+       strlcpy(ca->name, name.buf, sizeof(ca->name));
+
+       printbuf_exit(&name);
 
        rebalance_wakeup(c);
        return 0;
@@ -1996,6 +2013,11 @@ struct bch_fs *bch2_fs_open(char * const *devices, unsigned nr_devices,
                BUG_ON(darray_push(&sbs, sb));
        }
 
+       if (opts.nochanges && !opts.read_only) {
+               ret = -BCH_ERR_erofs_nochanges;
+               goto err_print;
+       }
+
        darray_for_each(sbs, sb)
                if (!best || sb_cmp(sb->sb, best->sb) > 0)
                        best = sb;