bcachefs: fix integer underflow in journal code
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 28 Feb 2019 00:14:23 +0000 (19:14 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:16 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/journal.c
fs/bcachefs/journal.h

index 91d0e5d443ed01f4725c1d74b14c7f0383e67c3e..3a60402440640a14d280c94bcdb26f324634a4fc 100644 (file)
@@ -256,6 +256,8 @@ static int journal_entry_open(struct journal *j)
        do {
                old.v = new.v = v;
 
+               EBUG_ON(journal_state_count(new, new.idx));
+
                if (old.cur_entry_offset == JOURNAL_ENTRY_ERROR_VAL)
                        return -EROFS;
 
@@ -429,7 +431,7 @@ void bch2_journal_entry_res_resize(struct journal *j,
        if (d <= 0)
                goto out;
 
-       j->cur_entry_u64s -= d;
+       j->cur_entry_u64s = max_t(int, 0, j->cur_entry_u64s - d);
        smp_mb();
        state = READ_ONCE(j->reservations);
 
index 4acb0f59396dedc6594c3f8dbf60993034dafec4..77d59fb0b15133bdf1bd464e6a6265fe02dee99c 100644 (file)
@@ -292,6 +292,8 @@ static inline int journal_res_get_fast(struct journal *j,
                if (new.cur_entry_offset + res->u64s > j->cur_entry_u64s)
                        return 0;
 
+               EBUG_ON(!journal_state_count(new, new.idx));
+
                if (flags & JOURNAL_RES_GET_CHECK)
                        return 1;