Thanks Qu! I did it (had to add 'progs_extra' to the 'static' make target...), but it looks like there's something missing:
------------------------------------------------------------- # ./btrfs-corrupt-block.static -X /dev/sdb3 ./btrfs-corrupt-block.static: invalid option -- 'X' usage: btrfs-corrupt-block [options] device -l Logical extent to be corrupted -c Copy of the extent to be corrupted (usually 1 or 2, default: 0) -b Number of bytes to be corrupted -e Extent to be corrupted -E The whole extent tree to be corrupted -u Given chunk item to be corrupted -U The whole chunk tree to be corrupted -i The inode item to corrupt (must also specify the field to corrupt) -x The file extent item to corrupt (must also specify -i for the inode and -f for the field to corrupt) -m The metadata block to corrupt (must also specify -f for the field to corrupt) -K The key to corrupt in the format <num>,<num>,<num> (must also specify -f for the field) -f The field in the item to corrupt -I An item to corrupt (must also specify the field to corrupt and a root+key for the item) -D Corrupt a dir item, must specify key and field -d Delete this item (must specify -K) ------------------------------------------------------------- I cloned at --depth=1, if that matters... Didn't dare to play around wiht the lowercase 'x' option... O_o On Wed, Jan 24, 2018 at 10:14 AM, Qu Wenruo <quwenruo.bt...@gmx.com> wrote: > Here is the super dirty tricky fix (and less deadly now). > > https://github.com/adam900710/btrfs-progs/tree/dirty_fix > > Please compile the branch and run: > > # ./btrfs-corrupt-block -X <device> > > Where <device> must be unmounted, the original btrfs-corrupt-block tool > doesn't have mount check, and I'm too lazy to add such check. > > The hack will remove the offending DIR_ITEM completely, and unlink the > old "Manifest" file, and repair the link for newer "Manifest" file. > > And it shouldn't write anything to disk if any operation failed, so it's > less deadly. > > Wish you good luck. > > Thanks, > Qu > > On 2018年01月24日 17:18, Foo Bar wrote: >> Qu Wenruo wrote on 2018-01-24 09:49: >>> Sorry for the late reply, I was off yesterday. >>> >> >> No problem :-) >> >> Booted normally today, system up, but see this (I forgot to stop the snapshot >> cron task...) >> >> [ 115.127961] BTRFS error (device sdb3): Send: inconsistent snapshot, >> found >> deleted reference for inode 30039323 without updated inode item, send root is >> 1399, parent root is 1385 >> >> So inode 30039323 looks definitely the bad one. Let's get rid of it and keep >> the newest dups, if any, thanks! >> >> Cheers, >> >> Marco >> >>> On 2018年01月22日 23:04, ^m'e wrote: >>>> Thanks for the quick reply, Qu! >>>> >>>> I forgot to say that I see weird characters in the btrfs check repair >>>> in lines "ERROR: DIR_ITEM... name ..." output. Although that can be >>>> due to corruption, I seem to remember that a previous version of >>>> btrfs-progs I used didn't show that... >>>> I also see: >>>> >>>> [19428.934684] init_special_inode: bogus i_mode (700) for inode >>>> sdb3:18446744073709551361 >>>> >>>> BTW, no sensible names in the debug output, and as far as I can see, >>>> it might be all stuff in '[rootfs]/usr/portage': if that's the case, >>>> corrupted inodes can be safely removed, as the portage package tree >>>> can be easily rebuild. Here you are: >>>> >>>> ---------------------------------->8------------------------------------- >>>> # cat btrfs-debug.30039322.log[snip] >>> >>> This where the dir starts. >>> >>>> item 78 key (30039322 INODE_ITEM 0) itemoff 4203 itemsize 160 >>>> generation 136248 transid 229515 size 152 nbytes 0 >>>> block group 0 mode 40755 links 1 uid 250 gid 250 rdev 0 >>>> sequence 0 flags 0xf(none) >>>> atime 1504685599.188061317 (2017-09-06 08:13:19) >>>> ctime 1516557882.551679697 (2018-01-21 18:04:42) >>>> mtime 1516557882.551679697 (2018-01-21 18:04:42) >>>> otime 1504685599.188061317 (2017-09-06 08:13:19) >>>> item 79 key (30039322 INODE_REF 30037720) itemoff 4161 itemsize 42 >>>> index 242 namelen 32 name: obs-service-download_src_package >>>> item 80 key (30039322 DIR_ITEM 1076301169) itemoff 4083 itemsize 78 >>>> location key (30039325 INODE_ITEM 0) type FILE >>>> transid 136248 data_len 0 name_len 48 >>>> name: obs-service-download_src_package-20130318.ebuild >>>> item 81 key (30039322 DIR_ITEM 2438219243) itemoff 4041 itemsize 42 >>>> location key (0 UNKNOWN.0 0) type FILE >>>> transid 136192 data_len 0 name_len 12 >>>> name: metadata.xml >>>> item 82 key (30039322 DIR_ITEM 4007295565) itemoff 3927 itemsize 114 >>>> location key (0 UNKNOWN.0 0) type DIR_ITEM.0 >>>> transid 0 data_len 0 name_len 0 >>>> name: >>>> location key (0 UNKNOWN.125 72057594038112709) type DIR_ITEM.0 >>>> transid 0 data_len 32907 name_len 3 >>>> name: >>>> data >>> >>> The whole item is corrupted. >>> Seems to be a half-written item get flushed to disk. >>> >>> I assume this is the DIR_ITEM for *two* Manifest, but that's just >>> insane, as we're going to have 2 files with the same name "Manifest" >>> >>>> item 83 key (30039322 DIR_INDEX 2) itemoff 3889 itemsize 38 >>>> location key (30039323 INODE_ITEM 0) type FILE >>>> transid 3377699720527872 data_len 0 name_len 8 >>> >>> The transid seems corrupted too. >>> >>> Maybe I need to delete this item too? >>> >>>> item 64 key (47302013 INODE_REF 30039322) itemoff 11278 itemsize 18 >>>> index 5 namelen 8 name: Manifest >>> >>> Now we do have 2 "Manifest". >>> >>> Which one do you prefer to delete? >>> >>> The latter one, inode 47302013 seems newer, while previous one, inode >>> 30039323 is pretty old. >>> >>> Despite that, I didn't see big problem in the dump. >>> >>> I'll just craft the dirty fix to delete one inode and the incorrect dir >>> index/item. >>> >>> Thanks, >>> Qu >>> >> > -- ^m'e -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html