diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-07-30 14:18:29 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-08-09 16:41:08 -0400 |
commit | fe89105140f3f4aec4b6590bd3be10ace5fb2ffe (patch) | |
tree | 6c697de8f1a82c6971a50862503c46b7527d6a75 | |
parent | 7bdb29c788d0ee82d71b9d477c40ac584a574b26 (diff) |
bcachefs: Count reserved extents as holes
-rw-r--r-- | fs/bcachefs/fs-io.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index 0a19ef068b2e..7e8303b6cc23 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -511,6 +511,7 @@ struct bch_page_sector { /* i_sectors: */ enum { SECTOR_UNALLOCATED, + SECTOR_RESERVED, SECTOR_DIRTY, SECTOR_ALLOCATED, } state:2; @@ -755,10 +756,10 @@ static void bch2_set_page_dirty(struct bch_fs *c, s->s[i].replicas_reserved += sectors; res->disk.sectors -= sectors; - if (s->s[i].state == SECTOR_UNALLOCATED) { - s->s[i].state = SECTOR_DIRTY; + if (s->s[i].state == SECTOR_UNALLOCATED) dirty_sectors++; - } + + s->s[i].state = max_t(unsigned, s->s[i].state, SECTOR_DIRTY); } if (dirty_sectors) @@ -984,6 +985,9 @@ static void bch2_add_page_sectors(struct bio *bio, struct bkey_s_c k) struct bvec_iter iter; struct bio_vec bv; unsigned nr_ptrs = bch2_bkey_nr_ptrs_allocated(k); + unsigned state = k.k->type == KEY_TYPE_reservation + ? SECTOR_RESERVED + : SECTOR_ALLOCATED; BUG_ON(bio->bi_iter.bi_sector < bkey_start_offset(k.k)); BUG_ON(bio_end_sector(bio) > k.k->p.offset); @@ -997,7 +1001,7 @@ static void bch2_add_page_sectors(struct bio *bio, struct bkey_s_c k) i < (bv.bv_offset + bv.bv_len) >> 9; i++) { s->s[i].nr_replicas = nr_ptrs; - s->s[i].state = SECTOR_ALLOCATED; + s->s[i].state = state; } } } @@ -1400,7 +1404,7 @@ do_io: orig = *s; for (i = 0; i < PAGE_SECTORS; i++) { - if (s->s[i].state == SECTOR_UNALLOCATED) + if (s->s[i].state < SECTOR_DIRTY) continue; nr_replicas_this_write = @@ -1410,7 +1414,7 @@ do_io: } for (i = 0; i < PAGE_SECTORS; i++) { - if (s->s[i].state == SECTOR_UNALLOCATED) + if (s->s[i].state < SECTOR_DIRTY) continue; s->s[i].nr_replicas = w->opts.compression @@ -1434,7 +1438,7 @@ do_io: u64 sector; while (offset < PAGE_SECTORS && - orig.s[offset].state == SECTOR_UNALLOCATED) + orig.s[offset].state < SECTOR_DIRTY) offset++; if (offset == PAGE_SECTORS) @@ -1443,7 +1447,7 @@ do_io: sector = ((u64) page->index << PAGE_SECTOR_SHIFT) + offset; while (offset + sectors < PAGE_SECTORS && - orig.s[offset + sectors].state != SECTOR_UNALLOCATED) + orig.s[offset + sectors].state >= SECTOR_DIRTY) sectors++; for (i = offset; i < offset + sectors; i++) { |