]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Repair fragmentation_lru in alloc_write_key()
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 29 Jun 2024 22:37:13 +0000 (18:37 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 29 Jun 2024 22:37:13 +0000 (18:37 -0400)
fragmentation_lru derives from dirty_sectors, and wasn't being checked.

Co-developed-by: Daniel Hill <daniel@gluo.nz>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_gc.c
fs/bcachefs/sb-errors_format.h

index 0e477a926579a77a1736483859f5469dd8d29d7d..7c72a9e6f511a8d2188198da28ce428abf8a585e 100644 (file)
@@ -903,6 +903,8 @@ static int bch2_alloc_write_key(struct btree_trans *trans,
                bch2_dev_usage_update(c, ca, &old_gc, &gc, 0, true);
        percpu_up_read(&c->mark_lock);
 
+       gc.fragmentation_lru = alloc_lru_idx_fragmentation(gc, ca);
+
        if (fsck_err_on(new.data_type != gc.data_type, c,
                        alloc_key_data_type_wrong,
                        "bucket %llu:%llu gen %u has wrong data_type"
@@ -916,23 +918,19 @@ static int bch2_alloc_write_key(struct btree_trans *trans,
 #define copy_bucket_field(_errtype, _f)                                        \
        if (fsck_err_on(new._f != gc._f, c, _errtype,                   \
                        "bucket %llu:%llu gen %u data type %s has wrong " #_f   \
-                       ": got %u, should be %u",                       \
+                       ": got %llu, should be %llu",                   \
                        iter->pos.inode, iter->pos.offset,              \
                        gc.gen,                                         \
                        bch2_data_type_str(gc.data_type),               \
-                       new._f, gc._f))                                 \
+                       (u64) new._f, (u64) gc._f))                             \
                new._f = gc._f;                                         \
 
-       copy_bucket_field(alloc_key_gen_wrong,
-                         gen);
-       copy_bucket_field(alloc_key_dirty_sectors_wrong,
-                         dirty_sectors);
-       copy_bucket_field(alloc_key_cached_sectors_wrong,
-                         cached_sectors);
-       copy_bucket_field(alloc_key_stripe_wrong,
-                         stripe);
-       copy_bucket_field(alloc_key_stripe_redundancy_wrong,
-                         stripe_redundancy);
+       copy_bucket_field(alloc_key_gen_wrong,                  gen);
+       copy_bucket_field(alloc_key_dirty_sectors_wrong,        dirty_sectors);
+       copy_bucket_field(alloc_key_cached_sectors_wrong,       cached_sectors);
+       copy_bucket_field(alloc_key_stripe_wrong,               stripe);
+       copy_bucket_field(alloc_key_stripe_redundancy_wrong,    stripe_redundancy);
+       copy_bucket_field(alloc_key_fragmentation_lru_wrong,    fragmentation_lru);
 #undef copy_bucket_field
 
        if (!bch2_alloc_v4_cmp(*old, new))
@@ -946,7 +944,7 @@ static int bch2_alloc_write_key(struct btree_trans *trans,
        a->v = new;
 
        /*
-        * The trigger normally makes sure this is set, but we're not running
+        * The trigger normally makes sure these are set, but we're not running
         * triggers:
         */
        if (a->v.data_type == BCH_DATA_cached && !a->v.io_time[READ])
index d6f35a99c4291c1b44183f80f54647cf0c9d6f93..d54121ec093feb8e241edee2764c566c602e3cc6 100644 (file)
@@ -286,7 +286,8 @@ enum bch_fsck_flags {
        x(accounting_mismatch,                                  272,    0)              \
        x(accounting_replicas_not_marked,                       273,    0)              \
        x(invalid_btree_id,                                     274,    0)              \
-       x(alloc_key_io_time_bad,                                275,    0)
+       x(alloc_key_io_time_bad,                                275,    0)              \
+       x(alloc_key_fragmentation_lru_wrong,                    276,    FSCK_AUTOFIX)
 
 enum bch_sb_error_id {
 #define x(t, n, ...) BCH_FSCK_ERR_##t = n,