Skip to content

Commit b5e0ca6

Browse files
committed
btrfs-progs: sb-mod: add preliminary support for non-u64 types
Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 23df5de commit b5e0ca6

File tree

1 file changed

+26
-7
lines changed

1 file changed

+26
-7
lines changed

btrfs-sb-mod.c

+26-7
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ struct fspec {
110110
enum field_type {
111111
TYPE_UNKNOWN,
112112
TYPE_U64,
113+
TYPE_U16,
113114
};
114115

115116
struct sb_field {
@@ -125,19 +126,37 @@ struct sb_field {
125126
{ .name = "uuid_tree_generation", .type = TYPE_U64 },
126127
};
127128

128-
#define MOD_FIELD(fname, set, val) \
129+
#define MOD_FIELD_XX(fname, set, val, bits, f_dec, f_hex, f_type) \
129130
else if (strcmp(name, #fname) == 0) { \
130131
if (set) { \
131-
printf("SET: %s %llu (0x%llx)\n", #fname, \
132-
(unsigned long long)*val, (unsigned long long)*val); \
133-
sb->fname = cpu_to_le64(*val); \
132+
printf("SET: "#fname" "f_dec" (0x"f_hex")\n", \
133+
(f_type)*val, (f_type)*val); \
134+
sb->fname = cpu_to_le##bits(*val); \
134135
} else { \
135-
*val = le64_to_cpu(sb->fname); \
136-
printf("GET: %s %llu (0x%llx)\n", #fname, \
137-
(unsigned long long)*val, (unsigned long long)*val); \
136+
*val = le##bits##_to_cpu(sb->fname); \
137+
printf("GET: "#fname" "f_dec" (0x"f_hex")\n", \
138+
(f_type)*val, (f_type)*val); \
138139
} \
139140
}
140141

142+
#define MOD_FIELD64(fname, set, val) \
143+
MOD_FIELD_XX(fname, set, val, 64, "%llu", "%llx", unsigned long long)
144+
145+
/* Alias for u64 */
146+
#define MOD_FIELD(fname, set, val) MOD_FIELD64(fname, set, val)
147+
148+
/*
149+
* Support only GET and SET properly, ADD and SUB may work
150+
*/
151+
#define MOD_FIELD32(fname, set, val) \
152+
MOD_FIELD_XX(fname, set, val, 32, "%u", "%x", unsigned int)
153+
154+
#define MOD_FIELD16(fname, set, val) \
155+
MOD_FIELD_XX(fname, set, val, 16, "%hu", "%hx", unsigned short int)
156+
157+
#define MOD_FIELD8(fname, set, val) \
158+
MOD_FIELD_XX(fname, set, val, 8, "%hhu", "%hhx", unsigned char)
159+
141160
static void mod_field_by_name(struct btrfs_super_block *sb, int set, const char *name,
142161
u64 *val)
143162
{

0 commit comments

Comments
 (0)