Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/littlefs-project/littlefs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Haster <chaster@utexas.edu>2017-10-13 02:33:09 +0300
committerChristopher Haster <chaster@utexas.edu>2017-10-13 04:31:33 +0300
commit454b588f73032f9621c264fba280ab7b3a216402 (patch)
tree4de1a6452704f6b9e37954e50404cd987974c89d /SPEC.md
parentf3578e3250d1027bbc9e3fe2fa535b8ed540c5d8 (diff)
Updated SPEC.md and DESIGN.md based on recent changes
- Added math behind CTZ limits - Added documentation over atomic moves
Diffstat (limited to 'SPEC.md')
-rw-r--r--SPEC.md33
1 files changed, 21 insertions, 12 deletions
diff --git a/SPEC.md b/SPEC.md
index 631c9c4..b80892e 100644
--- a/SPEC.md
+++ b/SPEC.md
@@ -121,13 +121,18 @@ Here's the layout of entries on disk:
**Entry type** - Type of the entry, currently this is limited to the following:
- 0x11 - file entry
- 0x22 - directory entry
-- 0xe2 - superblock entry
+- 0x2e - superblock entry
-Additionally, the type is broken into two 4 bit nibbles, with the lower nibble
+Additionally, the type is broken into two 4 bit nibbles, with the upper nibble
specifying the type's data structure used when scanning the filesystem. The
-upper nibble clarifies the type further when multiple entries share the same
+lower nibble clarifies the type further when multiple entries share the same
data structure.
+The highest bit is reserved for marking the entry as "moved". If an entry
+is marked as "moved", the entry may also exist somewhere else in the
+filesystem. If the entry exists elsewhere, this entry must be treated as
+though it does not exist.
+
**Entry length** - Length in bytes of the entry-specific data. This does
not include the entry type size, attributes, or name. The full size in bytes
of the entry is 4 + entry length + attribute length + name length.
@@ -175,7 +180,7 @@ Here's the layout of the superblock entry:
| offset | size | description |
|--------|------------------------|----------------------------------------|
-| 0x00 | 8 bits | entry type (0xe2 for superblock entry) |
+| 0x00 | 8 bits | entry type (0x2e for superblock entry) |
| 0x01 | 8 bits | entry length (20 bytes) |
| 0x02 | 8 bits | attribute length |
| 0x03 | 8 bits | name length (8 bytes) |
@@ -208,7 +213,7 @@ Here's an example of a complete superblock:
(32 bits) revision count = 3 (0x00000003)
(32 bits) dir size = 52 bytes, end of dir (0x00000034)
(64 bits) tail pointer = 3, 2 (0x00000003, 0x00000002)
-(8 bits) entry type = superblock (0xe2)
+(8 bits) entry type = superblock (0x2e)
(8 bits) entry length = 20 bytes (0x14)
(8 bits) attribute length = 0 bytes (0x00)
(8 bits) name length = 8 bytes (0x08)
@@ -220,7 +225,7 @@ Here's an example of a complete superblock:
(32 bits) crc = 0xc50b74fa
00000000: 03 00 00 00 34 00 00 00 03 00 00 00 02 00 00 00 ....4...........
-00000010: e2 14 00 08 03 00 00 00 02 00 00 00 00 02 00 00 ................
+00000010: 2e 14 00 08 03 00 00 00 02 00 00 00 00 02 00 00 ................
00000020: 00 04 00 00 01 00 01 00 6c 69 74 74 6c 65 66 73 ........littlefs
00000030: fa 74 0b c5 .t..
```
@@ -262,15 +267,19 @@ Here's an example of a directory entry:
Files are stored in entries with a pointer to the head of the file and the
size of the file. This is enough information to determine the state of the
-CTZ linked-list that is being referenced.
+CTZ skip-list that is being referenced.
How files are actually stored on disk is a bit complicated. The full
-explanation of CTZ linked-lists can be found in [DESIGN.md](DESIGN.md#ctz-linked-lists).
+explanation of CTZ skip-lists can be found in [DESIGN.md](DESIGN.md#ctz-skip-lists).
A terribly quick summary: For every nth block where n is divisible by 2^x,
-the block contains a pointer that points x blocks towards the beginning of the
-file. These pointers are stored in order of x in each block of the file
-immediately before the data in the block.
+the block contains a pointer to block n-2^x. These pointers are stored in
+increasing order of x in each block of the file preceding the data in the
+block.
+
+The maximum number of pointers in a block is bounded by the maximum file size
+divided by the block size. With 32 bits for file size, this results in a
+minimum block size of 104 bytes.
Here's the layout of a file entry:
@@ -286,7 +295,7 @@ Here's the layout of a file entry:
| 0xc+a | name length bytes | directory name |
**File head** - Pointer to the block that is the head of the file's CTZ
-linked-list.
+skip-list.
**File size** - Size of file in bytes.