Commit Graph

149 Commits (c52a8d6044c689020a517b1f7deb87ee17431d62)

Author SHA1 Message Date
Martin Kojtal 1a5a2f0134
Merge pull request #6774 from geky/littlefs-fix-trailing-dots
littlefs: Fix issue with trailing dots in file paths
2018-05-03 16:26:47 +01:00
Christopher Haster b56bdf18cd littlefs: Fixed issue with trailing dots in file paths
Paths such as the following were causing issues:
/tea/hottea/.
/tea/hottea/..

Unfortunately the existing structure for path lookup didn't make it very
easy to introduce proper handling in this case without duplicating the
entire skip logic for paths. So the lfs_dir_find function had to be
restructured a bit.

One odd side-effect of this is that now lfs_dir_find includes the
initial fetch operation. This kinda breaks the fetch -> op pattern of
the dir functions, but does come with a nice code size reduction.
2018-04-30 03:42:53 -05:00
Christopher Haster a97a47978a mbr: Added assertions for overlapping partitions 2018-04-22 08:28:06 -05:00
Christopher Haster 9e03b24120 littlefs: Fixed lookahead overflow and removed unbounded lookahead pointers
As pointed out by davidefer, the lookahead pointer modular arithmetic
does not work around integer overflow when the pointer size is not a
multiple of the block count.

To avoid overflow problems, the easy solution is to stop trying to
work around integer overflows and keep the lookahead offset inside the
block device. To make this work, the ack was modified into a resetable
counter that is decremented every block allocation.

As a plus, quite a bit of the allocation logic ended up simplified.
2018-04-11 22:34:40 -05:00
Christopher Haster 47bee2343c littlefs: Fixed issue with lookahead trusting old lookahead blocks
One of the big simplifications in littlefs's implementation is the
complete lack of tracking free blocks, allowing operations to simply
drop blocks that are no longer in use.

However, this means the lookahead buffer can easily contain outdated
blocks that were previously deleted. This is usually fine, as littlefs
will rescan the storage if it can't find a free block in the lookahead
buffer, but after changes that caused littlefs to more conservatively
respect the alloc acks (e611cf5), any scanned blocks after an ack would
be incorrectly trusted.

The fix is to eagerly scan ahead in the lookahead when we allocate so
that alloc acks are better able to discredit old lookahead blocks. Since
usually alloc acks are tightly coupled to allocations of one or two blocks,
this allows littlefs to properly rescan every set of allocations.

This may still be a concern if there is a long series of worn out
blocks, but in the worst case littlefs will conservatively avoid using
blocks it's not sure about.

Found by davidefer
2018-04-11 14:41:01 -05:00
Jimmy Brisson 64df0ddee8
Merge pull request #6408 from davidsaada/david_erase_size_addr
Add overloaded get_erase_size API with address parameter to BlockDevice
2018-03-29 11:59:28 -05:00
David Saada a6048005d7 Add overloaded get_erase_size API with address parameter to all block devices 2018-03-23 00:34:45 +02:00
Cruz Monrreal 7ab4b064e5
Merge pull request #6338 from geky/fix-littlefs-dir-chain
littlefs: Fix issue updating dir struct when extended dir chain
2018-03-20 14:33:26 -05:00
Cruz Monrreal a3d8c8fe16
Merge pull request #6363 from deepikabhavnani/seek_fix
dir seek fixed - dptr was not updated before checking
2018-03-20 14:21:49 -05:00
Cruz Monrreal 9cac3b2f6b
Merge pull request #6149 from bmcdonnell-ionx/typos
Fix typos in the files
2018-03-15 10:53:03 -05:00
Deepika 351aaa8acd dir seek fixed - dptr was not updated before checking 2018-03-14 14:40:08 -05:00
Christopher Haster 7f17a9b8da littlefs: Fixed issue updating dir struct when extended dir chain
Like most of the lfs_dir_t functions, lfs_dir_append is responsible for
updating the lfs_dir_t struct if the underlying directory block is
moved. This property makes handling worn out blocks much easier by
removing the amount of state that needs to be considered during a
directory update.

However, extending the dir chain is a bit of a corner case. It's not
changing the old block, but callers of lfs_dir_append do assume the
"entry" will reside in "dir" after lfs_dir_append completes.

This issue only occurs when creating files, since mkdir does not use
the entry after lfs_dir_append. Unfortunately, the tests against
extending the directory chain were all made using mkdir.

