]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
bcachefs: Compression fixes
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 5 Dec 2018 17:30:02 +0000 (12:30 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:13 +0000 (17:08 -0400)
regressions from switching disk space accounting to be in compressed
sectors

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/extents.c
fs/bcachefs/move.c

index c9a6f6e4a16593b309d402f434071c3b5e073973..1076d32945f8818f21e46494523ea975481a4212 100644 (file)
@@ -305,8 +305,7 @@ unsigned bch2_extent_is_compressed(struct bkey_s_c k)
 
                extent_for_each_ptr_decode(e, p, entry)
                        if (!p.ptr.cached &&
-                           p.crc.compression_type != BCH_COMPRESSION_NONE &&
-                           p.crc.compressed_size < p.crc.live_size)
+                           p.crc.compression_type != BCH_COMPRESSION_NONE)
                                ret += p.crc.compressed_size;
        }
        }
index aff611c908ef124c0e77d396969fe417c7031ca0..9081952316b083b81f10efdb47e3300ce622b8e0 100644 (file)
@@ -128,13 +128,15 @@ static int bch2_migrate_index_update(struct bch_write_op *op)
                                                 op->opts.data_replicas);
 
                /*
-                * It's possible we race, and for whatever reason the extent now
-                * has fewer replicas than when we last looked at it - meaning
-                * we need to get a disk reservation here:
+                * If we're not fully overwriting @k, and it's compressed, we
+                * need a reservation for all the pointers in @insert
                 */
                nr = bch2_bkey_nr_dirty_ptrs(bkey_i_to_s_c(&insert->k_i)) -
-                       (bch2_bkey_nr_dirty_ptrs(k) + m->nr_ptrs_reserved);
-               if (nr > 0) {
+                        m->nr_ptrs_reserved;
+
+               if (insert->k.size < k.k->size &&
+                   bch2_extent_is_compressed(k) &&
+                   nr > 0) {
                        /*
                         * can't call bch2_disk_reservation_add() with btree
                         * locks held, at least not without a song and dance
@@ -242,8 +244,16 @@ int bch2_migrate_write_init(struct bch_fs *c, struct migrate_write *m,
 
        switch (data_cmd) {
        case DATA_ADD_REPLICAS: {
+               /*
+                * DATA_ADD_REPLICAS is used for moving data to a different
+                * device in the background, and due to compression the new copy
+                * might take up more space than the old copy:
+                */
+#if 0
                int nr = (int) io_opts.data_replicas -
                        bch2_bkey_nr_dirty_ptrs(k);
+#endif
+               int nr = (int) io_opts.data_replicas;
 
                if (nr > 0) {
                        m->op.nr_replicas = m->nr_ptrs_reserved = nr;