From c598d91dcb0c7e95abdacb2711898ae14ab52ca1 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 10 Apr 2018 19:19:09 -0400 Subject: Update bcachefs sources to edf5f38218 bcachefs: Refactor superblock code --- libbcachefs/disk_groups.h | 99 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 libbcachefs/disk_groups.h (limited to 'libbcachefs/disk_groups.h') diff --git a/libbcachefs/disk_groups.h b/libbcachefs/disk_groups.h new file mode 100644 index 00000000..9da9805a --- /dev/null +++ b/libbcachefs/disk_groups.h @@ -0,0 +1,99 @@ +#ifndef _BCACHEFS_DISK_GROUPS_H +#define _BCACHEFS_DISK_GROUPS_H + +extern const struct bch_sb_field_ops bch_sb_field_ops_disk_groups; + +static inline unsigned disk_groups_nr(struct bch_sb_field_disk_groups *groups) +{ + return groups + ? (vstruct_end(&groups->field) - + (void *) &groups->entries[0]) / sizeof(struct bch_disk_group) + : 0; +} + +struct target { + enum { + TARGET_NULL, + TARGET_DEV, + TARGET_GROUP, + } type; + union { + unsigned dev; + unsigned group; + }; +}; + +#define TARGET_DEV_START 1 +#define TARGET_GROUP_START (256 + TARGET_DEV_START) + +static inline u16 dev_to_target(unsigned dev) +{ + return TARGET_DEV_START + dev; +} + +static inline u16 group_to_target(unsigned group) +{ + return TARGET_GROUP_START + group; +} + +static inline struct target target_decode(unsigned target) +{ + if (target >= TARGET_GROUP_START) + return (struct target) { + .type = TARGET_GROUP, + .group = target - TARGET_GROUP_START + }; + + if (target >= TARGET_DEV_START) + return (struct target) { + .type = TARGET_DEV, + .group = target - TARGET_DEV_START + }; + + return (struct target) { .type = TARGET_NULL }; +} + +static inline bool dev_in_target(struct bch_dev *ca, unsigned target) +{ + struct target t = target_decode(target); + + switch (t.type) { + case TARGET_NULL: + return false; + case TARGET_DEV: + return ca->dev_idx == t.dev; + case TARGET_GROUP: + return ca->mi.group && ca->mi.group - 1 == t.group; + default: + BUG(); + } +} + +static inline bool dev_idx_in_target(struct bch_fs *c, unsigned dev, unsigned target) +{ + bool ret; + + rcu_read_lock(); + ret = dev_in_target(rcu_dereference(c->devs[dev]), target); + rcu_read_unlock(); + + return ret; +} + +const struct bch_devs_mask *bch2_target_to_mask(struct bch_fs *, unsigned); + +int bch2_disk_path_find(struct bch_sb_handle *, const char *); +int bch2_disk_path_find_or_create(struct bch_sb_handle *, const char *); +int bch2_disk_path_print(struct bch_sb_handle *, char *, size_t, unsigned); + +int bch2_opt_target_parse(struct bch_fs *, const char *, u64 *); +int bch2_opt_target_print(struct bch_fs *, char *, size_t, u64); + +int bch2_sb_disk_groups_to_cpu(struct bch_fs *); + +int bch2_dev_group_set(struct bch_fs *, struct bch_dev *, const char *); + +const char *bch2_sb_validate_disk_groups(struct bch_sb *, + struct bch_sb_field *); + +#endif /* _BCACHEFS_DISK_GROUPS_H */ -- cgit v1.2.3