mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 07:00:48 +00:00
bcachefs: Don't print out duplicate fsck errors
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
2798143aa8
commit
9c5d38bba0
@ -98,7 +98,6 @@ static struct fsck_err_state *fsck_err_get(struct bch_fs *c, const char *fmt)
|
|||||||
|
|
||||||
INIT_LIST_HEAD(&s->list);
|
INIT_LIST_HEAD(&s->list);
|
||||||
s->fmt = fmt;
|
s->fmt = fmt;
|
||||||
s->buf = PRINTBUF;
|
|
||||||
list_add(&s->list, &c->fsck_errors);
|
list_add(&s->list, &c->fsck_errors);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -111,9 +110,23 @@ int bch2_fsck_err(struct bch_fs *c, unsigned flags, const char *fmt, ...)
|
|||||||
struct printbuf buf = PRINTBUF, *out = &buf;
|
struct printbuf buf = PRINTBUF, *out = &buf;
|
||||||
int ret = -BCH_ERR_fsck_ignore;
|
int ret = -BCH_ERR_fsck_ignore;
|
||||||
|
|
||||||
|
va_start(args, fmt);
|
||||||
|
prt_vprintf(out, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
mutex_lock(&c->fsck_error_lock);
|
mutex_lock(&c->fsck_error_lock);
|
||||||
s = fsck_err_get(c, fmt);
|
s = fsck_err_get(c, fmt);
|
||||||
if (s) {
|
if (s) {
|
||||||
|
if (s->last_msg && !strcmp(buf.buf, s->last_msg)) {
|
||||||
|
ret = s->ret;
|
||||||
|
mutex_unlock(&c->fsck_error_lock);
|
||||||
|
printbuf_exit(&buf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
kfree(s->last_msg);
|
||||||
|
s->last_msg = kstrdup(buf.buf, GFP_KERNEL);
|
||||||
|
|
||||||
if (c->opts.ratelimit_errors &&
|
if (c->opts.ratelimit_errors &&
|
||||||
!(flags & FSCK_NO_RATELIMIT) &&
|
!(flags & FSCK_NO_RATELIMIT) &&
|
||||||
s->nr >= FSCK_ERR_RATELIMIT_NR) {
|
s->nr >= FSCK_ERR_RATELIMIT_NR) {
|
||||||
@ -123,8 +136,6 @@ int bch2_fsck_err(struct bch_fs *c, unsigned flags, const char *fmt, ...)
|
|||||||
print = false;
|
print = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
printbuf_reset(&s->buf);
|
|
||||||
out = &s->buf;
|
|
||||||
s->nr++;
|
s->nr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,10 +144,6 @@ int bch2_fsck_err(struct bch_fs *c, unsigned flags, const char *fmt, ...)
|
|||||||
prt_printf(out, bch2_log_msg(c, ""));
|
prt_printf(out, bch2_log_msg(c, ""));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
va_start(args, fmt);
|
|
||||||
prt_vprintf(out, fmt, args);
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
if (test_bit(BCH_FS_FSCK_DONE, &c->flags)) {
|
if (test_bit(BCH_FS_FSCK_DONE, &c->flags)) {
|
||||||
if (c->opts.errors != BCH_ON_ERROR_continue ||
|
if (c->opts.errors != BCH_ON_ERROR_continue ||
|
||||||
!(flags & (FSCK_CAN_FIX|FSCK_CAN_IGNORE))) {
|
!(flags & (FSCK_CAN_FIX|FSCK_CAN_IGNORE))) {
|
||||||
@ -190,6 +197,9 @@ int bch2_fsck_err(struct bch_fs *c, unsigned flags, const char *fmt, ...)
|
|||||||
else if (suppressing)
|
else if (suppressing)
|
||||||
bch_err(c, "Ratelimiting new instances of previous error");
|
bch_err(c, "Ratelimiting new instances of previous error");
|
||||||
|
|
||||||
|
if (s)
|
||||||
|
s->ret = ret;
|
||||||
|
|
||||||
mutex_unlock(&c->fsck_error_lock);
|
mutex_unlock(&c->fsck_error_lock);
|
||||||
|
|
||||||
printbuf_exit(&buf);
|
printbuf_exit(&buf);
|
||||||
@ -214,11 +224,11 @@ void bch2_flush_fsck_errs(struct bch_fs *c)
|
|||||||
mutex_lock(&c->fsck_error_lock);
|
mutex_lock(&c->fsck_error_lock);
|
||||||
|
|
||||||
list_for_each_entry_safe(s, n, &c->fsck_errors, list) {
|
list_for_each_entry_safe(s, n, &c->fsck_errors, list) {
|
||||||
if (s->ratelimited)
|
if (s->ratelimited && s->last_msg)
|
||||||
bch_err(c, "Saw %llu errors like:\n %s", s->nr, s->buf.buf);
|
bch_err(c, "Saw %llu errors like:\n %s", s->nr, s->last_msg);
|
||||||
|
|
||||||
list_del(&s->list);
|
list_del(&s->list);
|
||||||
printbuf_exit(&s->buf);
|
kfree(s->last_msg);
|
||||||
kfree(s);
|
kfree(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,8 @@ struct fsck_err_state {
|
|||||||
const char *fmt;
|
const char *fmt;
|
||||||
u64 nr;
|
u64 nr;
|
||||||
bool ratelimited;
|
bool ratelimited;
|
||||||
struct printbuf buf;
|
int ret;
|
||||||
|
char *last_msg;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FSCK_CAN_FIX (1 << 0)
|
#define FSCK_CAN_FIX (1 << 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user