mirror of
https://github.com/eledio-devices/thirdparty-littlefs.git
synced 2025-11-01 08:48:31 +01:00
This is a minor tweak that resulted from looking at some other use cases for the littlefs data-structure on disk. Consider an implementation that does not need to buffer inline-files in RAM. In this case we should have as large a tag size field as possible. Unfortunately, we don't have much space to work with in the 32-bit tag struct, so we have to make some compromises. These limitations could be removed with a 64-bit tag struct, at the cost of code size. 32-bit tag structure: [--- 32 ---] [1|- 9 -|- 9 -|-- 13 --] ^ ^ ^ ^- entry length | | \-------- file id | \-------------- tag type \------------------ valid bit
45 lines
1.1 KiB
Python
Executable File
45 lines
1.1 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import struct
|
|
import sys
|
|
import os
|
|
import argparse
|
|
|
|
def corrupt(block):
|
|
with open(block, 'r+b') as file:
|
|
# skip rev
|
|
file.read(4)
|
|
|
|
# go to last commit
|
|
tag = 0xffffffff
|
|
while True:
|
|
try:
|
|
ntag, = struct.unpack('<I', file.read(4))
|
|
except struct.error:
|
|
break
|
|
|
|
tag ^= ntag
|
|
size = (tag & 0x1fff) if (tag & 0x1fff) != 0x1fff else 0
|
|
file.seek(size, os.SEEK_CUR)
|
|
|
|
# lob off last 3 bytes
|
|
file.seek(-(size + 3), os.SEEK_CUR)
|
|
file.truncate()
|
|
|
|
def main(args):
|
|
if args.n or not args.blocks:
|
|
with open('blocks/.history', 'rb') as file:
|
|
for i in range(int(args.n or 1)):
|
|
last, = struct.unpack('<I', file.read(4))
|
|
args.blocks.append('blocks/%x' % last)
|
|
|
|
for block in args.blocks:
|
|
print 'corrupting %s' % block
|
|
corrupt(block)
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-n')
|
|
parser.add_argument('blocks', nargs='*')
|
|
main(parser.parse_args())
|