Found by schouleu
2018-03-12 15:52:32 -05:00
Christopher Haster 17f7c8cd5b fatfs: Revert "Update error code mapping"
This reverts commits:
b40ff8af15
b548fd8a39
2018-03-09 15:27:03 -06:00
Cruz Monrreal c4354fa645
Merge pull request #6179 from geky/lfs-update
littlefs: Update to version 1.3
2018-03-01 13:42:47 -06:00
Christopher Haster 687304455e littlefs: Updated error codes in tests to match version update 2018-02-28 19:56:13 -06:00
Cruz Monrreal b7c2b1f510
Merge pull request #6120 from ARMmbed/g-fat-errors
fatfs: Update error code mapping
2018-02-26 14:46:33 -06:00
Christopher Haster 436e4706ed littlefs: Add littlefs.intrinsics to override intrinsics support
Enables intrinsics for bit operations such as ctz, popc, and le32
conversion. Can be disabled to help debug toolchain issues. Has
proven to be surprisingly useful.
2018-02-23 17:51:42 -06:00
Christopher Haster afc3306d25 littlefs: Adopted MBED_ASSERT and littlefs.enable_assert
Much like the logging functions, assertions can be enabled, disabled
and forced with the littlefs.enable_assert config option. Integrates
with the new LFS_ASSERT macro.
2018-02-23 17:45:24 -06:00
Cruz Monrreal II b40ff8af15 Moved return statements to their own line 2018-02-23 11:23:13 -06:00
Christopher Haster 453a1b6815 Merge commit '451c3d137fbd49ce5e00e765af66c16bb5169ee9' into lfs-update 2018-02-22 18:43:04 -06:00
Christopher Haster f67a795ef0 littlefs: Fixed handling of root as target for create operations
Before this patch, when calling lfs_mkdir or lfs_file_open with root
as the target, littlefs wouldn't find the path properly and happily
run into undefined behaviour.

The fix is to populate a directory entry for root in the lfs_dir_find
function. As an added plus, this allowed several special cases around
root to be completely dropped.
2018-02-22 15:56:24 -06:00
Brendan McDonnell 7094e13891 revert typos in external sources 2018-02-21 19:08:28 -05:00
Brendan McDonnell c4f10aafee typos 2018-02-20 20:11:19 -05:00
Cruz Monrreal e66cc74b8f
Merge pull request #6046 from geky/fix-lookahead-noack-pop
littlefs: Fix incorrect lookahead population before ack
2018-02-20 13:19:13 -06:00
Christopher Haster b548fd8a39 fatfs: Update error code mapping
A lot of the error codes in fatfs were mapped incorrectly. This patch
revisits the error code mapping to try to correct these mistakes
2018-02-16 00:29:22 -06:00
Christopher Haster db965c1652
mbr: Added note about limitations 2018-02-14 10:31:14 -06:00
Christopher Haster 5b09daf0f9 mbr: Added checks for extended partitions 2018-02-13 14:03:02 -06:00
Christopher Haster 70cfef8630 fatfs: Removed extra MBR block
Regression after ChanFS update: Due to parameter changes in the f_mkfs
function, the option to use a separate block for MBR (FDISK) was turned
back on. This should be off as it conflicts with an explicit MBR when
using the MBRBlockDevice.
2018-02-12 17:16:10 -06:00
Christopher Haster df1896b6c0 littlefs: Fix incorrect lookahead population before ack
Rather than tracking all in-flight blocks blocks during a lookahead,
littlefs uses an ack scheme to mark the first allocated block that
hasn't reached the disk yet. littlefs assumes all blocks since the
last ack are bad or in-flight, and uses this to know when it's out
of storage.

However, these unacked allocations were still being populated in the
lookahead buffer. If the whole block device fits in the lookahead
buffer, _and_ littlefs managed to scan around the whole storage while
an unacked block was still in-flight, it would assume the block was
free and misallocate it.

The fix is to only fill the lookahead buffer up to the last ack.
The internal free structure was restructured to simplify the runtime
calculation of lookahead size.
2018-02-08 18:53:19 -06:00
Brendan McDonnell 88cd13b115 cast to resolve signed/unsigned comparison compiler warning in FATFileSystem::dir_seek() 2018-02-05 15:16:02 -05:00
Cruz Monrreal 5cd30b965c
Merge pull request #5925 from geky/bd-erase-value
bd: Add get_erase_value function to the block device API
2018-01-31 12:13:54 -06:00
Amanda Butler e6949db802 bd: Copy edit BlockDevices
Copy edit SlicingBlockDevice.h
Copy edit ReadOnlyBlockDevice.h
Copy edit ProfilingBlockDevice.h
Copy edit ObservingBlockDevice.h
Copy edit MBRBlockDevice.h
Copy edit ExhaustibleBlockDevice.h
Copy edit ChainingBlockDevice.h
Copy edit BlockDevice.h

