summaryrefslogtreecommitdiff
path: root/libbcachefs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-04-10 20:02:24 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2022-04-10 20:02:24 -0400
commit2668cb95d993740de7a104fb20f3a13bbfd0da5c (patch)
treeacbad1ef5abfc24c75bae564fe57ed9bc94939a0 /libbcachefs
parentd256ebaa81b554305b57e9967626d53f399a1452 (diff)
Update bcachefs sources to 202b20c48f bcachefs: Ensure buckets have io_time[READ] set
Diffstat (limited to 'libbcachefs')
-rw-r--r--libbcachefs/alloc_background.c34
-rw-r--r--libbcachefs/lru.c8
-rw-r--r--libbcachefs/lru.h2
3 files changed, 25 insertions, 19 deletions
diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c
index 4f208fab..c372385d 100644
--- a/libbcachefs/alloc_background.c
+++ b/libbcachefs/alloc_background.c
@@ -520,7 +520,7 @@ static int bch2_bucket_do_index(struct btree_trans *trans,
goto err;
if (ca->mi.freespace_initialized &&
- bch2_fs_inconsistent_on(old.k->type != old_type, c,
+ bch2_trans_inconsistent_on(old.k->type != old_type, trans,
"incorrect key when %s %s btree (got %s should be %s)\n"
" for %s",
set ? "setting" : "clearing",
@@ -545,7 +545,6 @@ int bch2_trans_mark_alloc(struct btree_trans *trans,
{
struct bch_fs *c = trans->c;
struct bch_alloc_v4 old_a, *new_a;
- u64 old_lru, new_lru;
int ret = 0;
/*
@@ -583,16 +582,21 @@ int bch2_trans_mark_alloc(struct btree_trans *trans,
return ret;
}
- old_lru = alloc_lru_idx(old_a);
- new_lru = alloc_lru_idx(*new_a);
+ if (new_a->data_type == BCH_DATA_cached &&
+ !new_a->io_time[READ])
+ new_a->io_time[READ] = max_t(u64, 1, atomic64_read(&c->io_clock[READ].now));
+
+ if ((old_a.data_type == BCH_DATA_cached) !=
+ (new_a->data_type == BCH_DATA_cached)) {
+ u64 old_lru = alloc_lru_idx(old_a);
+ u64 new_lru = alloc_lru_idx(*new_a);
- if (old_lru != new_lru) {
ret = bch2_lru_change(trans, new->k.p.inode, new->k.p.offset,
old_lru, &new_lru);
if (ret)
return ret;
- if (new_lru && new_a->io_time[READ] != new_lru)
+ if (new_a->data_type == BCH_DATA_cached)
new_a->io_time[READ] = new_lru;
}
@@ -869,10 +873,10 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
if (!a.io_time[READ])
a.io_time[READ] = atomic64_read(&c->io_clock[READ].now);
- ret = bch2_lru_change(trans,
- alloc_k.k->p.inode,
- alloc_k.k->p.offset,
- 0, &a.io_time[READ]);
+ ret = bch2_lru_set(trans,
+ alloc_k.k->p.inode,
+ alloc_k.k->p.offset,
+ &a.io_time[READ]);
if (ret)
goto err;
@@ -950,7 +954,7 @@ static int bch2_clear_need_discard(struct btree_trans *trans, struct bpos pos,
goto write;
}
- if (bch2_fs_inconsistent_on(a->v.journal_seq > c->journal.flushed_seq_ondisk, c,
+ if (bch2_trans_inconsistent_on(a->v.journal_seq > c->journal.flushed_seq_ondisk, trans,
"clearing need_discard but journal_seq %llu > flushed_seq %llu\n"
"%s",
a->v.journal_seq,
@@ -960,7 +964,7 @@ static int bch2_clear_need_discard(struct btree_trans *trans, struct bpos pos,
goto out;
}
- if (bch2_fs_inconsistent_on(a->v.data_type != BCH_DATA_need_discard, c,
+ if (bch2_trans_inconsistent_on(a->v.data_type != BCH_DATA_need_discard, trans,
"bucket incorrectly set in need_discard btree\n"
"%s",
(bch2_bkey_val_to_text(&buf, c, k), buf.buf))) {
@@ -1089,8 +1093,8 @@ static int invalidate_one_bucket(struct btree_trans *trans, struct bch_dev *ca)
if (!k.k || k.k->p.inode != ca->dev_idx)
goto out;
- if (bch2_fs_inconsistent_on(k.k->type != KEY_TYPE_lru, c,
- "non lru key in lru btree"))
+ if (bch2_trans_inconsistent_on(k.k->type != KEY_TYPE_lru, trans,
+ "non lru key in lru btree"))
goto out;
idx = k.k->p.offset;
@@ -1102,7 +1106,7 @@ static int invalidate_one_bucket(struct btree_trans *trans, struct bch_dev *ca)
if (ret)
goto out;
- if (bch2_fs_inconsistent_on(idx != alloc_lru_idx(a->v), c,
+ if (bch2_trans_inconsistent_on(idx != alloc_lru_idx(a->v), trans,
"invalidating bucket with wrong lru idx (got %llu should be %llu",
idx, alloc_lru_idx(a->v)))
goto out;
diff --git a/libbcachefs/lru.c b/libbcachefs/lru.c
index ef4b4a9f..08437d4a 100644
--- a/libbcachefs/lru.c
+++ b/libbcachefs/lru.c
@@ -30,7 +30,7 @@ void bch2_lru_to_text(struct printbuf *out, struct bch_fs *c,
pr_buf(out, "idx %llu", le64_to_cpu(lru->idx));
}
-static int lru_delete(struct btree_trans *trans, u64 id, u64 idx, u64 time)
+int bch2_lru_delete(struct btree_trans *trans, u64 id, u64 idx, u64 time)
{
struct bch_fs *c = trans->c;
struct btree_iter iter;
@@ -73,7 +73,7 @@ err:
return ret;
}
-static int lru_set(struct btree_trans *trans, u64 lru_id, u64 idx, u64 *time)
+int bch2_lru_set(struct btree_trans *trans, u64 lru_id, u64 idx, u64 *time)
{
struct btree_iter iter;
struct bkey_s_c k;
@@ -120,8 +120,8 @@ int bch2_lru_change(struct btree_trans *trans, u64 id, u64 idx,
if (old_time == *new_time)
return 0;
- return lru_delete(trans, id, idx, old_time) ?:
- lru_set(trans, id, idx, new_time);
+ return bch2_lru_delete(trans, id, idx, old_time) ?:
+ bch2_lru_set(trans, id, idx, new_time);
}
static int bch2_check_lru_key(struct btree_trans *trans,
diff --git a/libbcachefs/lru.h b/libbcachefs/lru.h
index e8f50817..0a01836c 100644
--- a/libbcachefs/lru.h
+++ b/libbcachefs/lru.h
@@ -10,6 +10,8 @@ void bch2_lru_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
.val_to_text = bch2_lru_to_text, \
}
+int bch2_lru_delete(struct btree_trans *, u64, u64, u64);
+int bch2_lru_set(struct btree_trans *, u64, u64, u64 *);
int bch2_lru_change(struct btree_trans *, u64, u64, u64, u64 *);
int bch2_check_lrus(struct bch_fs *, bool);