resyfer opened a new pull request, #18884:
URL: https://github.com/apache/nuttx/pull/18884
Split mnemofs into allocation, directory, file, CTZ, and read/write modules,
and update direntry traversal and file handling. Add superblock format version
1 support, reject newer on-flash versions, and preserve the mounted version
when rewriting metadata.
Update the NAND simulator drivers for the new mnemofs behavior by fixing
spare writes, exposing the erase state, allowing raw reads, and documenting the
background-task startup flow.
## Summary
The existing mnemofs implementation has a logic flaw which requires a huge
amount of memory for the flush operation (which happens rarely, but happens).
The fix to this required changes to the core of the file system design, hence
the big changes.
## Impact
Upon this review completing, mnemofs's structure should be free of any logic
flaws, and hence should be good to be designated for the structure of version
1. Testing should only require changes to logic, not the structure.
## Testing
This has been tested using the nand simulator. An example log of creating
and writing to a file and reading its contents (`/hi/a/b/c.txt`) along with the
info/error logs (some parts have been truncated to be readable):
```sh
nsh> nand
binfs_stat: Entry
nand_devscan: Retrieving bad block information. nblocks=1024
nand_checkblock: Page 0 block 4 marker=00
nand_devscan: Good blocks: 0 - 4
nand_devscan: Block 4 is bad
...
nand_devscan: Block 456 is bad
nand_checkblock: Page 0 block 500 marker=00
nand_devscan: Good blocks: 457 - 500
nand_devscan: Block 500 is bad
nand_devscan: Good blocks: 501 - 1024
Driver running!
nsh> ls /dev
binfs_stat: Entry
/dev:
console
...
nand
...
zero
nsh> mount -t mnemofs -o autoformat /dev/nand /hi
binfs_stat: Entry
find_blockdriver: pathname="/dev/nand"
find_blockdriver: /dev/nand is a MTD
mnemofs_bind: sb allocated: 0x7f2a5f7b40e0
nand_wrapper: [UPPER 1 | ioctl] Command: 1537, Arg : 139819967267056
nand_wrapper: [UPPER 1 | ioctl] Done
nand_wrapper: [UPPER 2 | ioctl] Command: 1546, Arg : 139819967267104
nand_wrapper: [UPPER 2 | ioctl] Done
mnemofs_bind: Mount option set: autoformat
nand_wrapper: [UPPER 3 | isbad] Block: 0
nand_wrapper: [UPPER 3 | isbad] Done 0
nand_wrapper: [UPPER 4 | isbad] Block: 0
nand_wrapper: [UPPER 4 | isbad] Done 0
nand_wrapper: [UPPER 5 | bread] Startblock: 0, N Pages: 1, Buffer:
0x7f2a5f7b4198
nand_bread: startpage: 0 npages: 1
nand_readpage: block=0 page=0 data=0x7f2a5f7b4198
nand_wrapper: [UPPER 5 | bread] Done
nand_wrapper: [UPPER 6 | isbad] Block: 1
nand_wrapper: [UPPER 6 | isbad] Done 0
nand_wrapper: [UPPER 7 | isbad] Block: 0
nand_wrapper: [UPPER 7 | isbad] Done 0
nand_wrapper: [UPPER 8 | erase] Startblock: 0, N Blocks: 1
nand_erase: startblock: 00000000 nblocks: 1
nand_wrapper: [UPPER 8 | erase] Done
nand_wrapper: [UPPER 9 | isbad] Block: 1
nand_wrapper: [UPPER 9 | isbad] Done 0
nand_wrapper: [UPPER 10 | erase] Startblock: 1, N Blocks: 1
...
nand_erase: startblock: 0000001b nblocks: 1
nand_wrapper: [UPPER 58 | erase] Done
nand_wrapper: [UPPER 59 | isbad] Block: 28
nand_checkblock: Page 0 block 28 marker=00
nand_wrapper: [UPPER 59 | isbad] Done 1
nand_wrapper: [UPPER 60 | isbad] Block: 29
nand_wrapper: [UPPER 60 | isbad] Done 0
nand_wrapper: [UPPER 61 | erase] Startblock: 29, N Blocks: 1
nand_erase: startblock: 0000001d nblocks: 1
nand_wrapper: [UPPER 61 | erase] Done
...
nand_readpage: block=1 page=13 data=0x7f2a5f7b4198
nand_wrapper: [UPPER 35085 | bread] Done
nand_wrapper: [UPPER 35086 | isbad] Block: 1
nand_wrapper: [UPPER 35086 | isbad] Done 0
nand_wrapper: [UPPER 35087 | bread] Startblock: 30, N Pages: 1, Buffer:
0x7f2a5f7b4198
nand_bread: startpage: 30 npages: 1
nand_readpage: block=1 page=14 data=0x7f2a5f7b4198
nand_wrapper: [UPPER 35087 | bread] Done
nand_wrapper: [UPPER 35088 | isbad] Block: 1
nand_wrapper: [UPPER 35088 | isbad] Done 0
nand_wrapper: [UPPER 35089 | bread] Startblock: 31, N Pages: 1, Buffer:
0x7f2a5f7b4198
nand_bread: startpage: 31 npages: 1
nand_readpage: block=1 page=15 data=0x7f2a5f7b4198
nand_wrapper: [UPPER 35089 | bread] Done
nand_wrapper: [UPPER 35090 | isbad] Block: 610
nand_wrapper: [UPPER 35090 | isbad] Done 0
nsh> ls
binfs_stat: Entry
/:
bin/
data/
dev/
etc/
hi/
proc/
tmp/
nsh> cd hi
binfs_stat: Entry
nsh> mkdir a
binfs_stat: Entry
nand_wrapper: [UPPER 35091 | isbad] Block: 1
nand_wrapper: [UPPER 35091 | isbad] Done 0
nand_wrapper: [UPPER 35092 | bread] Startblock: 17, N Pages: 1, Buffer:
0x7faff4db4198
...
nand_bwrite: startpage: 17 npages: 1
nand_wrapper: [UPPER 35125 | bwrite] Done
nsh> ls
binfs_stat: Entry
/hi:
nand_wrapper: [UPPER 35126 | isbad] Block: 1
nand_wrapper: [UPPER 35126 | isbad] Done 0
nand_wrapper: [UPPER 35127 | bread] Startblock: 17, N Pages: 1, Buffer:
0x7faff4db4198
...
nand_bread: startpage: 31 npages: 1
nand_readpage: block=1 page=15 data=0x7faff4db4198
nand_wrapper: [UPPER 35155 | bread] Done
a/
nand_wrapper: [UPPER 35156 | isbad] Block: 1
nand_wrapper: [UPPER 35156 | isbad] Done 0
nand_wrapper: [UPPER 35157 | bread] Startblock: 17, N Pages: 1, Buffer:
0x7faff4db4198
...
nand_bread: startpage: 31 npages: 1
nand_readpage: block=1 page=15 data=0x7faff4db4198
nand_wrapper: [UPPER 35185 | bread] Done
nsh> cd a
binfs_stat: Entry
nand_wrapper: [UPPER 35186 | isbad] Block: 1
nand_wrapper: [UPPER 35186 | isbad] Done 0
nand_wrapper: [UPPER 35187 | bread] Startblock: 17, N Pages: 1, Buffer:
0x7faff4db4198
...
nand_bread: startpage: 31 npages: 1
nand_readpage: block=1 page=15 data=0x7faff4db4198
nand_wrapper: [UPPER 35245 | bread] Done
nsh> mkdir b
binfs_stat: Entry
nand_wrapper: [UPPER 35246 | isbad] Block: 1
nand_wrapper: [UPPER 35246 | isbad] Done 0
nand_wrapper: [UPPER 35247 | bread] Startblock: 17, N Pages: 1, Buffer:
0x7faff4db4198
...
nand_bread: startpage: 12177 npages: 1
nand_readpage: block=761 page=1 data=0x7faff4db4198
nand_wrapper: [UPPER 35309 | bread] Done
mfs_dir_mkdir: created dir a/b
nand_wrapper: [UPPER 35310 | bwrite] Startblock: 12177, N Pages: 1, Buffer:
0x7faff4db4198
nand_bwrite: startpage: 12177 npages: 1
nand_wrapper: [UPPER 35310 | bwrite] Done
nsh> ls
binfs_stat: Entry
nand_wrapper: [UPPER 35311 | isbad] Block: 1
nand_wrapper: [UPPER 35311 | isbad] Done 0
nand_wrapper: [UPPER 35312 | bread] Startblock: 17, N Pages: 1, Buffer:
0x7faff4db4198
...
nand_bread: startpage: 30 npages: 1
nand_readpage: block=1 page=14 data=0x7faff4db4198
nand_wrapper: [UPPER 35338 | bread] Done
nand_wrapper: [UPPER 35339 | isbad] Block: 1
nand_wrapper: [UPPER 35339 | isbad] Done 0
nand_wrapper: [UPPER 35340 | bread] Startblock: 31, N Pages: 1, Buffer:
0x7faff4db4198
nand_bread: startpage: 31 npages: 1
nand_readpage: block=1 page=15 data=0x7faff4db4198
nand_wrapper: [UPPER 35340 | bread] Done
/hi/a:
nand_wrapper: [UPPER 35341 | isbad] Block: 1
nand_wrapper: [UPPER 35341 | isbad] Done 0
nand_wrapper: [UPPER 35342 | bread] Startblock: 17, N Pages: 1, Buffer:
0x7faff4db4198
...
nand_wrapper: [UPPER 35398 | bread] Done
nand_wrapper: [UPPER 35399 | isbad] Block: 761
nand_wrapper: [UPPER 35399 | isbad] Done 0
nand_wrapper: [UPPER 35400 | bread] Startblock: 12191, N Pages: 1, Buffer:
0x7faff4db4198
nand_bread: startpage: 12191 npages: 1
nand_readpage: block=761 page=15 data=0x7faff4db4198
nand_wrapper: [UPPER 35400 | bread] Done
b/
nand_wrapper: [UPPER 35401 | isbad] Block: 761
nand_wrapper: [UPPER 35401 | isbad] Done 0
nand_wrapper: [UPPER 35402 | bread] Startblock: 12177, N Pages: 1, Buffer:
0x7faff4db4198
...
nand_bread: startpage: 12190 npages: 1
nand_readpage: block=761 page=14 data=0x7faff4db4198
nand_wrapper: [UPPER 35428 | bread] Done
nand_wrapper: [UPPER 35429 | isbad] Block: 761
nand_wrapper: [UPPER 35429 | isbad] Done 0
nand_wrapper: [UPPER 35430 | bread] Startblock: 12191, N Pages: 1, Buffer:
0x7faff4db4198
nand_bread: startpage: 12191 npages: 1
nand_readpage: block=761 page=15 data=0x7faff4db4198
nand_wrapper: [UPPER 35430 | bread] Done
nsh> cd b
binfs_stat: Entry
nand_wrapper: [UPPER 35431 | isbad] Block: 1
nand_wrapper: [UPPER 35431 | isbad] Done 0
...
nand_bread: startpage: 12190 npages: 1
nand_readpage: block=761 page=14 data=0x7faff4db4198
nand_wrapper: [UPPER 35578 | bread] Done
nand_wrapper: [UPPER 35579 | isbad] Block: 761
nand_wrapper: [UPPER 35579 | isbad] Done 0
nand_wrapper: [UPPER 35580 | bread] Startblock: 12191, N Pages: 1, Buffer:
0x7faff4db4198
nand_bread: startpage: 12191 npages: 1
nand_readpage: block=761 page=15 data=0x7faff4db4198
nand_wrapper: [UPPER 35580 | bread] Done
nsh> pwd
binfs_stat: Entry
/hi/a/b
nsh> echo "hello world from mnemofs" > c.txt
binfs_stat: Entry
nand_wrapper: [UPPER 35581 | isbad] Block: 1
nand_wrapper: [UPPER 35581 | isbad] Done 0
nand_wrapper: [UPPER 35582 | bread] Startblock: 17, N Pages: 1, Buffer:
0x7faff4db4198
nand_bread: startpage: 17 npages: 1
nand_readpage: block=1 page=1 data=0x7faff4db4198
nand_wrapper: [UPPER 35582 | bread] Done
nand_wrapper: [UPPER 35583 | isbad] Block: 1
nand_wrapper: [UPPER 35583 | isbad] Done 0
nand_wrapper: [UPPER 35584 | bread] Startblock: 18, N Pages: 1, Buffer:
0x7faff4db4198
...
nand_bread: startpage: 12195 npages: 1
nand_readpage: block=762 page=3 data=0x7faff4db4198
nand_wrapper: [UPPER 35872 | bread] Done
nand_wrapper: [UPPER 35873 | bwrite] Startblock: 12195, N Pages: 1, Buffer:
0x7faff4db4198
nand_bwrite: startpage: 12195 npages: 1
nand_wrapper: [UPPER 35873 | bwrite] Done
nsh> cat c.txt
binfs_stat: Entry
nand_wrapper: [UPPER 35874 | isbad] Block: 1
nand_wrapper: [UPPER 35874 | isbad] Done 0
nand_wrapper: [UPPER 35875 | bread] Startblock: 17, N Pages: 1, Buffer:
0x7faff4db4198
nand_bread: startpage: 17 npages: 1
nand_readpage: block=1 page=1 data=0x7faff4db4198
nand_wrapper: [UPPER 35875 | bread] Done
nand_wrapper: [UPPER 35876 | isbad] Block: 1
nand_wrapper: [UPPER 35876 | isbad] Done 0
nand_wrapper: [UPPER 35877 | bread] Startblock: 18, N Pages: 1, Buffer:
0x7faff4db4198
nand_bread: startpage: 18 npages: 1
nand_readpage: block=1 page=2 data=0x7faff4db4198
...
mfs_dir_create_file: created file a/b/c.txt
...
nand_bread: startpage: 12207 npages: 1
nand_readpage: block=762 page=15 data=0x7faff4db4198
nand_wrapper: [UPPER 35963 | bread] Done
nand_wrapper: [UPPER 35964 | isbad] Block: 763
nand_wrapper: [UPPER 35964 | isbad] Done 0
nand_wrapper: [UPPER 35965 | bread] Startblock: 12210, N Pages: 1, Buffer:
0x7faff4db4198
nand_bread: startpage: 12210 npages: 1
nand_readpage: block=763 page=2 data=0x7faff4db4198
nand_wrapper: [UPPER 35965 | bread] Done
hello world from mnemofs
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]