]> www.infradead.org Git - users/hch/block.git/commitdiff
bcachefs: Fix unlocked access to c->disk_sb.sb in bch2_replicas_entry_validate()
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 25 Sep 2024 22:17:31 +0000 (18:17 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 28 Sep 2024 01:46:35 +0000 (21:46 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/journal_io.c
fs/bcachefs/replicas.c
fs/bcachefs/replicas.h

index 30460bce04becca0d4262664a5a3e7147d1301b1..954f6a96e0f4d857ebd12134e80ebe725da30df0 100644 (file)
@@ -605,7 +605,7 @@ static int journal_entry_data_usage_validate(struct bch_fs *c,
                goto out;
        }
 
-       if (journal_entry_err_on(bch2_replicas_entry_validate(&u->r, c->disk_sb.sb, &err),
+       if (journal_entry_err_on(bch2_replicas_entry_validate(&u->r, c, &err),
                                 c, version, jset, entry,
                                 journal_entry_data_usage_bad_size,
                                 "invalid journal entry usage: %s", err.buf)) {
index 998c0bd068023a9f530984950c56dad2e87fec7c..bcb3276747e0086a76e2e4c0db905ab2dc253fec 100644 (file)
@@ -66,9 +66,9 @@ void bch2_replicas_entry_to_text(struct printbuf *out,
        prt_printf(out, "]");
 }
 
-int bch2_replicas_entry_validate(struct bch_replicas_entry_v1 *r,
-                                struct bch_sb *sb,
-                                struct printbuf *err)
+static int bch2_replicas_entry_validate_locked(struct bch_replicas_entry_v1 *r,
+                                              struct bch_sb *sb,
+                                              struct printbuf *err)
 {
        if (!r->nr_devs) {
                prt_printf(err, "no devices in entry ");
@@ -94,6 +94,16 @@ bad:
        return -BCH_ERR_invalid_replicas_entry;
 }
 
+int bch2_replicas_entry_validate(struct bch_replicas_entry_v1 *r,
+                                struct bch_fs *c,
+                                struct printbuf *err)
+{
+       mutex_lock(&c->sb_lock);
+       int ret = bch2_replicas_entry_validate_locked(r, c->disk_sb.sb, err);
+       mutex_unlock(&c->sb_lock);
+       return ret;
+}
+
 void bch2_cpu_replicas_to_text(struct printbuf *out,
                               struct bch_replicas_cpu *r)
 {
@@ -676,7 +686,7 @@ static int bch2_cpu_replicas_validate(struct bch_replicas_cpu *cpu_r,
                struct bch_replicas_entry_v1 *e =
                        cpu_replicas_entry(cpu_r, i);
 
-               int ret = bch2_replicas_entry_validate(e, sb, err);
+               int ret = bch2_replicas_entry_validate_locked(e, sb, err);
                if (ret)
                        return ret;
 
index 622482559c3db1eb68f0782256750df9b1282194..5aba2c1ce1331a38948c8e53d5e330e66486083d 100644 (file)
@@ -10,7 +10,7 @@ void bch2_replicas_entry_sort(struct bch_replicas_entry_v1 *);
 void bch2_replicas_entry_to_text(struct printbuf *,
                                 struct bch_replicas_entry_v1 *);
 int bch2_replicas_entry_validate(struct bch_replicas_entry_v1 *,
-                                struct bch_sb *, struct printbuf *);
+                                struct bch_fs *, struct printbuf *);
 void bch2_cpu_replicas_to_text(struct printbuf *, struct bch_replicas_cpu *);
 
 static inline struct bch_replicas_entry_v1 *