bcachefs: Fix unlocked access to c->disk_sb.sb in bch2_replicas_entry_validate()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
9104fc1928
commit
49fd90b2cc
@ -605,7 +605,7 @@ static int journal_entry_data_usage_validate(struct bch_fs *c,
|
|||||||
goto out;
|
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,
|
c, version, jset, entry,
|
||||||
journal_entry_data_usage_bad_size,
|
journal_entry_data_usage_bad_size,
|
||||||
"invalid journal entry usage: %s", err.buf)) {
|
"invalid journal entry usage: %s", err.buf)) {
|
||||||
|
@ -66,9 +66,9 @@ void bch2_replicas_entry_to_text(struct printbuf *out,
|
|||||||
prt_printf(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 bch_sb *sb,
|
||||||
struct printbuf *err)
|
struct printbuf *err)
|
||||||
{
|
{
|
||||||
if (!r->nr_devs) {
|
if (!r->nr_devs) {
|
||||||
prt_printf(err, "no devices in entry ");
|
prt_printf(err, "no devices in entry ");
|
||||||
@ -94,6 +94,16 @@ bad:
|
|||||||
return -BCH_ERR_invalid_replicas_entry;
|
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,
|
void bch2_cpu_replicas_to_text(struct printbuf *out,
|
||||||
struct bch_replicas_cpu *r)
|
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 =
|
struct bch_replicas_entry_v1 *e =
|
||||||
cpu_replicas_entry(cpu_r, i);
|
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)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ void bch2_replicas_entry_sort(struct bch_replicas_entry_v1 *);
|
|||||||
void bch2_replicas_entry_to_text(struct printbuf *,
|
void bch2_replicas_entry_to_text(struct printbuf *,
|
||||||
struct bch_replicas_entry_v1 *);
|
struct bch_replicas_entry_v1 *);
|
||||||
int bch2_replicas_entry_validate(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 *);
|
void bch2_cpu_replicas_to_text(struct printbuf *, struct bch_replicas_cpu *);
|
||||||
|
|
||||||
static inline struct bch_replicas_entry_v1 *
|
static inline struct bch_replicas_entry_v1 *
|
||||||
|
Loading…
Reference in New Issue
Block a user