Commit 49fd90b2 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Fix unlocked access to c->disk_sb.sb in bch2_replicas_entry_validate()

parent 9104fc19
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)) {
+14 −4
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ void bch2_replicas_entry_to_text(struct printbuf *out,
	prt_printf(out, "]");
}

int bch2_replicas_entry_validate(struct bch_replicas_entry_v1 *r,
static int bch2_replicas_entry_validate_locked(struct bch_replicas_entry_v1 *r,
					       struct bch_sb *sb,
					       struct printbuf *err)
{
@@ -94,6 +94,16 @@ int bch2_replicas_entry_validate(struct bch_replicas_entry_v1 *r,
	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;

+1 −1
Original line number Diff line number Diff line
@@ -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 *