Copy edit files for active voice and consistent tense.
2018-01-29 18:45:36 -06:00
Christopher Haster 88aad81345 bd: Adopted the get_erase_value function in the util block devices 2018-01-29 15:33:02 -06:00
Christopher Haster 7707c8b8b8 bd: Added get_erase_value function to the block device API
Default implementation returns -1 and is backwards compatible
2018-01-29 15:31:07 -06:00
Christopher Haster 6e5f2439a3 littlefs: Adopted the block device sync function
Required to garuntee that data is flushed all the way down to the disk
level when a file is synced or closed.
2018-01-24 18:07:47 -06:00
Christopher Haster a4f8af9d5b bd: Adopted the sync function in the util block devices 2018-01-24 18:07:35 -06:00
Christopher Haster 3f5d618c89 bd: Add sync function to the block device API
/** Ensure data on storage is in sync with the driver
 *
 *  @return         0 on success or a negative error code on failure
 */
virtual int sync()
2018-01-24 17:58:20 -06:00
Cruz Monrreal c59c400093
Merge pull request #5832 from geky/fix-truncate-zero
littlefs: Fix file truncation without writes
2018-01-18 14:25:47 -06:00
Cruz Monrreal 698c7d9e8c
Merge pull request #5819 from geky/test-common
Add COMMON folder for tests
2018-01-18 14:20:23 -06:00
Cruz Monrreal b8abbab38b
Merge pull request #5761 from geky/littlefs-fix-lookahead-rewind
littlefs: Fix issue with immediate exhaustion and small unaligned storage
2018-01-18 13:01:25 -06:00
Cruz Monrreal 25aa0e6d37
Merge pull request #5846 from geky/fix-block-addr-overflow
littlefs: Fix block addr overflow
2018-01-16 15:53:30 -06:00
Martin Kojtal 8c78649078
Merge pull request #5829 from deepikabhavnani/fat_issue_5780_3
Fix: Sector/Size overflow from uint32_t
2018-01-15 15:22:11 +00:00
Christopher Haster 44e2ca44a8 littlefs: Fix block addr overflow
deepikabhavnani did the hard work in tracking this issue down.  Block
addresses are not cast to the correct type until after multiplying to
convert to byte addresses. This results in an overflow when the storage
is larger than 4 GB.
2018-01-12 14:44:44 -06:00
deepikabhavnani c86d757267 Fix: Sector/Size overflow from uint32_t
FATFilesystem declares sector count and size as uint32_t and block
device class arguments are addr and size which is uint64_t
While passing arguments to program/read/write API's of block device,
multiplication of uint32_t*uint32_t was not typecasted properly to
uint64_t which resulted in MSB truncation.

Eg. If block 0x800000 is accessed with block size 0x200, addr to be
passed (0x800000*0x200)0x100000000, but actual address passed was 0x0
which resulted in over-writting the root directory, and hence corrupted
filesystem
2018-01-12 11:12:34 -06:00
Christopher Haster 5df2b9b0e7 littlefs: Fixed file truncation without writes
In the open call, the LFS_O_TRUNC flag was correctly zeroing the file, but
it wasn't actually writing the change out to disk. This went unnoticed because
in the cases where the truncate was followed by a file write, the
updated contents would be written out correctly.

Marking the file as dirty if the file isn't already truncated fixes the
problem with the least impact. Also added better test cases around
truncating files.
2018-01-11 16:27:33 -06:00
Cruz Monrreal c0c501c70f
Merge pull request #5768 from deepikabhavnani/storage_stats
Added statvfs API to get storage statistics
2018-01-11 10:25:41 -06:00
Christopher Haster d82d9888d4 Added COMMON folder for tests
A COMMON folder allows code reuse across different test cases. This
avoids code duplication or code enterying the application space.

The COMMON folder is uppercase to match naming conventions in Mbed OS.
2018-01-09 16:11:14 -06:00
Christopher Haster 5e7c0976fa littlefs: Fixed issue with immediate exhaustion and small unaligned storage
This was a small hole in the logic that handles initializing the
lookahead buffer. To imitate exhaustion (so the block allocator
will trigger a scan), the lookahead buffer is rewound a full
lookahead and set up to look like it is exhausted. However,
unlike normal allocation, this rewind was not kept aligned to
a multiple of the scan size, which is limited by both the
lookahead buffer and the total storage size.

This bug went unnoticed for so long because it only causes
problems when the block device is both:
1. Not aligned to the lookahead buffer (not a power of 2)
2. Smaller than the lookahead buffer

While this seems like a strange corner case for a block device,
this turned out to be very common for internal flash, especially
when a handleful of blocks are reserved for code.
2018-01-04 09:49:13 -06:00
Christopher Haster ffc857ddc9 littlefs: Fixed positive seek bounds checking
This bug was a result of an annoying corner case around intermingling
signed and unsigned offsets. The boundary check that prevents seeking
a file to a position before the file was preventing valid seeks with
positive offsets.

This corner case is a bit more complicated than it looks because the
offset is signed, while the size of the file is unsigned. Simply
casting both to signed or unsigned offsets won't handle large files.
2018-01-03 18:07:17 -06:00
Christopher Haster 9dd3060d60 Added littlefs statvfs implementation 2018-01-03 12:54:28 -06:00