@@ -110,6 +110,7 @@ struct fspec {
110
110
enum field_type {
111
111
TYPE_UNKNOWN ,
112
112
TYPE_U64 ,
113
+ TYPE_U16 ,
113
114
};
114
115
115
116
struct sb_field {
@@ -125,19 +126,37 @@ struct sb_field {
125
126
{ .name = "uuid_tree_generation" , .type = TYPE_U64 },
126
127
};
127
128
128
- #define MOD_FIELD (fname , set , val ) \
129
+ #define MOD_FIELD_XX (fname , set , val , bits , f_dec , f_hex , f_type ) \
129
130
else if (strcmp(name, #fname) == 0) { \
130
131
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); \
134
135
} 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); \
138
139
} \
139
140
}
140
141
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
+
141
160
static void mod_field_by_name (struct btrfs_super_block * sb , int set , const char * name ,
142
161
u64 * val )
143
162
{
0 commit comments