diff options
| author | Sven-Göran Bergh <sgb@systemaxion.se> | 2018-01-19 20:36:15 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-01-19 20:37:13 +0100 |
| commit | e411cd071a2b6456c653f1a7179b83bef810bb72 (patch) | |
| tree | acaef2c064f79d3dc86ab6d532b3c2c360aefcdc /util-linux | |
| parent | f6dd9e02155430a608e1b38036e355c045772d04 (diff) | |
| download | busybox-w32-e411cd071a2b6456c653f1a7179b83bef810bb72.tar.gz busybox-w32-e411cd071a2b6456c653f1a7179b83bef810bb72.tar.bz2 busybox-w32-e411cd071a2b6456c653f1a7179b83bef810bb72.zip | |
volume_id: add LittleFS detection
Add support for LittleFS to blkid. Not included if FEATURE_BLKID_TYPE
is not selected (neither UUID nor label).
LittleFS is a small fail-safe filesystem designed for embedded
systems. It has strong copy-on-write guarantees and storage on disk
is always kept in a valid state. It also provides a form of dynamic
wear levelling for systems that can not fit a full flash translation
layer. (https://github.com/geky/littlefs)
ARM has introduced it in its Mbed OS 5.7, so it starts to gain focus.
(https://os.mbed.com/blog/entry/littlefs-high-integrity-embedded-fs/)
function old new delta
volume_id_probe_lfs - 62 +62
fs1 20 24 +4
Signed-off-by: Sven-Göran Bergh <sgb@systemaxion.se>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'util-linux')
| -rw-r--r-- | util-linux/volume_id/lfs.c | 62 | ||||
| -rw-r--r-- | util-linux/volume_id/volume_id.c | 3 | ||||
| -rw-r--r-- | util-linux/volume_id/volume_id_internal.h | 2 |
3 files changed, 67 insertions, 0 deletions
diff --git a/util-linux/volume_id/lfs.c b/util-linux/volume_id/lfs.c new file mode 100644 index 000000000..1a2a2987f --- /dev/null +++ b/util-linux/volume_id/lfs.c | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | /* | ||
| 2 | * volume_id - reads filesystem label and uuid | ||
| 3 | * | ||
| 4 | * Copyright (C) 2018 Sven-Göran Bergh <sgb@systemaxion.se> | ||
| 5 | * | ||
| 6 | * Licensed under GPLv2, see file LICENSE in this source tree. | ||
| 7 | */ | ||
| 8 | //config:config FEATURE_VOLUMEID_LFS | ||
| 9 | //config: bool "LittleFS filesystem" | ||
| 10 | //config: default y | ||
| 11 | //config: depends on VOLUMEID && FEATURE_BLKID_TYPE | ||
| 12 | //config: help | ||
| 13 | //config: LittleFS is a small fail-safe filesystem designed for embedded | ||
| 14 | //config: systems. It has strong copy-on-write guarantees and storage on disk | ||
| 15 | //config: is always kept in a valid state. It also provides a form of dynamic | ||
| 16 | //config: wear levelling for systems that can not fit a full flash translation | ||
| 17 | //config: layer. | ||
| 18 | |||
| 19 | //kbuild:lib-$(CONFIG_FEATURE_VOLUMEID_LFS) += lfs.o | ||
| 20 | |||
| 21 | #include "volume_id_internal.h" | ||
| 22 | |||
| 23 | #define LFS_SB1_OFFSET 0x10 | ||
| 24 | #define LFS_MAGIC_NAME "littlefs" | ||
| 25 | #define LFS_MAGIC_LEN 8 | ||
| 26 | |||
| 27 | // The superblock is stored in the first metadata pair, i.e the first two blocks. | ||
| 28 | struct lfs_super_block { // A block in a metadata pair | ||
| 29 | // /* 0x00 */ uint32_t rev_count; // Revision count | ||
| 30 | // /* 0x04 */ uint32_t dir_size; // Directory size | ||
| 31 | // /* 0x08 */ uint64_t tail_ptr; // Tail pointer | ||
| 32 | /* 0x10 */ uint8_t entry_type; // Entry type | ||
| 33 | /* 0x11 */ uint8_t entry_len; // Entry length | ||
| 34 | /* 0x12 */ uint8_t att_len; // Attribute length | ||
| 35 | /* 0x13 */ uint8_t name_len; // Name length | ||
| 36 | /* 0x14 */ uint64_t root_dir; // Root directory | ||
| 37 | /* 0x1C */ uint32_t block_size; // Block size | ||
| 38 | /* 0x20 */ uint32_t block_count; // Block count | ||
| 39 | /* 0x24 */ uint16_t ver_major; // Version major | ||
| 40 | /* 0x26 */ uint16_t ver_minor; // Version minor | ||
| 41 | /* 0x28 */ uint8_t magic[LFS_MAGIC_LEN]; // Magic string "littlefs" | ||
| 42 | // /* 0x30 */ uint32_t crc; // CRC-32 checksum | ||
| 43 | } PACKED; | ||
| 44 | |||
| 45 | int FAST_FUNC volume_id_probe_lfs(struct volume_id *id /*,uint64_t off*/) | ||
| 46 | { | ||
| 47 | struct lfs_super_block *sb; | ||
| 48 | |||
| 49 | // Go for primary super block (ignore second sb) | ||
| 50 | dbg("lfs: probing at offset 0x%x", LFS_SB1_OFFSET); | ||
| 51 | sb = volume_id_get_buffer(id, LFS_SB1_OFFSET, sizeof(*sb)); | ||
| 52 | |||
| 53 | if (!sb) | ||
| 54 | return -1; | ||
| 55 | |||
| 56 | if (memcmp(sb->magic, LFS_MAGIC_NAME, LFS_MAGIC_LEN) != 0) | ||
| 57 | return -1; | ||
| 58 | |||
| 59 | IF_FEATURE_BLKID_TYPE(id->type = LFS_MAGIC_NAME); | ||
| 60 | |||
| 61 | return 0; | ||
| 62 | } | ||
diff --git a/util-linux/volume_id/volume_id.c b/util-linux/volume_id/volume_id.c index 85315ced6..c3f07a741 100644 --- a/util-linux/volume_id/volume_id.c +++ b/util-linux/volume_id/volume_id.c | |||
| @@ -97,6 +97,9 @@ static const probe_fptr fs1[] = { | |||
| 97 | #if ENABLE_FEATURE_VOLUMEID_EXFAT | 97 | #if ENABLE_FEATURE_VOLUMEID_EXFAT |
| 98 | volume_id_probe_exfat, | 98 | volume_id_probe_exfat, |
| 99 | #endif | 99 | #endif |
| 100 | #if ENABLE_FEATURE_VOLUMEID_LFS | ||
| 101 | volume_id_probe_lfs, | ||
| 102 | #endif | ||
| 100 | #if ENABLE_FEATURE_VOLUMEID_MAC | 103 | #if ENABLE_FEATURE_VOLUMEID_MAC |
| 101 | volume_id_probe_mac_partition_map, | 104 | volume_id_probe_mac_partition_map, |
| 102 | #endif | 105 | #endif |
diff --git a/util-linux/volume_id/volume_id_internal.h b/util-linux/volume_id/volume_id_internal.h index 0eaea9b34..ada18339d 100644 --- a/util-linux/volume_id/volume_id_internal.h +++ b/util-linux/volume_id/volume_id_internal.h | |||
| @@ -187,6 +187,8 @@ int FAST_FUNC volume_id_probe_iso9660(struct volume_id *id /*,uint64_t off*/); | |||
| 187 | 187 | ||
| 188 | int FAST_FUNC volume_id_probe_jfs(struct volume_id *id /*,uint64_t off*/); | 188 | int FAST_FUNC volume_id_probe_jfs(struct volume_id *id /*,uint64_t off*/); |
| 189 | 189 | ||
| 190 | int FAST_FUNC volume_id_probe_lfs(struct volume_id *id /*,uint64_t off*/); | ||
| 191 | |||
| 190 | int FAST_FUNC volume_id_probe_linux_swap(struct volume_id *id /*,uint64_t off*/); | 192 | int FAST_FUNC volume_id_probe_linux_swap(struct volume_id *id /*,uint64_t off*/); |
| 191 | 193 | ||
| 192 | int FAST_FUNC volume_id_probe_luks(struct volume_id *id /*,uint64_t off*/); | 194 | int FAST_FUNC volume_id_probe_luks(struct volume_id *id /*,uint64_t off*/); |
