1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _BCACHEFS_LRU_H
3 #define _BCACHEFS_LRU_H
5 static inline u64
lru_pos_id(struct bpos pos
)
7 return pos
.inode
>> LRU_TIME_BITS
;
10 static inline u64
lru_pos_time(struct bpos pos
)
12 return pos
.inode
& ~(~0ULL << LRU_TIME_BITS
);
15 static inline struct bpos
lru_pos(u16 lru_id
, u64 dev_bucket
, u64 time
)
17 struct bpos pos
= POS(((u64
) lru_id
<< LRU_TIME_BITS
)|time
, dev_bucket
);
19 EBUG_ON(time
> LRU_TIME_MAX
);
20 EBUG_ON(lru_pos_id(pos
) != lru_id
);
21 EBUG_ON(lru_pos_time(pos
) != time
);
22 EBUG_ON(pos
.offset
!= dev_bucket
);
27 static inline enum bch_lru_type
lru_type(struct bkey_s_c l
)
29 u16 lru_id
= l
.k
->p
.inode
>> 48;
31 if (lru_id
== BCH_LRU_FRAGMENTATION_START
)
32 return BCH_LRU_fragmentation
;
36 int bch2_lru_validate(struct bch_fs
*, struct bkey_s_c
, enum bch_validate_flags
);
37 void bch2_lru_to_text(struct printbuf
*, struct bch_fs
*, struct bkey_s_c
);
39 void bch2_lru_pos_to_text(struct printbuf
*, struct bpos
);
41 #define bch2_bkey_ops_lru ((struct bkey_ops) { \
42 .key_validate = bch2_lru_validate, \
43 .val_to_text = bch2_lru_to_text, \
47 int bch2_lru_del(struct btree_trans
*, u16
, u64
, u64
);
48 int bch2_lru_set(struct btree_trans
*, u16
, u64
, u64
);
49 int bch2_lru_change(struct btree_trans
*, u16
, u64
, u64
, u64
);
52 int bch2_lru_check_set(struct btree_trans
*, u16
, u64
, struct bkey_s_c
, struct bkey_buf
*);
54 int bch2_check_lrus(struct bch_fs
*);
56 #endif /* _BCACHEFS_LRU_H */