GNU Linux-libre 5.4.257-gnu1
[releases.git] / fs / btrfs / tree-checker.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) Qu Wenruo 2017.  All rights reserved.
4  */
5
6 /*
7  * The module is used to catch unexpected/corrupted tree block data.
8  * Such behavior can be caused either by a fuzzed image or bugs.
9  *
10  * The objective is to do leaf/node validation checks when tree block is read
11  * from disk, and check *every* possible member, so other code won't
12  * need to checking them again.
13  *
14  * Due to the potential and unwanted damage, every checker needs to be
15  * carefully reviewed otherwise so it does not prevent mount of valid images.
16  */
17
18 #include <linux/types.h>
19 #include <linux/stddef.h>
20 #include <linux/error-injection.h>
21 #include "ctree.h"
22 #include "tree-checker.h"
23 #include "disk-io.h"
24 #include "compression.h"
25 #include "volumes.h"
26
27 /*
28  * Error message should follow the following format:
29  * corrupt <type>: <identifier>, <reason>[, <bad_value>]
30  *
31  * @type:       leaf or node
32  * @identifier: the necessary info to locate the leaf/node.
33  *              It's recommended to decode key.objecitd/offset if it's
34  *              meaningful.
35  * @reason:     describe the error
36  * @bad_value:  optional, it's recommended to output bad value and its
37  *              expected value (range).
38  *
39  * Since comma is used to separate the components, only space is allowed
40  * inside each component.
41  */
42
43 /*
44  * Append generic "corrupt leaf/node root=%llu block=%llu slot=%d: " to @fmt.
45  * Allows callers to customize the output.
46  */
47 __printf(3, 4)
48 __cold
49 static void generic_err(const struct extent_buffer *eb, int slot,
50                         const char *fmt, ...)
51 {
52         const struct btrfs_fs_info *fs_info = eb->fs_info;
53         struct va_format vaf;
54         va_list args;
55
56         va_start(args, fmt);
57
58         vaf.fmt = fmt;
59         vaf.va = &args;
60
61         btrfs_crit(fs_info,
62                 "corrupt %s: root=%llu block=%llu slot=%d, %pV",
63                 btrfs_header_level(eb) == 0 ? "leaf" : "node",
64                 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, &vaf);
65         va_end(args);
66 }
67
68 /*
69  * Customized reporter for extent data item, since its key objectid and
70  * offset has its own meaning.
71  */
72 __printf(3, 4)
73 __cold
74 static void file_extent_err(const struct extent_buffer *eb, int slot,
75                             const char *fmt, ...)
76 {
77         const struct btrfs_fs_info *fs_info = eb->fs_info;
78         struct btrfs_key key;
79         struct va_format vaf;
80         va_list args;
81
82         btrfs_item_key_to_cpu(eb, &key, slot);
83         va_start(args, fmt);
84
85         vaf.fmt = fmt;
86         vaf.va = &args;
87
88         btrfs_crit(fs_info,
89         "corrupt %s: root=%llu block=%llu slot=%d ino=%llu file_offset=%llu, %pV",
90                 btrfs_header_level(eb) == 0 ? "leaf" : "node",
91                 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot,
92                 key.objectid, key.offset, &vaf);
93         va_end(args);
94 }
95
96 /*
97  * Return 0 if the btrfs_file_extent_##name is aligned to @alignment
98  * Else return 1
99  */
100 #define CHECK_FE_ALIGNED(leaf, slot, fi, name, alignment)                     \
101 ({                                                                            \
102         if (!IS_ALIGNED(btrfs_file_extent_##name((leaf), (fi)), (alignment))) \
103                 file_extent_err((leaf), (slot),                               \
104         "invalid %s for file extent, have %llu, should be aligned to %u",     \
105                         (#name), btrfs_file_extent_##name((leaf), (fi)),      \
106                         (alignment));                                         \
107         (!IS_ALIGNED(btrfs_file_extent_##name((leaf), (fi)), (alignment)));   \
108 })
109
110 static u64 file_extent_end(struct extent_buffer *leaf,
111                            struct btrfs_key *key,
112                            struct btrfs_file_extent_item *extent)
113 {
114         u64 end;
115         u64 len;
116
117         if (btrfs_file_extent_type(leaf, extent) == BTRFS_FILE_EXTENT_INLINE) {
118                 len = btrfs_file_extent_ram_bytes(leaf, extent);
119                 end = ALIGN(key->offset + len, leaf->fs_info->sectorsize);
120         } else {
121                 len = btrfs_file_extent_num_bytes(leaf, extent);
122                 end = key->offset + len;
123         }
124         return end;
125 }
126
127 static int check_extent_data_item(struct extent_buffer *leaf,
128                                   struct btrfs_key *key, int slot,
129                                   struct btrfs_key *prev_key)
130 {
131         struct btrfs_fs_info *fs_info = leaf->fs_info;
132         struct btrfs_file_extent_item *fi;
133         u32 sectorsize = fs_info->sectorsize;
134         u32 item_size = btrfs_item_size_nr(leaf, slot);
135         u64 extent_end;
136
137         if (!IS_ALIGNED(key->offset, sectorsize)) {
138                 file_extent_err(leaf, slot,
139 "unaligned file_offset for file extent, have %llu should be aligned to %u",
140                         key->offset, sectorsize);
141                 return -EUCLEAN;
142         }
143
144         fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
145
146         if (btrfs_file_extent_type(leaf, fi) > BTRFS_FILE_EXTENT_TYPES) {
147                 file_extent_err(leaf, slot,
148                 "invalid type for file extent, have %u expect range [0, %u]",
149                         btrfs_file_extent_type(leaf, fi),
150                         BTRFS_FILE_EXTENT_TYPES);
151                 return -EUCLEAN;
152         }
153
154         /*
155          * Support for new compression/encryption must introduce incompat flag,
156          * and must be caught in open_ctree().
157          */
158         if (btrfs_file_extent_compression(leaf, fi) > BTRFS_COMPRESS_TYPES) {
159                 file_extent_err(leaf, slot,
160         "invalid compression for file extent, have %u expect range [0, %u]",
161                         btrfs_file_extent_compression(leaf, fi),
162                         BTRFS_COMPRESS_TYPES);
163                 return -EUCLEAN;
164         }
165         if (btrfs_file_extent_encryption(leaf, fi)) {
166                 file_extent_err(leaf, slot,
167                         "invalid encryption for file extent, have %u expect 0",
168                         btrfs_file_extent_encryption(leaf, fi));
169                 return -EUCLEAN;
170         }
171         if (btrfs_file_extent_type(leaf, fi) == BTRFS_FILE_EXTENT_INLINE) {
172                 /* Inline extent must have 0 as key offset */
173                 if (key->offset) {
174                         file_extent_err(leaf, slot,
175                 "invalid file_offset for inline file extent, have %llu expect 0",
176                                 key->offset);
177                         return -EUCLEAN;
178                 }
179
180                 /* Compressed inline extent has no on-disk size, skip it */
181                 if (btrfs_file_extent_compression(leaf, fi) !=
182                     BTRFS_COMPRESS_NONE)
183                         return 0;
184
185                 /* Uncompressed inline extent size must match item size */
186                 if (item_size != BTRFS_FILE_EXTENT_INLINE_DATA_START +
187                     btrfs_file_extent_ram_bytes(leaf, fi)) {
188                         file_extent_err(leaf, slot,
189         "invalid ram_bytes for uncompressed inline extent, have %u expect %llu",
190                                 item_size, BTRFS_FILE_EXTENT_INLINE_DATA_START +
191                                 btrfs_file_extent_ram_bytes(leaf, fi));
192                         return -EUCLEAN;
193                 }
194                 return 0;
195         }
196
197         /* Regular or preallocated extent has fixed item size */
198         if (item_size != sizeof(*fi)) {
199                 file_extent_err(leaf, slot,
200         "invalid item size for reg/prealloc file extent, have %u expect %zu",
201                         item_size, sizeof(*fi));
202                 return -EUCLEAN;
203         }
204         if (CHECK_FE_ALIGNED(leaf, slot, fi, ram_bytes, sectorsize) ||
205             CHECK_FE_ALIGNED(leaf, slot, fi, disk_bytenr, sectorsize) ||
206             CHECK_FE_ALIGNED(leaf, slot, fi, disk_num_bytes, sectorsize) ||
207             CHECK_FE_ALIGNED(leaf, slot, fi, offset, sectorsize) ||
208             CHECK_FE_ALIGNED(leaf, slot, fi, num_bytes, sectorsize))
209                 return -EUCLEAN;
210
211         /* Catch extent end overflow */
212         if (check_add_overflow(btrfs_file_extent_num_bytes(leaf, fi),
213                                key->offset, &extent_end)) {
214                 file_extent_err(leaf, slot,
215         "extent end overflow, have file offset %llu extent num bytes %llu",
216                                 key->offset,
217                                 btrfs_file_extent_num_bytes(leaf, fi));
218                 return -EUCLEAN;
219         }
220
221         /*
222          * Check that no two consecutive file extent items, in the same leaf,
223          * present ranges that overlap each other.
224          */
225         if (slot > 0 &&
226             prev_key->objectid == key->objectid &&
227             prev_key->type == BTRFS_EXTENT_DATA_KEY) {
228                 struct btrfs_file_extent_item *prev_fi;
229                 u64 prev_end;
230
231                 prev_fi = btrfs_item_ptr(leaf, slot - 1,
232                                          struct btrfs_file_extent_item);
233                 prev_end = file_extent_end(leaf, prev_key, prev_fi);
234                 if (prev_end > key->offset) {
235                         file_extent_err(leaf, slot - 1,
236 "file extent end range (%llu) goes beyond start offset (%llu) of the next file extent",
237                                         prev_end, key->offset);
238                         return -EUCLEAN;
239                 }
240         }
241
242         return 0;
243 }
244
245 static int check_csum_item(struct extent_buffer *leaf, struct btrfs_key *key,
246                            int slot, struct btrfs_key *prev_key)
247 {
248         struct btrfs_fs_info *fs_info = leaf->fs_info;
249         u32 sectorsize = fs_info->sectorsize;
250         u32 csumsize = btrfs_super_csum_size(fs_info->super_copy);
251
252         if (key->objectid != BTRFS_EXTENT_CSUM_OBJECTID) {
253                 generic_err(leaf, slot,
254                 "invalid key objectid for csum item, have %llu expect %llu",
255                         key->objectid, BTRFS_EXTENT_CSUM_OBJECTID);
256                 return -EUCLEAN;
257         }
258         if (!IS_ALIGNED(key->offset, sectorsize)) {
259                 generic_err(leaf, slot,
260         "unaligned key offset for csum item, have %llu should be aligned to %u",
261                         key->offset, sectorsize);
262                 return -EUCLEAN;
263         }
264         if (!IS_ALIGNED(btrfs_item_size_nr(leaf, slot), csumsize)) {
265                 generic_err(leaf, slot,
266         "unaligned item size for csum item, have %u should be aligned to %u",
267                         btrfs_item_size_nr(leaf, slot), csumsize);
268                 return -EUCLEAN;
269         }
270         if (slot > 0 && prev_key->type == BTRFS_EXTENT_CSUM_KEY) {
271                 u64 prev_csum_end;
272                 u32 prev_item_size;
273
274                 prev_item_size = btrfs_item_size_nr(leaf, slot - 1);
275                 prev_csum_end = (prev_item_size / csumsize) * sectorsize;
276                 prev_csum_end += prev_key->offset;
277                 if (prev_csum_end > key->offset) {
278                         generic_err(leaf, slot - 1,
279 "csum end range (%llu) goes beyond the start range (%llu) of the next csum item",
280                                     prev_csum_end, key->offset);
281                         return -EUCLEAN;
282                 }
283         }
284         return 0;
285 }
286
287 /*
288  * Customized reported for dir_item, only important new info is key->objectid,
289  * which represents inode number
290  */
291 __printf(3, 4)
292 __cold
293 static void dir_item_err(const struct extent_buffer *eb, int slot,
294                          const char *fmt, ...)
295 {
296         const struct btrfs_fs_info *fs_info = eb->fs_info;
297         struct btrfs_key key;
298         struct va_format vaf;
299         va_list args;
300
301         btrfs_item_key_to_cpu(eb, &key, slot);
302         va_start(args, fmt);
303
304         vaf.fmt = fmt;
305         vaf.va = &args;
306
307         btrfs_crit(fs_info,
308         "corrupt %s: root=%llu block=%llu slot=%d ino=%llu, %pV",
309                 btrfs_header_level(eb) == 0 ? "leaf" : "node",
310                 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot,
311                 key.objectid, &vaf);
312         va_end(args);
313 }
314
315 static int check_dir_item(struct extent_buffer *leaf,
316                           struct btrfs_key *key, int slot)
317 {
318         struct btrfs_fs_info *fs_info = leaf->fs_info;
319         struct btrfs_dir_item *di;
320         u32 item_size = btrfs_item_size_nr(leaf, slot);
321         u32 cur = 0;
322
323         di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item);
324         while (cur < item_size) {
325                 u32 name_len;
326                 u32 data_len;
327                 u32 max_name_len;
328                 u32 total_size;
329                 u32 name_hash;
330                 u8 dir_type;
331
332                 /* header itself should not cross item boundary */
333                 if (cur + sizeof(*di) > item_size) {
334                         dir_item_err(leaf, slot,
335                 "dir item header crosses item boundary, have %zu boundary %u",
336                                 cur + sizeof(*di), item_size);
337                         return -EUCLEAN;
338                 }
339
340                 /* dir type check */
341                 dir_type = btrfs_dir_type(leaf, di);
342                 if (dir_type >= BTRFS_FT_MAX) {
343                         dir_item_err(leaf, slot,
344                         "invalid dir item type, have %u expect [0, %u)",
345                                 dir_type, BTRFS_FT_MAX);
346                         return -EUCLEAN;
347                 }
348
349                 if (key->type == BTRFS_XATTR_ITEM_KEY &&
350                     dir_type != BTRFS_FT_XATTR) {
351                         dir_item_err(leaf, slot,
352                 "invalid dir item type for XATTR key, have %u expect %u",
353                                 dir_type, BTRFS_FT_XATTR);
354                         return -EUCLEAN;
355                 }
356                 if (dir_type == BTRFS_FT_XATTR &&
357                     key->type != BTRFS_XATTR_ITEM_KEY) {
358                         dir_item_err(leaf, slot,
359                         "xattr dir type found for non-XATTR key");
360                         return -EUCLEAN;
361                 }
362                 if (dir_type == BTRFS_FT_XATTR)
363                         max_name_len = XATTR_NAME_MAX;
364                 else
365                         max_name_len = BTRFS_NAME_LEN;
366
367                 /* Name/data length check */
368                 name_len = btrfs_dir_name_len(leaf, di);
369                 data_len = btrfs_dir_data_len(leaf, di);
370                 if (name_len > max_name_len) {
371                         dir_item_err(leaf, slot,
372                         "dir item name len too long, have %u max %u",
373                                 name_len, max_name_len);
374                         return -EUCLEAN;
375                 }
376                 if (name_len + data_len > BTRFS_MAX_XATTR_SIZE(fs_info)) {
377                         dir_item_err(leaf, slot,
378                         "dir item name and data len too long, have %u max %u",
379                                 name_len + data_len,
380                                 BTRFS_MAX_XATTR_SIZE(fs_info));
381                         return -EUCLEAN;
382                 }
383
384                 if (data_len && dir_type != BTRFS_FT_XATTR) {
385                         dir_item_err(leaf, slot,
386                         "dir item with invalid data len, have %u expect 0",
387                                 data_len);
388                         return -EUCLEAN;
389                 }
390
391                 total_size = sizeof(*di) + name_len + data_len;
392
393                 /* header and name/data should not cross item boundary */
394                 if (cur + total_size > item_size) {
395                         dir_item_err(leaf, slot,
396                 "dir item data crosses item boundary, have %u boundary %u",
397                                 cur + total_size, item_size);
398                         return -EUCLEAN;
399                 }
400
401                 /*
402                  * Special check for XATTR/DIR_ITEM, as key->offset is name
403                  * hash, should match its name
404                  */
405                 if (key->type == BTRFS_DIR_ITEM_KEY ||
406                     key->type == BTRFS_XATTR_ITEM_KEY) {
407                         char namebuf[max(BTRFS_NAME_LEN, XATTR_NAME_MAX)];
408
409                         read_extent_buffer(leaf, namebuf,
410                                         (unsigned long)(di + 1), name_len);
411                         name_hash = btrfs_name_hash(namebuf, name_len);
412                         if (key->offset != name_hash) {
413                                 dir_item_err(leaf, slot,
414                 "name hash mismatch with key, have 0x%016x expect 0x%016llx",
415                                         name_hash, key->offset);
416                                 return -EUCLEAN;
417                         }
418                 }
419                 cur += total_size;
420                 di = (struct btrfs_dir_item *)((void *)di + total_size);
421         }
422         return 0;
423 }
424
425 __printf(3, 4)
426 __cold
427 static void block_group_err(const struct extent_buffer *eb, int slot,
428                             const char *fmt, ...)
429 {
430         const struct btrfs_fs_info *fs_info = eb->fs_info;
431         struct btrfs_key key;
432         struct va_format vaf;
433         va_list args;
434
435         btrfs_item_key_to_cpu(eb, &key, slot);
436         va_start(args, fmt);
437
438         vaf.fmt = fmt;
439         vaf.va = &args;
440
441         btrfs_crit(fs_info,
442         "corrupt %s: root=%llu block=%llu slot=%d bg_start=%llu bg_len=%llu, %pV",
443                 btrfs_header_level(eb) == 0 ? "leaf" : "node",
444                 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot,
445                 key.objectid, key.offset, &vaf);
446         va_end(args);
447 }
448
449 static int check_block_group_item(struct extent_buffer *leaf,
450                                   struct btrfs_key *key, int slot)
451 {
452         struct btrfs_block_group_item bgi;
453         u32 item_size = btrfs_item_size_nr(leaf, slot);
454         u64 flags;
455         u64 type;
456
457         /*
458          * Here we don't really care about alignment since extent allocator can
459          * handle it.  We care more about the size.
460          */
461         if (key->offset == 0) {
462                 block_group_err(leaf, slot,
463                                 "invalid block group size 0");
464                 return -EUCLEAN;
465         }
466
467         if (item_size != sizeof(bgi)) {
468                 block_group_err(leaf, slot,
469                         "invalid item size, have %u expect %zu",
470                                 item_size, sizeof(bgi));
471                 return -EUCLEAN;
472         }
473
474         read_extent_buffer(leaf, &bgi, btrfs_item_ptr_offset(leaf, slot),
475                            sizeof(bgi));
476         if (btrfs_block_group_chunk_objectid(&bgi) !=
477             BTRFS_FIRST_CHUNK_TREE_OBJECTID) {
478                 block_group_err(leaf, slot,
479                 "invalid block group chunk objectid, have %llu expect %llu",
480                                 btrfs_block_group_chunk_objectid(&bgi),
481                                 BTRFS_FIRST_CHUNK_TREE_OBJECTID);
482                 return -EUCLEAN;
483         }
484
485         if (btrfs_block_group_used(&bgi) > key->offset) {
486                 block_group_err(leaf, slot,
487                         "invalid block group used, have %llu expect [0, %llu)",
488                                 btrfs_block_group_used(&bgi), key->offset);
489                 return -EUCLEAN;
490         }
491
492         flags = btrfs_block_group_flags(&bgi);
493         if (hweight64(flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) > 1) {
494                 block_group_err(leaf, slot,
495 "invalid profile flags, have 0x%llx (%lu bits set) expect no more than 1 bit set",
496                         flags & BTRFS_BLOCK_GROUP_PROFILE_MASK,
497                         hweight64(flags & BTRFS_BLOCK_GROUP_PROFILE_MASK));
498                 return -EUCLEAN;
499         }
500
501         type = flags & BTRFS_BLOCK_GROUP_TYPE_MASK;
502         if (type != BTRFS_BLOCK_GROUP_DATA &&
503             type != BTRFS_BLOCK_GROUP_METADATA &&
504             type != BTRFS_BLOCK_GROUP_SYSTEM &&
505             type != (BTRFS_BLOCK_GROUP_METADATA |
506                            BTRFS_BLOCK_GROUP_DATA)) {
507                 block_group_err(leaf, slot,
508 "invalid type, have 0x%llx (%lu bits set) expect either 0x%llx, 0x%llx, 0x%llx or 0x%llx",
509                         type, hweight64(type),
510                         BTRFS_BLOCK_GROUP_DATA, BTRFS_BLOCK_GROUP_METADATA,
511                         BTRFS_BLOCK_GROUP_SYSTEM,
512                         BTRFS_BLOCK_GROUP_METADATA | BTRFS_BLOCK_GROUP_DATA);
513                 return -EUCLEAN;
514         }
515         return 0;
516 }
517
518 __printf(4, 5)
519 __cold
520 static void chunk_err(const struct extent_buffer *leaf,
521                       const struct btrfs_chunk *chunk, u64 logical,
522                       const char *fmt, ...)
523 {
524         const struct btrfs_fs_info *fs_info = leaf->fs_info;
525         bool is_sb;
526         struct va_format vaf;
527         va_list args;
528         int i;
529         int slot = -1;
530
531         /* Only superblock eb is able to have such small offset */
532         is_sb = (leaf->start == BTRFS_SUPER_INFO_OFFSET);
533
534         if (!is_sb) {
535                 /*
536                  * Get the slot number by iterating through all slots, this
537                  * would provide better readability.
538                  */
539                 for (i = 0; i < btrfs_header_nritems(leaf); i++) {
540                         if (btrfs_item_ptr_offset(leaf, i) ==
541                                         (unsigned long)chunk) {
542                                 slot = i;
543                                 break;
544                         }
545                 }
546         }
547         va_start(args, fmt);
548         vaf.fmt = fmt;
549         vaf.va = &args;
550
551         if (is_sb)
552                 btrfs_crit(fs_info,
553                 "corrupt superblock syschunk array: chunk_start=%llu, %pV",
554                            logical, &vaf);
555         else
556                 btrfs_crit(fs_info,
557         "corrupt leaf: root=%llu block=%llu slot=%d chunk_start=%llu, %pV",
558                            BTRFS_CHUNK_TREE_OBJECTID, leaf->start, slot,
559                            logical, &vaf);
560         va_end(args);
561 }
562
563 /*
564  * The common chunk check which could also work on super block sys chunk array.
565  *
566  * Return -EUCLEAN if anything is corrupted.
567  * Return 0 if everything is OK.
568  */
569 int btrfs_check_chunk_valid(struct extent_buffer *leaf,
570                             struct btrfs_chunk *chunk, u64 logical)
571 {
572         struct btrfs_fs_info *fs_info = leaf->fs_info;
573         u64 length;
574         u64 chunk_end;
575         u64 stripe_len;
576         u16 num_stripes;
577         u16 sub_stripes;
578         u64 type;
579         u64 features;
580         bool mixed = false;
581         int raid_index;
582         int nparity;
583         int ncopies;
584
585         length = btrfs_chunk_length(leaf, chunk);
586         stripe_len = btrfs_chunk_stripe_len(leaf, chunk);
587         num_stripes = btrfs_chunk_num_stripes(leaf, chunk);
588         sub_stripes = btrfs_chunk_sub_stripes(leaf, chunk);
589         type = btrfs_chunk_type(leaf, chunk);
590         raid_index = btrfs_bg_flags_to_raid_index(type);
591         ncopies = btrfs_raid_array[raid_index].ncopies;
592         nparity = btrfs_raid_array[raid_index].nparity;
593
594         if (!num_stripes) {
595                 chunk_err(leaf, chunk, logical,
596                           "invalid chunk num_stripes, have %u", num_stripes);
597                 return -EUCLEAN;
598         }
599         if (num_stripes < ncopies) {
600                 chunk_err(leaf, chunk, logical,
601                           "invalid chunk num_stripes < ncopies, have %u < %d",
602                           num_stripes, ncopies);
603                 return -EUCLEAN;
604         }
605         if (nparity && num_stripes == nparity) {
606                 chunk_err(leaf, chunk, logical,
607                           "invalid chunk num_stripes == nparity, have %u == %d",
608                           num_stripes, nparity);
609                 return -EUCLEAN;
610         }
611         if (!IS_ALIGNED(logical, fs_info->sectorsize)) {
612                 chunk_err(leaf, chunk, logical,
613                 "invalid chunk logical, have %llu should aligned to %u",
614                           logical, fs_info->sectorsize);
615                 return -EUCLEAN;
616         }
617         if (btrfs_chunk_sector_size(leaf, chunk) != fs_info->sectorsize) {
618                 chunk_err(leaf, chunk, logical,
619                           "invalid chunk sectorsize, have %u expect %u",
620                           btrfs_chunk_sector_size(leaf, chunk),
621                           fs_info->sectorsize);
622                 return -EUCLEAN;
623         }
624         if (!length || !IS_ALIGNED(length, fs_info->sectorsize)) {
625                 chunk_err(leaf, chunk, logical,
626                           "invalid chunk length, have %llu", length);
627                 return -EUCLEAN;
628         }
629         if (unlikely(check_add_overflow(logical, length, &chunk_end))) {
630                 chunk_err(leaf, chunk, logical,
631 "invalid chunk logical start and length, have logical start %llu length %llu",
632                           logical, length);
633                 return -EUCLEAN;
634         }
635         if (!is_power_of_2(stripe_len) || stripe_len != BTRFS_STRIPE_LEN) {
636                 chunk_err(leaf, chunk, logical,
637                           "invalid chunk stripe length: %llu",
638                           stripe_len);
639                 return -EUCLEAN;
640         }
641         if (~(BTRFS_BLOCK_GROUP_TYPE_MASK | BTRFS_BLOCK_GROUP_PROFILE_MASK) &
642             type) {
643                 chunk_err(leaf, chunk, logical,
644                           "unrecognized chunk type: 0x%llx",
645                           ~(BTRFS_BLOCK_GROUP_TYPE_MASK |
646                             BTRFS_BLOCK_GROUP_PROFILE_MASK) &
647                           btrfs_chunk_type(leaf, chunk));
648                 return -EUCLEAN;
649         }
650
651         if (!is_power_of_2(type & BTRFS_BLOCK_GROUP_PROFILE_MASK) &&
652             (type & BTRFS_BLOCK_GROUP_PROFILE_MASK) != 0) {
653                 chunk_err(leaf, chunk, logical,
654                 "invalid chunk profile flag: 0x%llx, expect 0 or 1 bit set",
655                           type & BTRFS_BLOCK_GROUP_PROFILE_MASK);
656                 return -EUCLEAN;
657         }
658         if ((type & BTRFS_BLOCK_GROUP_TYPE_MASK) == 0) {
659                 chunk_err(leaf, chunk, logical,
660         "missing chunk type flag, have 0x%llx one bit must be set in 0x%llx",
661                           type, BTRFS_BLOCK_GROUP_TYPE_MASK);
662                 return -EUCLEAN;
663         }
664
665         if ((type & BTRFS_BLOCK_GROUP_SYSTEM) &&
666             (type & (BTRFS_BLOCK_GROUP_METADATA | BTRFS_BLOCK_GROUP_DATA))) {
667                 chunk_err(leaf, chunk, logical,
668                           "system chunk with data or metadata type: 0x%llx",
669                           type);
670                 return -EUCLEAN;
671         }
672
673         features = btrfs_super_incompat_flags(fs_info->super_copy);
674         if (features & BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS)
675                 mixed = true;
676
677         if (!mixed) {
678                 if ((type & BTRFS_BLOCK_GROUP_METADATA) &&
679                     (type & BTRFS_BLOCK_GROUP_DATA)) {
680                         chunk_err(leaf, chunk, logical,
681                         "mixed chunk type in non-mixed mode: 0x%llx", type);
682                         return -EUCLEAN;
683                 }
684         }
685
686         if ((type & BTRFS_BLOCK_GROUP_RAID10 && sub_stripes != 2) ||
687             (type & BTRFS_BLOCK_GROUP_RAID1 && num_stripes != 2) ||
688             (type & BTRFS_BLOCK_GROUP_RAID5 && num_stripes < 2) ||
689             (type & BTRFS_BLOCK_GROUP_RAID6 && num_stripes < 3) ||
690             (type & BTRFS_BLOCK_GROUP_DUP && num_stripes != 2) ||
691             ((type & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0 && num_stripes != 1)) {
692                 chunk_err(leaf, chunk, logical,
693                         "invalid num_stripes:sub_stripes %u:%u for profile %llu",
694                         num_stripes, sub_stripes,
695                         type & BTRFS_BLOCK_GROUP_PROFILE_MASK);
696                 return -EUCLEAN;
697         }
698
699         return 0;
700 }
701
702 /*
703  * Enhanced version of chunk item checker.
704  *
705  * The common btrfs_check_chunk_valid() doesn't check item size since it needs
706  * to work on super block sys_chunk_array which doesn't have full item ptr.
707  */
708 static int check_leaf_chunk_item(struct extent_buffer *leaf,
709                                  struct btrfs_chunk *chunk,
710                                  struct btrfs_key *key, int slot)
711 {
712         int num_stripes;
713
714         if (btrfs_item_size_nr(leaf, slot) < sizeof(struct btrfs_chunk)) {
715                 chunk_err(leaf, chunk, key->offset,
716                         "invalid chunk item size: have %u expect [%zu, %u)",
717                         btrfs_item_size_nr(leaf, slot),
718                         sizeof(struct btrfs_chunk),
719                         BTRFS_LEAF_DATA_SIZE(leaf->fs_info));
720                 return -EUCLEAN;
721         }
722
723         num_stripes = btrfs_chunk_num_stripes(leaf, chunk);
724         /* Let btrfs_check_chunk_valid() handle this error type */
725         if (num_stripes == 0)
726                 goto out;
727
728         if (btrfs_chunk_item_size(num_stripes) !=
729             btrfs_item_size_nr(leaf, slot)) {
730                 chunk_err(leaf, chunk, key->offset,
731                         "invalid chunk item size: have %u expect %lu",
732                         btrfs_item_size_nr(leaf, slot),
733                         btrfs_chunk_item_size(num_stripes));
734                 return -EUCLEAN;
735         }
736 out:
737         return btrfs_check_chunk_valid(leaf, chunk, key->offset);
738 }
739
740 __printf(3, 4)
741 __cold
742 static void dev_item_err(const struct extent_buffer *eb, int slot,
743                          const char *fmt, ...)
744 {
745         struct btrfs_key key;
746         struct va_format vaf;
747         va_list args;
748
749         btrfs_item_key_to_cpu(eb, &key, slot);
750         va_start(args, fmt);
751
752         vaf.fmt = fmt;
753         vaf.va = &args;
754
755         btrfs_crit(eb->fs_info,
756         "corrupt %s: root=%llu block=%llu slot=%d devid=%llu %pV",
757                 btrfs_header_level(eb) == 0 ? "leaf" : "node",
758                 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot,
759                 key.objectid, &vaf);
760         va_end(args);
761 }
762
763 static int check_dev_item(struct extent_buffer *leaf,
764                           struct btrfs_key *key, int slot)
765 {
766         struct btrfs_dev_item *ditem;
767
768         if (key->objectid != BTRFS_DEV_ITEMS_OBJECTID) {
769                 dev_item_err(leaf, slot,
770                              "invalid objectid: has=%llu expect=%llu",
771                              key->objectid, BTRFS_DEV_ITEMS_OBJECTID);
772                 return -EUCLEAN;
773         }
774         ditem = btrfs_item_ptr(leaf, slot, struct btrfs_dev_item);
775         if (btrfs_device_id(leaf, ditem) != key->offset) {
776                 dev_item_err(leaf, slot,
777                              "devid mismatch: key has=%llu item has=%llu",
778                              key->offset, btrfs_device_id(leaf, ditem));
779                 return -EUCLEAN;
780         }
781
782         /*
783          * For device total_bytes, we don't have reliable way to check it, as
784          * it can be 0 for device removal. Device size check can only be done
785          * by dev extents check.
786          */
787         if (btrfs_device_bytes_used(leaf, ditem) >
788             btrfs_device_total_bytes(leaf, ditem)) {
789                 dev_item_err(leaf, slot,
790                              "invalid bytes used: have %llu expect [0, %llu]",
791                              btrfs_device_bytes_used(leaf, ditem),
792                              btrfs_device_total_bytes(leaf, ditem));
793                 return -EUCLEAN;
794         }
795         /*
796          * Remaining members like io_align/type/gen/dev_group aren't really
797          * utilized.  Skip them to make later usage of them easier.
798          */
799         return 0;
800 }
801
802 /* Inode item error output has the same format as dir_item_err() */
803 #define inode_item_err(fs_info, eb, slot, fmt, ...)                     \
804         dir_item_err(eb, slot, fmt, __VA_ARGS__)
805
806 static int check_inode_item(struct extent_buffer *leaf,
807                             struct btrfs_key *key, int slot)
808 {
809         struct btrfs_fs_info *fs_info = leaf->fs_info;
810         struct btrfs_inode_item *iitem;
811         u64 super_gen = btrfs_super_generation(fs_info->super_copy);
812         u32 valid_mask = (S_IFMT | S_ISUID | S_ISGID | S_ISVTX | 0777);
813         u32 mode;
814
815         if ((key->objectid < BTRFS_FIRST_FREE_OBJECTID ||
816              key->objectid > BTRFS_LAST_FREE_OBJECTID) &&
817             key->objectid != BTRFS_ROOT_TREE_DIR_OBJECTID &&
818             key->objectid != BTRFS_FREE_INO_OBJECTID) {
819                 generic_err(leaf, slot,
820         "invalid key objectid: has %llu expect %llu or [%llu, %llu] or %llu",
821                             key->objectid, BTRFS_ROOT_TREE_DIR_OBJECTID,
822                             BTRFS_FIRST_FREE_OBJECTID,
823                             BTRFS_LAST_FREE_OBJECTID,
824                             BTRFS_FREE_INO_OBJECTID);
825                 return -EUCLEAN;
826         }
827         if (key->offset != 0) {
828                 inode_item_err(fs_info, leaf, slot,
829                         "invalid key offset: has %llu expect 0",
830                         key->offset);
831                 return -EUCLEAN;
832         }
833         iitem = btrfs_item_ptr(leaf, slot, struct btrfs_inode_item);
834
835         /* Here we use super block generation + 1 to handle log tree */
836         if (btrfs_inode_generation(leaf, iitem) > super_gen + 1) {
837                 inode_item_err(fs_info, leaf, slot,
838                         "invalid inode transid: has %llu expect [0, %llu]",
839                                btrfs_inode_generation(leaf, iitem),
840                                super_gen + 1);
841                 return -EUCLEAN;
842         }
843         /* Note for ROOT_TREE_DIR_ITEM, mkfs could set its transid 0 */
844         if (btrfs_inode_transid(leaf, iitem) > super_gen + 1) {
845                 inode_item_err(fs_info, leaf, slot,
846                         "invalid inode generation: has %llu expect [0, %llu]",
847                                btrfs_inode_transid(leaf, iitem), super_gen + 1);
848                 return -EUCLEAN;
849         }
850
851         /*
852          * For size and nbytes it's better not to be too strict, as for dir
853          * item its size/nbytes can easily get wrong, but doesn't affect
854          * anything in the fs. So here we skip the check.
855          */
856         mode = btrfs_inode_mode(leaf, iitem);
857         if (mode & ~valid_mask) {
858                 inode_item_err(fs_info, leaf, slot,
859                                "unknown mode bit detected: 0x%x",
860                                mode & ~valid_mask);
861                 return -EUCLEAN;
862         }
863
864         /*
865          * S_IFMT is not bit mapped so we can't completely rely on is_power_of_2,
866          * but is_power_of_2() can save us from checking FIFO/CHR/DIR/REG.
867          * Only needs to check BLK, LNK and SOCKS
868          */
869         if (!is_power_of_2(mode & S_IFMT)) {
870                 if (!S_ISLNK(mode) && !S_ISBLK(mode) && !S_ISSOCK(mode)) {
871                         inode_item_err(fs_info, leaf, slot,
872                         "invalid mode: has 0%o expect valid S_IF* bit(s)",
873                                        mode & S_IFMT);
874                         return -EUCLEAN;
875                 }
876         }
877         if (S_ISDIR(mode) && btrfs_inode_nlink(leaf, iitem) > 1) {
878                 inode_item_err(fs_info, leaf, slot,
879                        "invalid nlink: has %u expect no more than 1 for dir",
880                         btrfs_inode_nlink(leaf, iitem));
881                 return -EUCLEAN;
882         }
883         if (btrfs_inode_flags(leaf, iitem) & ~BTRFS_INODE_FLAG_MASK) {
884                 inode_item_err(fs_info, leaf, slot,
885                                "unknown flags detected: 0x%llx",
886                                btrfs_inode_flags(leaf, iitem) &
887                                ~BTRFS_INODE_FLAG_MASK);
888                 return -EUCLEAN;
889         }
890         return 0;
891 }
892
893 static int check_root_item(struct extent_buffer *leaf, struct btrfs_key *key,
894                            int slot)
895 {
896         struct btrfs_fs_info *fs_info = leaf->fs_info;
897         struct btrfs_root_item ri = { 0 };
898         const u64 valid_root_flags = BTRFS_ROOT_SUBVOL_RDONLY |
899                                      BTRFS_ROOT_SUBVOL_DEAD;
900
901         /* No such tree id */
902         if (key->objectid == 0) {
903                 generic_err(leaf, slot, "invalid root id 0");
904                 return -EUCLEAN;
905         }
906
907         /*
908          * Some older kernel may create ROOT_ITEM with non-zero offset, so here
909          * we only check offset for reloc tree whose key->offset must be a
910          * valid tree.
911          */
912         if (key->objectid == BTRFS_TREE_RELOC_OBJECTID && key->offset == 0) {
913                 generic_err(leaf, slot, "invalid root id 0 for reloc tree");
914                 return -EUCLEAN;
915         }
916
917         if (btrfs_item_size_nr(leaf, slot) != sizeof(ri) &&
918             btrfs_item_size_nr(leaf, slot) != btrfs_legacy_root_item_size()) {
919                 generic_err(leaf, slot,
920                             "invalid root item size, have %u expect %zu or %u",
921                             btrfs_item_size_nr(leaf, slot), sizeof(ri),
922                             btrfs_legacy_root_item_size());
923                 return -EUCLEAN;
924         }
925
926         /*
927          * For legacy root item, the members starting at generation_v2 will be
928          * all filled with 0.
929          * And since we allow geneartion_v2 as 0, it will still pass the check.
930          */
931         read_extent_buffer(leaf, &ri, btrfs_item_ptr_offset(leaf, slot),
932                            btrfs_item_size_nr(leaf, slot));
933
934         /* Generation related */
935         if (btrfs_root_generation(&ri) >
936             btrfs_super_generation(fs_info->super_copy) + 1) {
937                 generic_err(leaf, slot,
938                         "invalid root generation, have %llu expect (0, %llu]",
939                             btrfs_root_generation(&ri),
940                             btrfs_super_generation(fs_info->super_copy) + 1);
941                 return -EUCLEAN;
942         }
943         if (btrfs_root_generation_v2(&ri) >
944             btrfs_super_generation(fs_info->super_copy) + 1) {
945                 generic_err(leaf, slot,
946                 "invalid root v2 generation, have %llu expect (0, %llu]",
947                             btrfs_root_generation_v2(&ri),
948                             btrfs_super_generation(fs_info->super_copy) + 1);
949                 return -EUCLEAN;
950         }
951         if (btrfs_root_last_snapshot(&ri) >
952             btrfs_super_generation(fs_info->super_copy) + 1) {
953                 generic_err(leaf, slot,
954                 "invalid root last_snapshot, have %llu expect (0, %llu]",
955                             btrfs_root_last_snapshot(&ri),
956                             btrfs_super_generation(fs_info->super_copy) + 1);
957                 return -EUCLEAN;
958         }
959
960         /* Alignment and level check */
961         if (!IS_ALIGNED(btrfs_root_bytenr(&ri), fs_info->sectorsize)) {
962                 generic_err(leaf, slot,
963                 "invalid root bytenr, have %llu expect to be aligned to %u",
964                             btrfs_root_bytenr(&ri), fs_info->sectorsize);
965                 return -EUCLEAN;
966         }
967         if (btrfs_root_level(&ri) >= BTRFS_MAX_LEVEL) {
968                 generic_err(leaf, slot,
969                             "invalid root level, have %u expect [0, %u]",
970                             btrfs_root_level(&ri), BTRFS_MAX_LEVEL - 1);
971                 return -EUCLEAN;
972         }
973         if (ri.drop_level >= BTRFS_MAX_LEVEL) {
974                 generic_err(leaf, slot,
975                             "invalid root level, have %u expect [0, %u]",
976                             ri.drop_level, BTRFS_MAX_LEVEL - 1);
977                 return -EUCLEAN;
978         }
979
980         /* Flags check */
981         if (btrfs_root_flags(&ri) & ~valid_root_flags) {
982                 generic_err(leaf, slot,
983                             "invalid root flags, have 0x%llx expect mask 0x%llx",
984                             btrfs_root_flags(&ri), valid_root_flags);
985                 return -EUCLEAN;
986         }
987         return 0;
988 }
989
990 __printf(3,4)
991 __cold
992 static void extent_err(const struct extent_buffer *eb, int slot,
993                        const char *fmt, ...)
994 {
995         struct btrfs_key key;
996         struct va_format vaf;
997         va_list args;
998         u64 bytenr;
999         u64 len;
1000
1001         btrfs_item_key_to_cpu(eb, &key, slot);
1002         bytenr = key.objectid;
1003         if (key.type == BTRFS_METADATA_ITEM_KEY ||
1004             key.type == BTRFS_TREE_BLOCK_REF_KEY ||
1005             key.type == BTRFS_SHARED_BLOCK_REF_KEY)
1006                 len = eb->fs_info->nodesize;
1007         else
1008                 len = key.offset;
1009         va_start(args, fmt);
1010
1011         vaf.fmt = fmt;
1012         vaf.va = &args;
1013
1014         btrfs_crit(eb->fs_info,
1015         "corrupt %s: block=%llu slot=%d extent bytenr=%llu len=%llu %pV",
1016                 btrfs_header_level(eb) == 0 ? "leaf" : "node",
1017                 eb->start, slot, bytenr, len, &vaf);
1018         va_end(args);
1019 }
1020
1021 static int check_extent_item(struct extent_buffer *leaf,
1022                              struct btrfs_key *key, int slot,
1023                              struct btrfs_key *prev_key)
1024 {
1025         struct btrfs_fs_info *fs_info = leaf->fs_info;
1026         struct btrfs_extent_item *ei;
1027         bool is_tree_block = false;
1028         unsigned long ptr;      /* Current pointer inside inline refs */
1029         unsigned long end;      /* Extent item end */
1030         const u32 item_size = btrfs_item_size_nr(leaf, slot);
1031         u64 flags;
1032         u64 generation;
1033         u64 total_refs;         /* Total refs in btrfs_extent_item */
1034         u64 inline_refs = 0;    /* found total inline refs */
1035
1036         if (key->type == BTRFS_METADATA_ITEM_KEY &&
1037             !btrfs_fs_incompat(fs_info, SKINNY_METADATA)) {
1038                 generic_err(leaf, slot,
1039 "invalid key type, METADATA_ITEM type invalid when SKINNY_METADATA feature disabled");
1040                 return -EUCLEAN;
1041         }
1042         /* key->objectid is the bytenr for both key types */
1043         if (!IS_ALIGNED(key->objectid, fs_info->sectorsize)) {
1044                 generic_err(leaf, slot,
1045                 "invalid key objectid, have %llu expect to be aligned to %u",
1046                            key->objectid, fs_info->sectorsize);
1047                 return -EUCLEAN;
1048         }
1049
1050         /* key->offset is tree level for METADATA_ITEM_KEY */
1051         if (key->type == BTRFS_METADATA_ITEM_KEY &&
1052             key->offset >= BTRFS_MAX_LEVEL) {
1053                 extent_err(leaf, slot,
1054                            "invalid tree level, have %llu expect [0, %u]",
1055                            key->offset, BTRFS_MAX_LEVEL - 1);
1056                 return -EUCLEAN;
1057         }
1058
1059         /*
1060          * EXTENT/METADATA_ITEM consists of:
1061          * 1) One btrfs_extent_item
1062          *    Records the total refs, type and generation of the extent.
1063          *
1064          * 2) One btrfs_tree_block_info (for EXTENT_ITEM and tree backref only)
1065          *    Records the first key and level of the tree block.
1066          *
1067          * 2) Zero or more btrfs_extent_inline_ref(s)
1068          *    Each inline ref has one btrfs_extent_inline_ref shows:
1069          *    2.1) The ref type, one of the 4
1070          *         TREE_BLOCK_REF       Tree block only
1071          *         SHARED_BLOCK_REF     Tree block only
1072          *         EXTENT_DATA_REF      Data only
1073          *         SHARED_DATA_REF      Data only
1074          *    2.2) Ref type specific data
1075          *         Either using btrfs_extent_inline_ref::offset, or specific
1076          *         data structure.
1077          */
1078         if (item_size < sizeof(*ei)) {
1079                 extent_err(leaf, slot,
1080                            "invalid item size, have %u expect [%zu, %u)",
1081                            item_size, sizeof(*ei),
1082                            BTRFS_LEAF_DATA_SIZE(fs_info));
1083                 return -EUCLEAN;
1084         }
1085         end = item_size + btrfs_item_ptr_offset(leaf, slot);
1086
1087         /* Checks against extent_item */
1088         ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
1089         flags = btrfs_extent_flags(leaf, ei);
1090         total_refs = btrfs_extent_refs(leaf, ei);
1091         generation = btrfs_extent_generation(leaf, ei);
1092         if (generation > btrfs_super_generation(fs_info->super_copy) + 1) {
1093                 extent_err(leaf, slot,
1094                            "invalid generation, have %llu expect (0, %llu]",
1095                            generation,
1096                            btrfs_super_generation(fs_info->super_copy) + 1);
1097                 return -EUCLEAN;
1098         }
1099         if (!is_power_of_2(flags & (BTRFS_EXTENT_FLAG_DATA |
1100                                     BTRFS_EXTENT_FLAG_TREE_BLOCK))) {
1101                 extent_err(leaf, slot,
1102                 "invalid extent flag, have 0x%llx expect 1 bit set in 0x%llx",
1103                         flags, BTRFS_EXTENT_FLAG_DATA |
1104                         BTRFS_EXTENT_FLAG_TREE_BLOCK);
1105                 return -EUCLEAN;
1106         }
1107         is_tree_block = !!(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK);
1108         if (is_tree_block) {
1109                 if (key->type == BTRFS_EXTENT_ITEM_KEY &&
1110                     key->offset != fs_info->nodesize) {
1111                         extent_err(leaf, slot,
1112                                    "invalid extent length, have %llu expect %u",
1113                                    key->offset, fs_info->nodesize);
1114                         return -EUCLEAN;
1115                 }
1116         } else {
1117                 if (key->type != BTRFS_EXTENT_ITEM_KEY) {
1118                         extent_err(leaf, slot,
1119                         "invalid key type, have %u expect %u for data backref",
1120                                    key->type, BTRFS_EXTENT_ITEM_KEY);
1121                         return -EUCLEAN;
1122                 }
1123                 if (!IS_ALIGNED(key->offset, fs_info->sectorsize)) {
1124                         extent_err(leaf, slot,
1125                         "invalid extent length, have %llu expect aligned to %u",
1126                                    key->offset, fs_info->sectorsize);
1127                         return -EUCLEAN;
1128                 }
1129         }
1130         ptr = (unsigned long)(struct btrfs_extent_item *)(ei + 1);
1131
1132         /* Check the special case of btrfs_tree_block_info */
1133         if (is_tree_block && key->type != BTRFS_METADATA_ITEM_KEY) {
1134                 struct btrfs_tree_block_info *info;
1135
1136                 info = (struct btrfs_tree_block_info *)ptr;
1137                 if (btrfs_tree_block_level(leaf, info) >= BTRFS_MAX_LEVEL) {
1138                         extent_err(leaf, slot,
1139                         "invalid tree block info level, have %u expect [0, %u]",
1140                                    btrfs_tree_block_level(leaf, info),
1141                                    BTRFS_MAX_LEVEL - 1);
1142                         return -EUCLEAN;
1143                 }
1144                 ptr = (unsigned long)(struct btrfs_tree_block_info *)(info + 1);
1145         }
1146
1147         /* Check inline refs */
1148         while (ptr < end) {
1149                 struct btrfs_extent_inline_ref *iref;
1150                 struct btrfs_extent_data_ref *dref;
1151                 struct btrfs_shared_data_ref *sref;
1152                 u64 dref_offset;
1153                 u64 inline_offset;
1154                 u8 inline_type;
1155
1156                 if (ptr + sizeof(*iref) > end) {
1157                         extent_err(leaf, slot,
1158 "inline ref item overflows extent item, ptr %lu iref size %zu end %lu",
1159                                    ptr, sizeof(*iref), end);
1160                         return -EUCLEAN;
1161                 }
1162                 iref = (struct btrfs_extent_inline_ref *)ptr;
1163                 inline_type = btrfs_extent_inline_ref_type(leaf, iref);
1164                 inline_offset = btrfs_extent_inline_ref_offset(leaf, iref);
1165                 if (ptr + btrfs_extent_inline_ref_size(inline_type) > end) {
1166                         extent_err(leaf, slot,
1167 "inline ref item overflows extent item, ptr %lu iref size %u end %lu",
1168                                    ptr, inline_type, end);
1169                         return -EUCLEAN;
1170                 }
1171
1172                 switch (inline_type) {
1173                 /* inline_offset is subvolid of the owner, no need to check */
1174                 case BTRFS_TREE_BLOCK_REF_KEY:
1175                         inline_refs++;
1176                         break;
1177                 /* Contains parent bytenr */
1178                 case BTRFS_SHARED_BLOCK_REF_KEY:
1179                         if (!IS_ALIGNED(inline_offset, fs_info->sectorsize)) {
1180                                 extent_err(leaf, slot,
1181                 "invalid tree parent bytenr, have %llu expect aligned to %u",
1182                                            inline_offset, fs_info->sectorsize);
1183                                 return -EUCLEAN;
1184                         }
1185                         inline_refs++;
1186                         break;
1187                 /*
1188                  * Contains owner subvolid, owner key objectid, adjusted offset.
1189                  * The only obvious corruption can happen in that offset.
1190                  */
1191                 case BTRFS_EXTENT_DATA_REF_KEY:
1192                         dref = (struct btrfs_extent_data_ref *)(&iref->offset);
1193                         dref_offset = btrfs_extent_data_ref_offset(leaf, dref);
1194                         if (!IS_ALIGNED(dref_offset, fs_info->sectorsize)) {
1195                                 extent_err(leaf, slot,
1196                 "invalid data ref offset, have %llu expect aligned to %u",
1197                                            dref_offset, fs_info->sectorsize);
1198                                 return -EUCLEAN;
1199                         }
1200                         inline_refs += btrfs_extent_data_ref_count(leaf, dref);
1201                         break;
1202                 /* Contains parent bytenr and ref count */
1203                 case BTRFS_SHARED_DATA_REF_KEY:
1204                         sref = (struct btrfs_shared_data_ref *)(iref + 1);
1205                         if (!IS_ALIGNED(inline_offset, fs_info->sectorsize)) {
1206                                 extent_err(leaf, slot,
1207                 "invalid data parent bytenr, have %llu expect aligned to %u",
1208                                            inline_offset, fs_info->sectorsize);
1209                                 return -EUCLEAN;
1210                         }
1211                         inline_refs += btrfs_shared_data_ref_count(leaf, sref);
1212                         break;
1213                 default:
1214                         extent_err(leaf, slot, "unknown inline ref type: %u",
1215                                    inline_type);
1216                         return -EUCLEAN;
1217                 }
1218                 ptr += btrfs_extent_inline_ref_size(inline_type);
1219         }
1220         /* No padding is allowed */
1221         if (ptr != end) {
1222                 extent_err(leaf, slot,
1223                            "invalid extent item size, padding bytes found");
1224                 return -EUCLEAN;
1225         }
1226
1227         /* Finally, check the inline refs against total refs */
1228         if (inline_refs > total_refs) {
1229                 extent_err(leaf, slot,
1230                         "invalid extent refs, have %llu expect >= inline %llu",
1231                            total_refs, inline_refs);
1232                 return -EUCLEAN;
1233         }
1234
1235         if ((prev_key->type == BTRFS_EXTENT_ITEM_KEY) ||
1236             (prev_key->type == BTRFS_METADATA_ITEM_KEY)) {
1237                 u64 prev_end = prev_key->objectid;
1238
1239                 if (prev_key->type == BTRFS_METADATA_ITEM_KEY)
1240                         prev_end += fs_info->nodesize;
1241                 else
1242                         prev_end += prev_key->offset;
1243
1244                 if (unlikely(prev_end > key->objectid)) {
1245                         extent_err(leaf, slot,
1246         "previous extent [%llu %u %llu] overlaps current extent [%llu %u %llu]",
1247                                    prev_key->objectid, prev_key->type,
1248                                    prev_key->offset, key->objectid, key->type,
1249                                    key->offset);
1250                         return -EUCLEAN;
1251                 }
1252         }
1253
1254         return 0;
1255 }
1256
1257 static int check_simple_keyed_refs(struct extent_buffer *leaf,
1258                                    struct btrfs_key *key, int slot)
1259 {
1260         u32 expect_item_size = 0;
1261
1262         if (key->type == BTRFS_SHARED_DATA_REF_KEY)
1263                 expect_item_size = sizeof(struct btrfs_shared_data_ref);
1264
1265         if (btrfs_item_size_nr(leaf, slot) != expect_item_size) {
1266                 generic_err(leaf, slot,
1267                 "invalid item size, have %u expect %u for key type %u",
1268                             btrfs_item_size_nr(leaf, slot),
1269                             expect_item_size, key->type);
1270                 return -EUCLEAN;
1271         }
1272         if (!IS_ALIGNED(key->objectid, leaf->fs_info->sectorsize)) {
1273                 generic_err(leaf, slot,
1274 "invalid key objectid for shared block ref, have %llu expect aligned to %u",
1275                             key->objectid, leaf->fs_info->sectorsize);
1276                 return -EUCLEAN;
1277         }
1278         if (key->type != BTRFS_TREE_BLOCK_REF_KEY &&
1279             !IS_ALIGNED(key->offset, leaf->fs_info->sectorsize)) {
1280                 extent_err(leaf, slot,
1281                 "invalid tree parent bytenr, have %llu expect aligned to %u",
1282                            key->offset, leaf->fs_info->sectorsize);
1283                 return -EUCLEAN;
1284         }
1285         return 0;
1286 }
1287
1288 static int check_extent_data_ref(struct extent_buffer *leaf,
1289                                  struct btrfs_key *key, int slot)
1290 {
1291         struct btrfs_extent_data_ref *dref;
1292         unsigned long ptr = btrfs_item_ptr_offset(leaf, slot);
1293         const unsigned long end = ptr + btrfs_item_size_nr(leaf, slot);
1294
1295         if (btrfs_item_size_nr(leaf, slot) % sizeof(*dref) != 0) {
1296                 generic_err(leaf, slot,
1297         "invalid item size, have %u expect aligned to %zu for key type %u",
1298                             btrfs_item_size_nr(leaf, slot),
1299                             sizeof(*dref), key->type);
1300                 return -EUCLEAN;
1301         }
1302         if (!IS_ALIGNED(key->objectid, leaf->fs_info->sectorsize)) {
1303                 generic_err(leaf, slot,
1304 "invalid key objectid for shared block ref, have %llu expect aligned to %u",
1305                             key->objectid, leaf->fs_info->sectorsize);
1306                 return -EUCLEAN;
1307         }
1308         for (; ptr < end; ptr += sizeof(*dref)) {
1309                 u64 offset;
1310
1311                 /*
1312                  * We cannot check the extent_data_ref hash due to possible
1313                  * overflow from the leaf due to hash collisions.
1314                  */
1315                 dref = (struct btrfs_extent_data_ref *)ptr;
1316                 offset = btrfs_extent_data_ref_offset(leaf, dref);
1317                 if (!IS_ALIGNED(offset, leaf->fs_info->sectorsize)) {
1318                         extent_err(leaf, slot,
1319         "invalid extent data backref offset, have %llu expect aligned to %u",
1320                                    offset, leaf->fs_info->sectorsize);
1321                         return -EUCLEAN;
1322                 }
1323         }
1324         return 0;
1325 }
1326
1327 /*
1328  * Common point to switch the item-specific validation.
1329  */
1330 static int check_leaf_item(struct extent_buffer *leaf,
1331                            struct btrfs_key *key, int slot,
1332                            struct btrfs_key *prev_key)
1333 {
1334         int ret = 0;
1335         struct btrfs_chunk *chunk;
1336
1337         switch (key->type) {
1338         case BTRFS_EXTENT_DATA_KEY:
1339                 ret = check_extent_data_item(leaf, key, slot, prev_key);
1340                 break;
1341         case BTRFS_EXTENT_CSUM_KEY:
1342                 ret = check_csum_item(leaf, key, slot, prev_key);
1343                 break;
1344         case BTRFS_DIR_ITEM_KEY:
1345         case BTRFS_DIR_INDEX_KEY:
1346         case BTRFS_XATTR_ITEM_KEY:
1347                 ret = check_dir_item(leaf, key, slot);
1348                 break;
1349         case BTRFS_BLOCK_GROUP_ITEM_KEY:
1350                 ret = check_block_group_item(leaf, key, slot);
1351                 break;
1352         case BTRFS_CHUNK_ITEM_KEY:
1353                 chunk = btrfs_item_ptr(leaf, slot, struct btrfs_chunk);
1354                 ret = check_leaf_chunk_item(leaf, chunk, key, slot);
1355                 break;
1356         case BTRFS_DEV_ITEM_KEY:
1357                 ret = check_dev_item(leaf, key, slot);
1358                 break;
1359         case BTRFS_INODE_ITEM_KEY:
1360                 ret = check_inode_item(leaf, key, slot);
1361                 break;
1362         case BTRFS_ROOT_ITEM_KEY:
1363                 ret = check_root_item(leaf, key, slot);
1364                 break;
1365         case BTRFS_EXTENT_ITEM_KEY:
1366         case BTRFS_METADATA_ITEM_KEY:
1367                 ret = check_extent_item(leaf, key, slot, prev_key);
1368                 break;
1369         case BTRFS_TREE_BLOCK_REF_KEY:
1370         case BTRFS_SHARED_DATA_REF_KEY:
1371         case BTRFS_SHARED_BLOCK_REF_KEY:
1372                 ret = check_simple_keyed_refs(leaf, key, slot);
1373                 break;
1374         case BTRFS_EXTENT_DATA_REF_KEY:
1375                 ret = check_extent_data_ref(leaf, key, slot);
1376                 break;
1377         }
1378         return ret;
1379 }
1380
1381 static int check_leaf(struct extent_buffer *leaf, bool check_item_data)
1382 {
1383         struct btrfs_fs_info *fs_info = leaf->fs_info;
1384         /* No valid key type is 0, so all key should be larger than this key */
1385         struct btrfs_key prev_key = {0, 0, 0};
1386         struct btrfs_key key;
1387         u32 nritems = btrfs_header_nritems(leaf);
1388         int slot;
1389
1390         if (btrfs_header_level(leaf) != 0) {
1391                 generic_err(leaf, 0,
1392                         "invalid level for leaf, have %d expect 0",
1393                         btrfs_header_level(leaf));
1394                 return -EUCLEAN;
1395         }
1396
1397         /*
1398          * Extent buffers from a relocation tree have a owner field that
1399          * corresponds to the subvolume tree they are based on. So just from an
1400          * extent buffer alone we can not find out what is the id of the
1401          * corresponding subvolume tree, so we can not figure out if the extent
1402          * buffer corresponds to the root of the relocation tree or not. So
1403          * skip this check for relocation trees.
1404          */
1405         if (nritems == 0 && !btrfs_header_flag(leaf, BTRFS_HEADER_FLAG_RELOC)) {
1406                 u64 owner = btrfs_header_owner(leaf);
1407
1408                 /* These trees must never be empty */
1409                 if (owner == BTRFS_ROOT_TREE_OBJECTID ||
1410                     owner == BTRFS_CHUNK_TREE_OBJECTID ||
1411                     owner == BTRFS_EXTENT_TREE_OBJECTID ||
1412                     owner == BTRFS_DEV_TREE_OBJECTID ||
1413                     owner == BTRFS_FS_TREE_OBJECTID ||
1414                     owner == BTRFS_DATA_RELOC_TREE_OBJECTID) {
1415                         generic_err(leaf, 0,
1416                         "invalid root, root %llu must never be empty",
1417                                     owner);
1418                         return -EUCLEAN;
1419                 }
1420                 /* Unknown tree */
1421                 if (owner == 0) {
1422                         generic_err(leaf, 0,
1423                                 "invalid owner, root 0 is not defined");
1424                         return -EUCLEAN;
1425                 }
1426                 return 0;
1427         }
1428
1429         if (nritems == 0)
1430                 return 0;
1431
1432         /*
1433          * Check the following things to make sure this is a good leaf, and
1434          * leaf users won't need to bother with similar sanity checks:
1435          *
1436          * 1) key ordering
1437          * 2) item offset and size
1438          *    No overlap, no hole, all inside the leaf.
1439          * 3) item content
1440          *    If possible, do comprehensive sanity check.
1441          *    NOTE: All checks must only rely on the item data itself.
1442          */
1443         for (slot = 0; slot < nritems; slot++) {
1444                 u32 item_end_expected;
1445                 int ret;
1446
1447                 btrfs_item_key_to_cpu(leaf, &key, slot);
1448
1449                 /* Make sure the keys are in the right order */
1450                 if (btrfs_comp_cpu_keys(&prev_key, &key) >= 0) {
1451                         generic_err(leaf, slot,
1452         "bad key order, prev (%llu %u %llu) current (%llu %u %llu)",
1453                                 prev_key.objectid, prev_key.type,
1454                                 prev_key.offset, key.objectid, key.type,
1455                                 key.offset);
1456                         return -EUCLEAN;
1457                 }
1458
1459                 /*
1460                  * Make sure the offset and ends are right, remember that the
1461                  * item data starts at the end of the leaf and grows towards the
1462                  * front.
1463                  */
1464                 if (slot == 0)
1465                         item_end_expected = BTRFS_LEAF_DATA_SIZE(fs_info);
1466                 else
1467                         item_end_expected = btrfs_item_offset_nr(leaf,
1468                                                                  slot - 1);
1469                 if (btrfs_item_end_nr(leaf, slot) != item_end_expected) {
1470                         generic_err(leaf, slot,
1471                                 "unexpected item end, have %u expect %u",
1472                                 btrfs_item_end_nr(leaf, slot),
1473                                 item_end_expected);
1474                         return -EUCLEAN;
1475                 }
1476
1477                 /*
1478                  * Check to make sure that we don't point outside of the leaf,
1479                  * just in case all the items are consistent to each other, but
1480                  * all point outside of the leaf.
1481                  */
1482                 if (btrfs_item_end_nr(leaf, slot) >
1483                     BTRFS_LEAF_DATA_SIZE(fs_info)) {
1484                         generic_err(leaf, slot,
1485                         "slot end outside of leaf, have %u expect range [0, %u]",
1486                                 btrfs_item_end_nr(leaf, slot),
1487                                 BTRFS_LEAF_DATA_SIZE(fs_info));
1488                         return -EUCLEAN;
1489                 }
1490
1491                 /* Also check if the item pointer overlaps with btrfs item. */
1492                 if (btrfs_item_nr_offset(slot) + sizeof(struct btrfs_item) >
1493                     btrfs_item_ptr_offset(leaf, slot)) {
1494                         generic_err(leaf, slot,
1495                 "slot overlaps with its data, item end %lu data start %lu",
1496                                 btrfs_item_nr_offset(slot) +
1497                                 sizeof(struct btrfs_item),
1498                                 btrfs_item_ptr_offset(leaf, slot));
1499                         return -EUCLEAN;
1500                 }
1501
1502                 if (check_item_data) {
1503                         /*
1504                          * Check if the item size and content meet other
1505                          * criteria
1506                          */
1507                         ret = check_leaf_item(leaf, &key, slot, &prev_key);
1508                         if (ret < 0)
1509                                 return ret;
1510                 }
1511
1512                 prev_key.objectid = key.objectid;
1513                 prev_key.type = key.type;
1514                 prev_key.offset = key.offset;
1515         }
1516
1517         return 0;
1518 }
1519
1520 int btrfs_check_leaf_full(struct extent_buffer *leaf)
1521 {
1522         return check_leaf(leaf, true);
1523 }
1524 ALLOW_ERROR_INJECTION(btrfs_check_leaf_full, ERRNO);
1525
1526 int btrfs_check_leaf_relaxed(struct extent_buffer *leaf)
1527 {
1528         return check_leaf(leaf, false);
1529 }
1530
1531 int btrfs_check_node(struct extent_buffer *node)
1532 {
1533         struct btrfs_fs_info *fs_info = node->fs_info;
1534         unsigned long nr = btrfs_header_nritems(node);
1535         struct btrfs_key key, next_key;
1536         int slot;
1537         int level = btrfs_header_level(node);
1538         u64 bytenr;
1539         int ret = 0;
1540
1541         if (level <= 0 || level >= BTRFS_MAX_LEVEL) {
1542                 generic_err(node, 0,
1543                         "invalid level for node, have %d expect [1, %d]",
1544                         level, BTRFS_MAX_LEVEL - 1);
1545                 return -EUCLEAN;
1546         }
1547         if (nr == 0 || nr > BTRFS_NODEPTRS_PER_BLOCK(fs_info)) {
1548                 btrfs_crit(fs_info,
1549 "corrupt node: root=%llu block=%llu, nritems too %s, have %lu expect range [1,%u]",
1550                            btrfs_header_owner(node), node->start,
1551                            nr == 0 ? "small" : "large", nr,
1552                            BTRFS_NODEPTRS_PER_BLOCK(fs_info));
1553                 return -EUCLEAN;
1554         }
1555
1556         for (slot = 0; slot < nr - 1; slot++) {
1557                 bytenr = btrfs_node_blockptr(node, slot);
1558                 btrfs_node_key_to_cpu(node, &key, slot);
1559                 btrfs_node_key_to_cpu(node, &next_key, slot + 1);
1560
1561                 if (!bytenr) {
1562                         generic_err(node, slot,
1563                                 "invalid NULL node pointer");
1564                         ret = -EUCLEAN;
1565                         goto out;
1566                 }
1567                 if (!IS_ALIGNED(bytenr, fs_info->sectorsize)) {
1568                         generic_err(node, slot,
1569                         "unaligned pointer, have %llu should be aligned to %u",
1570                                 bytenr, fs_info->sectorsize);
1571                         ret = -EUCLEAN;
1572                         goto out;
1573                 }
1574
1575                 if (btrfs_comp_cpu_keys(&key, &next_key) >= 0) {
1576                         generic_err(node, slot,
1577         "bad key order, current (%llu %u %llu) next (%llu %u %llu)",
1578                                 key.objectid, key.type, key.offset,
1579                                 next_key.objectid, next_key.type,
1580                                 next_key.offset);
1581                         ret = -EUCLEAN;
1582                         goto out;
1583                 }
1584         }
1585 out:
1586         return ret;
1587 }
1588 ALLOW_ERROR_INJECTION(btrfs_check_node, ERRNO);