mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-03-31 00:00:03 +03:00
96 lines
1.9 KiB
C
96 lines
1.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _BUCKETS_TYPES_H
|
|
#define _BUCKETS_TYPES_H
|
|
|
|
#include "bcachefs_format.h"
|
|
#include "util.h"
|
|
|
|
#define BUCKET_JOURNAL_SEQ_BITS 16
|
|
|
|
/*
|
|
* Ugly hack alert:
|
|
*
|
|
* We need to cram a spinlock in a single byte, because that's what we have left
|
|
* in struct bucket, and we care about the size of these - during fsck, we need
|
|
* in memory state for every single bucket on every device.
|
|
*
|
|
* We used to do
|
|
* while (xchg(&b->lock, 1) cpu_relax();
|
|
* but, it turns out not all architectures support xchg on a single byte.
|
|
*
|
|
* So now we use bit_spin_lock(), with fun games since we can't burn a whole
|
|
* ulong for this - we just need to make sure the lock bit always ends up in the
|
|
* first byte.
|
|
*/
|
|
|
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
#define BUCKET_LOCK_BITNR 0
|
|
#else
|
|
#define BUCKET_LOCK_BITNR (BITS_PER_LONG - 1)
|
|
#endif
|
|
|
|
union ulong_byte_assert {
|
|
ulong ulong;
|
|
u8 byte;
|
|
};
|
|
|
|
struct bucket {
|
|
u8 lock;
|
|
u8 gen_valid:1;
|
|
u8 data_type:7;
|
|
u8 gen;
|
|
u8 stripe_redundancy;
|
|
u32 stripe;
|
|
u32 dirty_sectors;
|
|
u32 cached_sectors;
|
|
u32 stripe_sectors;
|
|
} __aligned(sizeof(long));
|
|
|
|
struct bucket_gens {
|
|
struct rcu_head rcu;
|
|
u16 first_bucket;
|
|
size_t nbuckets;
|
|
size_t nbuckets_minus_first;
|
|
u8 b[] __counted_by(nbuckets);
|
|
};
|
|
|
|
struct bch_dev_usage {
|
|
struct bch_dev_usage_type {
|
|
u64 buckets;
|
|
u64 sectors; /* _compressed_ sectors: */
|
|
/*
|
|
* XXX
|
|
* Why do we have this? Isn't it just buckets * bucket_size -
|
|
* sectors?
|
|
*/
|
|
u64 fragmented;
|
|
} d[BCH_DATA_NR];
|
|
};
|
|
|
|
struct bch_fs_usage_base {
|
|
u64 hidden;
|
|
u64 btree;
|
|
u64 data;
|
|
u64 cached;
|
|
u64 reserved;
|
|
u64 nr_inodes;
|
|
};
|
|
|
|
struct bch_fs_usage_short {
|
|
u64 capacity;
|
|
u64 used;
|
|
u64 free;
|
|
u64 nr_inodes;
|
|
};
|
|
|
|
/*
|
|
* A reservation for space on disk:
|
|
*/
|
|
struct disk_reservation {
|
|
u64 sectors;
|
|
u32 gen;
|
|
unsigned nr_replicas;
|
|
};
|
|
|
|
#endif /* _BUCKETS_TYPES_H */
|