Commit 4628529f authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Disk usage in compressed sectors, not uncompressed

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 8b335bae
...@@ -339,12 +339,17 @@ void bch2_fs_usage_apply(struct bch_fs *c, ...@@ -339,12 +339,17 @@ void bch2_fs_usage_apply(struct bch_fs *c,
{ {
struct fs_usage_sum sum = __fs_usage_sum(*stats); struct fs_usage_sum sum = __fs_usage_sum(*stats);
s64 added = sum.data + sum.reserved; s64 added = sum.data + sum.reserved;
s64 should_not_have_added;
/* /*
* Not allowed to reduce sectors_available except by getting a * Not allowed to reduce sectors_available except by getting a
* reservation: * 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) { if (added > 0) {
disk_res->sectors -= added; disk_res->sectors -= added;
...@@ -667,7 +672,7 @@ static void bch2_mark_extent(struct bch_fs *c, struct bkey_s_c k, ...@@ -667,7 +672,7 @@ static void bch2_mark_extent(struct bch_fs *c, struct bkey_s_c k,
stats->replicas stats->replicas
[!p.ptr.cached && replicas ? replicas - 1 : 0].data [!p.ptr.cached && replicas ? replicas - 1 : 0].data
[!p.ptr.cached ? data_type : BCH_DATA_CACHED] += [!p.ptr.cached ? data_type : BCH_DATA_CACHED] +=
sectors; disk_sectors;
bch2_mark_pointer(c, e, p, disk_sectors, data_type, bch2_mark_pointer(c, e, p, disk_sectors, data_type,
stats, journal_seq, flags); stats, journal_seq, flags);
......
...@@ -235,7 +235,7 @@ unsigned bch2_extent_is_compressed(struct bkey_s_c k) ...@@ -235,7 +235,7 @@ unsigned bch2_extent_is_compressed(struct bkey_s_c k)
if (!p.ptr.cached && if (!p.ptr.cached &&
p.crc.compression_type != BCH_COMPRESSION_NONE && p.crc.compression_type != BCH_COMPRESSION_NONE &&
p.crc.compressed_size < p.crc.live_size) 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, ...@@ -1275,8 +1275,7 @@ bch2_extent_can_insert(struct btree_insert *trans,
switch (bch2_disk_reservation_add(trans->c, switch (bch2_disk_reservation_add(trans->c,
trans->disk_res, trans->disk_res,
sectors * bch2_extent_nr_dirty_ptrs(k), sectors, flags)) {
flags)) {
case 0: case 0:
break; break;
case -ENOSPC: case -ENOSPC:
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "btree_gc.h" #include "btree_gc.h"
#include "btree_update.h" #include "btree_update.h"
#include "buckets.h" #include "buckets.h"
#include "disk_groups.h"
#include "inode.h" #include "inode.h"
#include "io.h" #include "io.h"
#include "journal_reclaim.h" #include "journal_reclaim.h"
...@@ -260,8 +261,26 @@ int bch2_migrate_write_init(struct bch_fs *c, struct migrate_write *m, ...@@ -260,8 +261,26 @@ int bch2_migrate_write_init(struct bch_fs *c, struct migrate_write *m,
} }
break; 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; break;
}
case DATA_PROMOTE: case DATA_PROMOTE:
m->op.flags |= BCH_WRITE_ALLOC_NOWAIT; m->op.flags |= BCH_WRITE_ALLOC_NOWAIT;
m->op.flags |= BCH_WRITE_CACHED; m->op.flags |= BCH_WRITE_CACHED;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment