bcachefs: Disk usage in compressed sectors, not uncompressed
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 5 Nov 2018 04:10:09 +0000 (23:10 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:11 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/buckets.c
fs/bcachefs/extents.c
fs/bcachefs/move.c

index 28ec8a58319ca4f00b99523160132e5e1551dfce..54eb1b6b820b7d4bfe9e084dd099007a3a03476d 100644 (file)
@@ -339,12 +339,17 @@ void bch2_fs_usage_apply(struct bch_fs *c,
 {
        struct fs_usage_sum sum = __fs_usage_sum(*stats);
        s64 added = sum.data + sum.reserved;
+       s64 should_not_have_added;
 
        /*
         * Not allowed to reduce sectors_available except by getting a
         * reservation:
         */
-       BUG_ON(added > (s64) (disk_res ? disk_res->sectors : 0));
+       should_not_have_added = added - (s64) (disk_res ? disk_res->sectors : 0);
+       if (WARN_ON(should_not_have_added > 0)) {
+               atomic64_sub(should_not_have_added, &c->sectors_available);
+               added -= should_not_have_added;
+       }
 
        if (added > 0) {
                disk_res->sectors       -= added;
@@ -667,7 +672,7 @@ static void bch2_mark_extent(struct bch_fs *c, struct bkey_s_c k,
                        stats->replicas
                                [!p.ptr.cached && replicas ? replicas - 1 : 0].data
                                [!p.ptr.cached ? data_type : BCH_DATA_CACHED] +=
-                                       sectors;
+                                       disk_sectors;
 
                        bch2_mark_pointer(c, e, p, disk_sectors, data_type,
                                          stats, journal_seq, flags);
index e2bb1502eaad7a8a9b45cebdadb52bb37a75e892..1606826e78025a5b1caa6015cc32c01c24c8ec45 100644 (file)
@@ -235,7 +235,7 @@ unsigned bch2_extent_is_compressed(struct bkey_s_c k)
                        if (!p.ptr.cached &&
                            p.crc.compression_type != BCH_COMPRESSION_NONE &&
                            p.crc.compressed_size < p.crc.live_size)
-                               ret = max_t(unsigned, ret, p.crc.compressed_size);
+                               ret += p.crc.compressed_size;
        }
        }
 
@@ -1275,8 +1275,7 @@ bch2_extent_can_insert(struct btree_insert *trans,
 
                switch (bch2_disk_reservation_add(trans->c,
                                trans->disk_res,
-                               sectors * bch2_extent_nr_dirty_ptrs(k),
-                               flags)) {
+                               sectors, flags)) {
                case 0:
                        break;
                case -ENOSPC:
index b2bf0944d59d9d9a81584b0535e550fe8630e053..1f6bad1ae388be09d0e83d9f3f28fb852be4b37a 100644 (file)
@@ -5,6 +5,7 @@
 #include "btree_gc.h"
 #include "btree_update.h"
 #include "buckets.h"
+#include "disk_groups.h"
 #include "inode.h"
 #include "io.h"
 #include "journal_reclaim.h"
@@ -260,8 +261,26 @@ int bch2_migrate_write_init(struct bch_fs *c, struct migrate_write *m,
                }
                break;
        }
-       case DATA_REWRITE:
+       case DATA_REWRITE: {
+               const union bch_extent_entry *entry;
+               struct extent_ptr_decoded p;
+               unsigned compressed_sectors = 0;
+
+               extent_for_each_ptr_decode(bkey_s_c_to_extent(k), p, entry)
+                       if (!p.ptr.cached &&
+                           p.crc.compression_type != BCH_COMPRESSION_NONE &&
+                           bch2_dev_in_target(c, p.ptr.dev, data_opts.target))
+                               compressed_sectors += p.crc.compressed_size;
+
+               if (compressed_sectors) {
+                       ret = bch2_disk_reservation_add(c, &m->op.res,
+                                       compressed_sectors,
+                                       BCH_DISK_RESERVATION_NOFAIL);
+                       if (ret)
+                               return ret;
+               }
                break;
+       }
        case DATA_PROMOTE:
                m->op.flags     |= BCH_WRITE_ALLOC_NOWAIT;
                m->op.flags     |= BCH_WRITE_CACHED;