bcachefs: Fix pr_tab_rjust()

pr_tab_rjust() was broken and leaving a null somewhere in the output
string - this patch fixes it and simplifies it a bit.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
This commit is contained in:
Kent Overstreet 2022-03-06 14:04:34 -05:00 committed by Kent Overstreet
parent e1f7fa06a8
commit 07b8121f07
2 changed files with 38 additions and 21 deletions

View file

@ -101,8 +101,14 @@ STRTO_H(strtou64, u64)
static int bch2_printbuf_realloc(struct printbuf *out, unsigned extra)
{
unsigned new_size = roundup_pow_of_two(out->size + extra);
char *buf = krealloc(out->buf, new_size, !out->atomic ? GFP_KERNEL : GFP_ATOMIC);
unsigned new_size;
char *buf;
if (out->pos + extra + 1 < out->size)
return 0;
new_size = roundup_pow_of_two(out->size + extra);
buf = krealloc(out->buf, new_size, !out->atomic ? GFP_KERNEL : GFP_ATOMIC);
if (!buf) {
out->allocation_failure = true;
@ -131,6 +137,33 @@ void bch2_pr_buf(struct printbuf *out, const char *fmt, ...)
out->pos += len;
}
void bch2_pr_tab_rjust(struct printbuf *buf)
{
BUG_ON(buf->tabstop > ARRAY_SIZE(buf->tabstops));
if (printbuf_linelen(buf) < buf->tabstops[buf->tabstop]) {
unsigned move = buf->pos - buf->last_field;
unsigned shift = buf->tabstops[buf->tabstop] -
printbuf_linelen(buf);
bch2_printbuf_realloc(buf, shift);
if (buf->last_field + shift + 1 < buf->size) {
move = min(move, buf->size - 1 - buf->last_field - shift);
memmove(buf->buf + buf->last_field + shift,
buf->buf + buf->last_field,
move);
memset(buf->buf + buf->last_field, ' ', shift);
buf->pos += shift;
buf->buf[buf->pos] = 0;
}
}
buf->last_field = buf->pos;
buf->tabstop++;
}
void bch2_hprint(struct printbuf *buf, s64 v)
{
int u, t = 0;

View file

@ -334,27 +334,11 @@ static inline void pr_tab(struct printbuf *buf)
buf->tabstop++;
}
void bch2_pr_tab_rjust(struct printbuf *);
static inline void pr_tab_rjust(struct printbuf *buf)
{
ssize_t shift = min_t(ssize_t, buf->tabstops[buf->tabstop] -
printbuf_linelen(buf),
printbuf_remaining(buf));
ssize_t move = min_t(ssize_t, buf->pos - buf->last_field,
printbuf_remaining(buf) - shift);
BUG_ON(buf->tabstop > ARRAY_SIZE(buf->tabstops));
if (shift > 0) {
memmove(buf->buf + buf->last_field + shift,
buf->buf + buf->last_field,
move);
memset(buf->buf + buf->last_field, ' ', shift);
buf->pos += shift;
buf->buf[buf->pos] = 0;
}
buf->last_field = buf->pos;
buf->tabstop++;
bch2_pr_tab_rjust(buf);
}
void bch2_pr_units(struct printbuf *, s64, s64);