mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-08 00:29:36 -04:00
bcachefs: Disk usage in compressed sectors, not uncompressed
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
committed by
Kent Overstreet
parent
8b335baef2
commit
4628529f15
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user