summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-07-30 14:18:29 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2019-08-09 16:41:08 -0400
commitfe89105140f3f4aec4b6590bd3be10ace5fb2ffe (patch)
tree6c697de8f1a82c6971a50862503c46b7527d6a75
parent7bdb29c788d0ee82d71b9d477c40ac584a574b26 (diff)
bcachefs: Count reserved extents as holes
-rw-r--r--fs/bcachefs/fs-io.c20
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++) {