summaryrefslogtreecommitdiff
path: root/libbcachefs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-02-22 04:55:39 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2022-02-22 04:56:09 -0500
commit5528e3ae62ead1cfd5be36c1712d1a2dd5ccb3af (patch)
tree1f83918fd37fd1b3387ad194bde6748652d6e35f /libbcachefs
parentc06026ac542911329a99a3f02a4f5732d6c8e51c (diff)
Update bcachefs sources to 9b3aa5ec6c bcachefs: Add tabstops to printbufs
Diffstat (limited to 'libbcachefs')
-rw-r--r--libbcachefs/move.c4
-rw-r--r--libbcachefs/super-io.c12
-rw-r--r--libbcachefs/util.c8
-rw-r--r--libbcachefs/util.h80
4 files changed, 81 insertions, 23 deletions
diff --git a/libbcachefs/move.c b/libbcachefs/move.c
index 7ca7ce39..16bca144 100644
--- a/libbcachefs/move.c
+++ b/libbcachefs/move.c
@@ -481,9 +481,7 @@ static void move_read_endio(struct bio *bio)
atomic_sub(io->read_sectors, &ctxt->read_sectors);
io->read_completed = true;
- if (next_pending_write(ctxt))
- wake_up(&ctxt->wait);
-
+ wake_up(&ctxt->wait);
closure_put(&ctxt->cl);
}
diff --git a/libbcachefs/super-io.c b/libbcachefs/super-io.c
index 08613a73..c22e2c03 100644
--- a/libbcachefs/super-io.c
+++ b/libbcachefs/super-io.c
@@ -1059,7 +1059,7 @@ static void bch2_sb_members_to_text(struct printbuf *out, struct bch_sb *sb,
pr_buf(out, "Device: %u", i);
pr_newline(out);
- printbuf_indent_push(out, 2);
+ pr_indent_push(out, 2);
pr_buf(out, "UUID: ");
pr_uuid(out, m->uuid.b);
@@ -1127,7 +1127,7 @@ static void bch2_sb_members_to_text(struct printbuf *out, struct bch_sb *sb,
BCH_MEMBER_DISCARD(m));
pr_newline(out);
- printbuf_indent_pop(out, 2);
+ pr_indent_pop(out, 2);
}
}
@@ -1468,9 +1468,9 @@ void bch2_sb_field_to_text(struct printbuf *out, struct bch_sb *sb,
pr_newline(out);
if (ops && ops->to_text) {
- printbuf_indent_push(out, 2);
+ pr_indent_push(out, 2);
bch2_sb_field_ops[type]->to_text(out, sb, f);
- printbuf_indent_pop(out, 2);
+ pr_indent_pop(out, 2);
}
}
@@ -1653,9 +1653,9 @@ void bch2_sb_to_text(struct printbuf *out, struct bch_sb *sb,
pr_newline(out);
pr_buf(out, "layout:");
pr_newline(out);
- printbuf_indent_push(out, 2);
+ pr_indent_push(out, 2);
bch2_sb_layout_to_text(out, &sb->layout);
- printbuf_indent_pop(out, 2);
+ pr_indent_pop(out, 2);
}
vstruct_for_each(sb, f)
diff --git a/libbcachefs/util.c b/libbcachefs/util.c
index ab808fe4..26d0ae30 100644
--- a/libbcachefs/util.c
+++ b/libbcachefs/util.c
@@ -117,17 +117,11 @@ void bch2_hprint(struct printbuf *buf, s64 v)
if (u && t && v < 100 && v > -100)
pr_buf(buf, ".%i", t / 103);
if (u)
- pr_buf(buf, "%c", si_units[u]);
+ pr_char(buf, si_units[u]);
}
void bch2_pr_units(struct printbuf *out, s64 raw, s64 bytes)
{
- if (raw < 0) {
- pr_buf(out, "-");
- raw = -raw;
- bytes = -bytes;
- }
-
switch (out->units) {
case PRINTBUF_UNITS_RAW:
pr_buf(out, "%llu", raw);
diff --git a/libbcachefs/util.h b/libbcachefs/util.h
index b43c1953..58d55704 100644
--- a/libbcachefs/util.h
+++ b/libbcachefs/util.h
@@ -244,8 +244,12 @@ enum printbuf_units {
struct printbuf {
char *pos;
char *end;
+ char *last_newline;
+ char *last_field;
unsigned indent;
enum printbuf_units units;
+ unsigned tabstop;
+ unsigned tabstops[4];
};
static inline size_t printbuf_remaining(struct printbuf *buf)
@@ -253,28 +257,44 @@ static inline size_t printbuf_remaining(struct printbuf *buf)
return buf->end - buf->pos;
}
+static inline size_t printbuf_linelen(struct printbuf *buf)
+{
+ return buf->pos - buf->last_newline;
+}
+
#define _PBUF(_buf, _len) \
((struct printbuf) { \
- .pos = _buf, \
- .end = _buf + _len, \
+ .pos = _buf, \
+ .end = _buf + _len, \
+ .last_newline = _buf, \
+ .last_field = _buf, \
})
#define PBUF(_buf) _PBUF(_buf, sizeof(_buf))
+
#define pr_buf(_out, ...) \
do { \
(_out)->pos += scnprintf((_out)->pos, printbuf_remaining(_out), \
__VA_ARGS__); \
} while (0)
-static inline void printbuf_indent_push(struct printbuf *buf, unsigned spaces)
+static inline void pr_char(struct printbuf *out, char c)
+{
+ if (printbuf_remaining(out) > 1) {
+ *out->pos = c;
+ out->pos++;
+ }
+}
+
+static inline void pr_indent_push(struct printbuf *buf, unsigned spaces)
{
buf->indent += spaces;
while (spaces--)
- pr_buf(buf, " ");
+ pr_char(buf, ' ');
}
-static inline void printbuf_indent_pop(struct printbuf *buf, unsigned spaces)
+static inline void pr_indent_pop(struct printbuf *buf, unsigned spaces)
{
buf->indent -= spaces;
}
@@ -283,14 +303,60 @@ static inline void pr_newline(struct printbuf *buf)
{
unsigned i;
- pr_buf(buf, "\n");
+ pr_char(buf, '\n');
+
+ buf->last_newline = buf->pos;
+
for (i = 0; i < buf->indent; i++)
- pr_buf(buf, " ");
+ pr_char(buf, ' ');
+
+ buf->last_field = buf->pos;
+ buf->tabstop = 0;
+}
+
+static inline void pr_tab(struct printbuf *buf)
+{
+ BUG_ON(buf->tabstop > ARRAY_SIZE(buf->tabstops));
+
+ while (printbuf_remaining(buf) > 1 &&
+ printbuf_linelen(buf) < buf->tabstops[buf->tabstop])
+ pr_char(buf, ' ');
+
+ buf->last_field = buf->pos;
+ buf->tabstop++;
+}
+
+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->last_field + shift,
+ buf->last_field,
+ move);
+ memset(buf->last_field, ' ', shift);
+ buf->pos += shift;
+ *buf->pos = 0;
+ }
+
+ buf->last_field = buf->pos;
+ buf->tabstop++;
}
void bch2_pr_units(struct printbuf *, s64, s64);
#define pr_units(...) bch2_pr_units(__VA_ARGS__)
+static inline void pr_sectors(struct printbuf *out, u64 v)
+{
+ bch2_pr_units(out, v, v << 9);
+}
+
#ifdef __KERNEL__
static inline void pr_time(struct printbuf *out, u64 time)
{