Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
extmod/vfs: Check block 0 and 1 when auto-detecting littlefs.
The superblock for littlefs is in block 0 and 1, but block 0 may be erased or partially written, so block 1 must be checked if block 0 does not have a valid littlefs superblock in it. Prior to this commit, the mount of a block device which auto-detected the filysystem type would fail for littlefs if block 0 did not contain a valid superblock. That is now fixed. Signed-off-by: Damien George <damien@micropython.org>
- Loading branch information
Showing
3 changed files
with
69 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# Test for VfsLfs using a RAM device, when the first superblock does not exist | ||
|
||
try: | ||
import uos | ||
|
||
uos.VfsLfs2 | ||
except (ImportError, AttributeError): | ||
print("SKIP") | ||
raise SystemExit | ||
|
||
|
||
class RAMBlockDevice: | ||
def __init__(self, block_size, data): | ||
self.block_size = block_size | ||
self.data = data | ||
|
||
def readblocks(self, block, buf, off): | ||
addr = block * self.block_size + off | ||
for i in range(len(buf)): | ||
buf[i] = self.data[addr + i] | ||
|
||
def ioctl(self, op, arg): | ||
if op == 4: # block count | ||
return len(self.data) // self.block_size | ||
if op == 5: # block size | ||
return self.block_size | ||
if op == 6: # erase block | ||
return 0 | ||
|
||
|
||
# This is a valid littlefs2 filesystem with a block size of 64 bytes. | ||
# The first block (where the first superblock is stored) is fully erased. | ||
lfs2_data = b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x00\x00\xf0\x0f\xff\xf7littlefs/\xe0\x00\x10\x00\x00\x02\x00@\x00\x00\x00\x04\x00\x00\x00\xff\x00\x00\x00\xff\xff\xff\x7f\xfe\x03\x00\x00p\x1f\xfc\x08\x1b\xb4\x14\xa7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x00\x00\xff\xef\xff\xf7test.txt \x00\x00\x08p\x1f\xfc\x08\x83\xf1u\xba\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" | ||
|
||
# Create the block device from the static data (it will be read-only). | ||
bdev = RAMBlockDevice(64, lfs2_data) | ||
|
||
# Create the VFS explicitly, no auto-detection is needed for this. | ||
vfs = uos.VfsLfs2(bdev) | ||
print(list(vfs.ilistdir())) | ||
|
||
# Mount the block device directly; this relies on auto-detection. | ||
uos.mount(bdev, "/userfs") | ||
print(uos.listdir("/userfs")) | ||
|
||
# Clean up. | ||
uos.umount("/userfs") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
[] | ||
[] |