mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
8ed823b192
we allow new fields to be added to existing key types, and new versions should treat them as being zeroed; this was not handled in alloc_v4_validate. Reported-by: syzbot+3b2968fa4953885dd66a@syzkaller.appspotmail.com Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
96 lines
2.3 KiB
C
96 lines
2.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _BCACHEFS_ALLOC_BACKGROUND_FORMAT_H
|
|
#define _BCACHEFS_ALLOC_BACKGROUND_FORMAT_H
|
|
|
|
struct bch_alloc {
|
|
struct bch_val v;
|
|
__u8 fields;
|
|
__u8 gen;
|
|
__u8 data[];
|
|
} __packed __aligned(8);
|
|
|
|
#define BCH_ALLOC_FIELDS_V1() \
|
|
x(read_time, 16) \
|
|
x(write_time, 16) \
|
|
x(data_type, 8) \
|
|
x(dirty_sectors, 16) \
|
|
x(cached_sectors, 16) \
|
|
x(oldest_gen, 8) \
|
|
x(stripe, 32) \
|
|
x(stripe_redundancy, 8)
|
|
|
|
enum {
|
|
#define x(name, _bits) BCH_ALLOC_FIELD_V1_##name,
|
|
BCH_ALLOC_FIELDS_V1()
|
|
#undef x
|
|
};
|
|
|
|
struct bch_alloc_v2 {
|
|
struct bch_val v;
|
|
__u8 nr_fields;
|
|
__u8 gen;
|
|
__u8 oldest_gen;
|
|
__u8 data_type;
|
|
__u8 data[];
|
|
} __packed __aligned(8);
|
|
|
|
#define BCH_ALLOC_FIELDS_V2() \
|
|
x(read_time, 64) \
|
|
x(write_time, 64) \
|
|
x(dirty_sectors, 32) \
|
|
x(cached_sectors, 32) \
|
|
x(stripe, 32) \
|
|
x(stripe_redundancy, 8)
|
|
|
|
struct bch_alloc_v3 {
|
|
struct bch_val v;
|
|
__le64 journal_seq;
|
|
__le32 flags;
|
|
__u8 nr_fields;
|
|
__u8 gen;
|
|
__u8 oldest_gen;
|
|
__u8 data_type;
|
|
__u8 data[];
|
|
} __packed __aligned(8);
|
|
|
|
LE32_BITMASK(BCH_ALLOC_V3_NEED_DISCARD,struct bch_alloc_v3, flags, 0, 1)
|
|
LE32_BITMASK(BCH_ALLOC_V3_NEED_INC_GEN,struct bch_alloc_v3, flags, 1, 2)
|
|
|
|
struct bch_alloc_v4 {
|
|
struct bch_val v;
|
|
__u64 journal_seq;
|
|
__u32 flags;
|
|
__u8 gen;
|
|
__u8 oldest_gen;
|
|
__u8 data_type;
|
|
__u8 stripe_redundancy;
|
|
__u32 dirty_sectors;
|
|
__u32 cached_sectors;
|
|
__u64 io_time[2];
|
|
__u32 stripe;
|
|
__u32 nr_external_backpointers;
|
|
/* end of fields in original version of alloc_v4 */
|
|
__u64 fragmentation_lru;
|
|
__u32 stripe_sectors;
|
|
__u32 pad;
|
|
} __packed __aligned(8);
|
|
|
|
#define BCH_ALLOC_V4_U64s_V0 6
|
|
#define BCH_ALLOC_V4_U64s (sizeof(struct bch_alloc_v4) / sizeof(__u64))
|
|
|
|
BITMASK(BCH_ALLOC_V4_NEED_DISCARD, struct bch_alloc_v4, flags, 0, 1)
|
|
BITMASK(BCH_ALLOC_V4_NEED_INC_GEN, struct bch_alloc_v4, flags, 1, 2)
|
|
BITMASK(BCH_ALLOC_V4_BACKPOINTERS_START,struct bch_alloc_v4, flags, 2, 8)
|
|
BITMASK(BCH_ALLOC_V4_NR_BACKPOINTERS, struct bch_alloc_v4, flags, 8, 14)
|
|
|
|
#define KEY_TYPE_BUCKET_GENS_BITS 8
|
|
#define KEY_TYPE_BUCKET_GENS_NR (1U << KEY_TYPE_BUCKET_GENS_BITS)
|
|
#define KEY_TYPE_BUCKET_GENS_MASK (KEY_TYPE_BUCKET_GENS_NR - 1)
|
|
|
|
struct bch_bucket_gens {
|
|
struct bch_val v;
|
|
u8 gens[KEY_TYPE_BUCKET_GENS_NR];
|
|
} __packed __aligned(8);
|
|
|
|
#endif /* _BCACHEFS_ALLOC_BACKGROUND_FORMAT_H */
|