diff --git a/.bcachefs_revision b/.bcachefs_revision index 9f81e277..f7a6bdbc 100644 --- a/.bcachefs_revision +++ b/.bcachefs_revision @@ -1 +1 @@ -8bf4b038d41230504d3f0315a35e4d7a056e0a65 +7227ff07f14b424e92b13dd5099aba9ece1ec43c diff --git a/libbcachefs/buckets.c b/libbcachefs/buckets.c index 15a07e36..c68683eb 100644 --- a/libbcachefs/buckets.c +++ b/libbcachefs/buckets.c @@ -338,12 +338,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; @@ -661,7 +666,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); diff --git a/libbcachefs/extents.c b/libbcachefs/extents.c index ef36d244..5c48d2d9 100644 --- a/libbcachefs/extents.c +++ b/libbcachefs/extents.c @@ -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: diff --git a/libbcachefs/fifo.h b/libbcachefs/fifo.h index 085d828e..9715ddbd 100644 --- a/libbcachefs/fifo.h +++ b/libbcachefs/fifo.h @@ -12,7 +12,9 @@ struct { \ #define DECLARE_FIFO(type, name) FIFO(type) name #define fifo_buf_size(fifo) \ - (roundup_pow_of_two((fifo)->size) * sizeof((fifo)->data[0])) + ((fifo)->size \ + ? roundup_pow_of_two((fifo)->size) * sizeof((fifo)->data[0]) \ + : 0) #define init_fifo(fifo, _size, _gfp) \ ({ \ diff --git a/libbcachefs/move.c b/libbcachefs/move.c index c9495ab7..e93725bf 100644 --- a/libbcachefs/move.c +++ b/libbcachefs/move.c @@ -4,6 +4,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; diff --git a/libbcachefs/super.c b/libbcachefs/super.c index b7a6f5fb..dded527d 100644 --- a/libbcachefs/super.c +++ b/libbcachefs/super.c @@ -686,7 +686,7 @@ const char *bch2_fs_start(struct bch_fs *c) const char *err = "cannot allocate memory"; struct bch_sb_field_members *mi; struct bch_dev *ca; - time64_t now = ktime_get_seconds(); + time64_t now = ktime_get_real_seconds(); unsigned i; int ret = -EINVAL; @@ -1456,7 +1456,7 @@ have_slot: /* success: */ mi->members[dev_idx] = dev_mi; - mi->members[dev_idx].last_mount = cpu_to_le64(ktime_get_seconds()); + mi->members[dev_idx].last_mount = cpu_to_le64(ktime_get_real_seconds()); c->disk_sb.sb->nr_devices = nr_devices; ca->disk_sb.sb->dev_idx = dev_idx; @@ -1532,7 +1532,7 @@ int bch2_dev_online(struct bch_fs *c, const char *path) mi = bch2_sb_get_members(c->disk_sb.sb); mi->members[ca->dev_idx].last_mount = - cpu_to_le64(ktime_get_seconds()); + cpu_to_le64(ktime_get_real_seconds()); bch2_write_super(c); mutex_unlock(&c->sb_lock);