diff options
author | David Sterba <dsterba@suse.com> | 2018-04-06 18:36:32 +0200 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-04-11 15:37:36 +0200 |
commit | b5e0ca64a44722b61657a0afdc153d48ec2919b9 (patch) | |
tree | 00111a206e609d02486641b945e900321297c7af | |
parent | 23df5de0d07028f31f017a0f80091ba158980742 (diff) | |
download | btrfs-progs-b5e0ca64a44722b61657a0afdc153d48ec2919b9.tar.gz btrfs-progs-b5e0ca64a44722b61657a0afdc153d48ec2919b9.tar.bz2 btrfs-progs-b5e0ca64a44722b61657a0afdc153d48ec2919b9.zip |
btrfs-progs: sb-mod: add preliminary support for non-u64 types
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r-- | btrfs-sb-mod.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/btrfs-sb-mod.c b/btrfs-sb-mod.c index 8f5beadf..017049f8 100644 --- a/btrfs-sb-mod.c +++ b/btrfs-sb-mod.c @@ -110,6 +110,7 @@ struct fspec { enum field_type { TYPE_UNKNOWN, TYPE_U64, + TYPE_U16, }; struct sb_field { @@ -125,19 +126,37 @@ struct sb_field { { .name = "uuid_tree_generation", .type = TYPE_U64 }, }; -#define MOD_FIELD(fname, set, val) \ +#define MOD_FIELD_XX(fname, set, val, bits, f_dec, f_hex, f_type) \ else if (strcmp(name, #fname) == 0) { \ if (set) { \ - printf("SET: %s %llu (0x%llx)\n", #fname, \ - (unsigned long long)*val, (unsigned long long)*val); \ - sb->fname = cpu_to_le64(*val); \ + printf("SET: "#fname" "f_dec" (0x"f_hex")\n", \ + (f_type)*val, (f_type)*val); \ + sb->fname = cpu_to_le##bits(*val); \ } else { \ - *val = le64_to_cpu(sb->fname); \ - printf("GET: %s %llu (0x%llx)\n", #fname, \ - (unsigned long long)*val, (unsigned long long)*val); \ + *val = le##bits##_to_cpu(sb->fname); \ + printf("GET: "#fname" "f_dec" (0x"f_hex")\n", \ + (f_type)*val, (f_type)*val); \ } \ } +#define MOD_FIELD64(fname, set, val) \ + MOD_FIELD_XX(fname, set, val, 64, "%llu", "%llx", unsigned long long) + +/* Alias for u64 */ +#define MOD_FIELD(fname, set, val) MOD_FIELD64(fname, set, val) + +/* + * Support only GET and SET properly, ADD and SUB may work + */ +#define MOD_FIELD32(fname, set, val) \ + MOD_FIELD_XX(fname, set, val, 32, "%u", "%x", unsigned int) + +#define MOD_FIELD16(fname, set, val) \ + MOD_FIELD_XX(fname, set, val, 16, "%hu", "%hx", unsigned short int) + +#define MOD_FIELD8(fname, set, val) \ + MOD_FIELD_XX(fname, set, val, 8, "%hhu", "%hhx", unsigned char) + static void mod_field_by_name(struct btrfs_super_block *sb, int set, const char *name, u64 *val) { |