{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":83160811,"defaultBranch":"master","name":"littlefs","ownerLogin":"littlefs-project","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2017-02-25T20:33:13.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/60944974?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1719349589.0","currentOid":""},"activityList":{"items":[{"before":"f47ddc45d1a29144c2e9ddea6b87b055df95920a","after":"ac207586bae9d086ccaa8ff71fc90509fa4f54bc","ref":"refs/heads/fix-trace-format-again","pushedAt":"2024-06-25T21:08:21.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Fixed some more LFS_TRACE format specifiers\n\n- block_cycles is signed and should use PRId32\n- flags is signed (which is a bit weird) and should be cast for %x\n\nUnfortunately exactly what PRI* expands to is dependant on both the\ncompiler and the underlying architecture, so I don't think it's possible\nfor us to catch these mistakes with CI...\n\nFound by stefano-zanotti","shortMessageHtmlLink":"Fixed some more LFS_TRACE format specifiers"}},{"before":null,"after":"f47ddc45d1a29144c2e9ddea6b87b055df95920a","ref":"refs/heads/fix-trace-format-again","pushedAt":"2024-06-25T21:06:29.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Fixed some more LFS_TRACE format specifiers\n\n- block_cycles is signed and should use PRId32\n- flags is signed (which is a bit weird) and should be cast for %x\n\nUnfortunately exactly what PRI* expands to is dependant on both the\ncompiler and the underlying architecture, so it's not really possible\nfor us to catch these mistakes with CI...\n\nFound by stefano-zanotti","shortMessageHtmlLink":"Fixed some more LFS_TRACE format specifiers"}},{"before":"2f1d7119022b4fe02a16fdb4c1fc6c06ce6c507e","after":"ff0271ecbe3257770f4cfb3fb5df7e312f0924b5","ref":"refs/heads/rbyd","pushedAt":"2024-06-24T05:29:56.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"t: Renamed LFS_T_CKDATA -> LFS_T_CK, implies LFS_T_CKMETA\n\nIt really doesn't make sense to check data and not check metadata. We're\nalready traversing the metadata, so validating it adds very little\noverhead, and how can we trust our data if we can't trust our metadata?\n\nThis renames LFS_T_CKDATA -> LFS_T_CK, which now also implies\nLFS_T_CKMETA. This implication is done explicitly in lfsr_mtree_traverse\ninstead of doing anything fancy with flags.\n\nImplying LFS_T_CKMETA also means one less configuration to support.\n\nCode changes:\n\n code stack\n before: 34524 2640\n after: 34528 (+0.0%) 2640 (+0.0%)","shortMessageHtmlLink":"t: Renamed LFS_T_CKDATA -> LFS_T_CK, implies LFS_T_CKMETA"}},{"before":"898f916778ef727c747ed26c49de4e8ee2bd78b8","after":"2f1d7119022b4fe02a16fdb4c1fc6c06ce6c507e","ref":"refs/heads/rbyd","pushedAt":"2024-06-24T04:49:00.000Z","pushType":"push","commitsCount":58,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"t: Changed lfsr_mtree_traverse to operate on mdir+mtraversal\n\nSeparated out omdir/mdir and mtraversal. You still need to allocate an\nmdir for mtraversal to work, but this avoids the extra cost of omdir's\nlinked-list.\n\nTo avoid _too_ many pointers, I duplicated the flags field into both\nlfsr_traversal_t and lfsr_mtraversal_t. This is basically free since we\nend up with a bunch of padding for mtraversal's state field, but comes\nwith the risk of getting confused when the two flag fields don't match\nin the future.\n\nI also merged the intermediary btype field into flags to avoid yet\nanother single-byte field, where it fits comfortably in 3-bits.\n\nNote that the mdir can be uninitialized in cases where we don't need to\nworry about traversal clobbering.\n\n---\n\nThis has the same problems as separating out mdirs/bshrubs in bshrub\nfunctions: more stack/code to move the multiple pointers around, but is\nnecessary to avoid strict aliasing issues. There's no way to represent\noverlapping omdir/mdir/mtraversal struct in standard C99 otherwise.\n\nThe end result saves a bit of code, but adds a bit of stack:\n\n code stack\n before: 34576 2632\n after: 34524 (-0.2%) 2640 (+0.3%)\n\nThough these numbers may be close enough to the compiler noise floor to\nnot really care about...","shortMessageHtmlLink":"t: Changed lfsr_mtree_traverse to operate on mdir+mtraversal"}},{"before":"9914897e39d02731af2a973907f4e23a7eb64b1d","after":"898f916778ef727c747ed26c49de4e8ee2bd78b8","ref":"refs/heads/rbyd","pushedAt":"2024-06-08T00:43:55.000Z","pushType":"push","commitsCount":14,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Fixed pl hole in perturb logic\n\nTurns out there's very _very_ small powerloss hole in our current\nperturb logic.\n\nWe rely on tag valid bits to validate perturb bits, but these\nintentionally don't end up in the commit checksum. This means there will\nalways be a powerloss hole when we write the last valid bit. If we lose\npower after writing that bit, suddenly the remaining commit and any\nfollowing commits may appear as valid.\n\nNow, this is really unlikely considering we need to lose power exactly\nwhen we write the cksum tag's valid bit, and our nonce helps protect\nagainst this. But a hole is a hole.\n\nThe solution here is to include the _current_ perturb bit (q) in the\ncommit's cksum tag, alongside the _next_ perturb bit (p). This will be\nincluded in the commit's checksum, but _not_ in the canonical checksum,\nallowing the commit's checksum validate the current perturb state\nwithout ruining our erased-state agnostic checksums:\n\n .---+---+---+---. . . .---+---+---+---. \\ \\ \\ \\\n |v| tag | |v| tag | | | | |\n +---+---+---+---+ +---+---+---+---+ | | | |\n | commit | | commit | | | | |\n | | | | +-. | | |\n +---+---+---+---+ +---+---+---+---+ / | | | |\n |v|qp-------------. |v|qp| tag | | . . .\n +---+---+---+---+ | +---+---+---+---+ | . . .\n | cksum | | | cksum | | . . .\n +---+---+---+---+ | +---+---+---+---+ | . . .\n | padding | | | padding | | . . .\n | | | | | | . . .\n +---+---+---+---+ | . +---+---+---+---+ | | | |\n | erased | +-> |v------------------' | | |\n | | | +---+---+---+---+ | | |\n . . | | commit | +-. | +- rbyd\n . . | |.----------------. | | | | cksum\n | +| -+---+---+---+ | / | +-. /\n +-> |v|qp| tag | '-----' | |\n | +- ^ ---+---+---+ / |\n '------' cksum ----------------'\n +---+---+---+---+\n | padding |\n | |\n +---+---+---+---+\n | erased |\n | |\n . .\n . .\n\n(Ok maybe this diagram needs work...)\n\nThis adds another thing that needs to be checked during rbyd fetch, and\nnote, we _do_ need to explicitly check this, but it solves the problem.\nIf power is loss after v, q would be invalid, and if power is lost after\nq, our cksum would be invalid.\n\nNote this would have also been an issue for the previous cksum + parity\nperturb scheme.\n\nCode changes:\n\n code stack\n before: 33570 2592\n after: 33598 (+0.1%) 2592 (+0.0%)","shortMessageHtmlLink":"Fixed pl hole in perturb logic"}},{"before":"ba9842ed4086769e9bcbe41414fb78bcdd26632b","after":"9914897e39d02731af2a973907f4e23a7eb64b1d","ref":"refs/heads/rbyd","pushedAt":"2024-06-01T08:46:38.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Locked down out-of-order writes, more tests\n\nThe main test additions are the test_powerloss tests, intended to be\nhigh-level tests over difficult/weird powerloss environments (such as\nout-of-order writes!):\n\n- test_powerloss_dir_many - 2242 pls\n- test_powerloss_file_many - 8856 pls\n- test_powerloss_file_pl_fuzz - 384508 pls\n- test_powerloss_filedir_pl_fuzz - 268339 pls\n\nBut there was also a bunch of other test movement in the late-stage/\nhigh-level tests. I'm trying to keep the core of these tests somewhat\nconsistent so we have a nice template to extend for future testing, in\ncase we want to test other environmentalish concerns, but not all of\nthese tests make sense in all of these contexts:\n\n badblocks powerloss relocations exhaustion\n dir_many y y y\n dir_fuzz y y y\n file_many y y y\n file_fuzz y y y\n fwrite_fuzz y y\n orphanzombie_fuzz y y y\n orphanzombiedir_fuzz y y y\n file_pl_fuzz y y\n filedir_pl_fuzz y y\n\nWhy not:\n\n- dir/file_many+exhaustion? - Needs to be unbounded\n- dir/file_fuzz+powerloss? - Takes O(n^2)\n- fwrite_fuzz+powerloss? - Takes O(n^2)\n- fwrite_fuzz+relocations? - Doesn't really test anything\n- orphanzombie*_fuzz+powerloss? - Powerloss kills zombies\n- file*_pl_fuzz+badblocks? - PL + Badblocks currently incompactible\n- file*_pl_fuzz+exhaustion? - PL + Badblocks currently incompactible\n\n---\n\nOf course, in order to actually get out-of-order write testing working,\nwe need to implement out-of-order write syncing.\n\nFortunately this was a simple exercise in placing lfsr_bd_sync calls\nbefore any mdir commits where we may have unsynced data:\n\n- in lfsr_file_sync, to sync any pending file data\n- in lfsr_mdir_commit, to sync any mroot/mtree changes\n\nWe also call lfsr_bd_sync _after_ mdir commits in case users expect to\nsequence any filesystem-external operations such as network, UI, etc. In\ntheory this could be optional, but no users have really requested it\nyet, so leave that for a potential future improvement:\n\n- in lfsr_mdir_commit\n- in lfsr_formatinited (really just because we don't go through\n lfsr_mdir_commit)\n\nNote that lfsr_rbyd_commit has been relaxed in the scheme. It only\nflushes caches, and does _not_ call lfsr_bd_sync. This is useful for\nallowing multiple B-tree nodes to be written out-of-order, also long as\nthe whole thing is synchronized before any mdir commit.\n\nAll of these lfsr_bd_sync calls add a bit of code, but not really an\namount to care about:\n\n code stack\n before: 33678 2600\n after: 33766 (+0.3%) 2600 (+0.0%)","shortMessageHtmlLink":"Locked down out-of-order writes, more tests"}},{"before":"1ecb346cecf5d3e9233963e7e52c400ff4ec6381","after":"ba9842ed4086769e9bcbe41414fb78bcdd26632b","ref":"refs/heads/rbyd","pushedAt":"2024-05-31T23:21:21.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Locked down out-of-order writes, more tests\n\nThe main test additions are the test_powerloss tests, intended to be\nhigh-level tests over difficult/weird powerloss environments (such as\nout-of-order writes!):\n\n- test_powerloss_dir_many - 2242 pls\n- test_powerloss_file_many - 8856 pls\n- test_powerloss_file_pl_fuzz - 384508 pls\n- test_powerloss_filedir_pl_fuzz - 268339 pls\n\nBut there was also a bunch of other test movement in the late-stage/\nhigh-level tests. I'm trying to keep the core of these tests somewhat\nconsistent so we have a nice template to extend for future testing, in\ncase we want to test other environmentalish concerns, but not all of\nthese tests make sense in all of these contexts:\n\n badblocks powerloss relocations exhaustion\n dir_many y y y\n dir_fuzz y y y\n file_many y y y\n file_fuzz y y y\n fwrite_fuzz y y\n orphanzombie_fuzz y y y\n orphanzombiedir_fuzz y y y\n file_pl_fuzz y y\n filedir_pl_fuzz y y\n\nWhy not:\n\n- dir/file_many+exhaustion? - Needs to be unbounded\n- dir/file_fuzz+powerloss? - Takes O(n^2)\n- fwrite_fuzz+powerloss? - Takes O(n^2)\n- fwrite_fuzz+relocations? - Doesn't really test anything\n- orphanzombie*_fuzz+powerloss? - Powerloss kills zombies\n- file*_pl_fuzz+badblocks? - PL + Badblocks currently incompactible\n- file*_pl_fuzz+exhaustion? - PL + Badblocks currently incompactible\n\n---\n\nOf course, in order to actually get out-of-order write testing working,\nwe need to implement out-of-order write syncing.\n\nFortunately this was a simple exercise in placing lfsr_bd_sync calls\nbefore any mdir commits where we may have unsynced data:\n\n- in lfsr_file_sync, to sync any pending file data\n- in lfsr_mdir_commit, to sync any mroot/mtree changes\n\nWe also call lfsr_bd_sync _after_ mdir commits in case users expect to\nsequence any filesystem-external operations such as network, UI, etc. In\ntheory this could be optional, but no users have really requested it\nyet, so leave that for a potential future improvement:\n\n- in lfsr_mdir_commit\n- in lfsr_formatinited (really just because we don't go through\n lfsr_mdir_commit)\n\nNote that lfsr_rbyd_commit has been relaxed in the scheme. It only\nflushes caches, and does _not_ call lfsr_bd_sync. This is useful for\nallowing multiple B-tree nodes to be written out-of-order, also long as\nthe whole thing is synchronized before any mdir commit.\n\nAll of these lfsr_bd_sync calls add a bit of code, but not really an\namount to care about:\n\n code stack\n before: 33678 2600\n after: 33766 (+0.3%) 2600 (+0.0%)","shortMessageHtmlLink":"Locked down out-of-order writes, more tests"}},{"before":"0802115717f176ca42995f3c7c2a0e54281a7190","after":"1ecb346cecf5d3e9233963e7e52c400ff4ec6381","ref":"refs/heads/rbyd","pushedAt":"2024-05-30T16:54:00.000Z","pushType":"push","commitsCount":35,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Renamed fbuffer_size -> file_buffer_size","shortMessageHtmlLink":"Renamed fbuffer_size -> file_buffer_size"}},{"before":"b9543e34949adeca2318a332a3e87fc7b12b1d62","after":"0802115717f176ca42995f3c7c2a0e54281a7190","ref":"refs/heads/rbyd","pushedAt":"2024-05-23T00:14:42.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Tweaked lfsr_format to use 0x00216968 for initial revision count\n\nThe main reason is just to avoid using 0x00000000 as the initial\nrevision count. The is currently the default for B-tree rbyds, and\naccidentally writing a B-tree rbyd to an mroot block is both easy\n(misconfigured block_count) and something we really want to notice when\ndebugging.\n\nFortunately we can still keep our sequence comparison test (0 > -1) by\nonly setting the top-bits. Though we still need to zero the recycle\ncounter to avoid premature mroot extension, so this magic number may not\nstay intact depending on configuration.\n\nThis does add a bit of code, probably to load the magic number from\nThumb's constant pools, but I think it's worth it:\n\n code stack\n before: 33430 2640\n after: 33458 (+0.1%) 2640 (+0.0%)","shortMessageHtmlLink":"Tweaked lfsr_format to use 0x00216968 for initial revision count"}},{"before":"d16f99d245e9de8b149dc359707318a8ac7a4b40","after":"b9543e34949adeca2318a332a3e87fc7b12b1d62","ref":"refs/heads/rbyd","pushedAt":"2024-05-22T22:29:40.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Fixed parse errors in prettyasserts.py caused by ternary operators\n\nBecause of course ternary operators would cause problems.\n\nThe two problem:\n\n LFS_ASSERT((exists) ? !err : err == LFS_ERR_NOENT);\n lfsr_file_sync(&lfs, &file) => (zombie) ? 0 : LFS_ERR_NOENT;\n\nWe could work around these with parentheses, but with different assert\nparsers floating around this issue is likely to crop up again in the\nfuture.\n\nFortunately this just required separate \"sep\" vs \"term\" rules and a bit\nmore strict parsing.","shortMessageHtmlLink":"Fixed parse errors in prettyasserts.py caused by ternary operators"}},{"before":"27d4b7adc96bcae307cd04186334c618f5883e7d","after":"d16f99d245e9de8b149dc359707318a8ac7a4b40","ref":"refs/heads/rbyd","pushedAt":"2024-05-21T02:00:19.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Extended prettyasserts.py to support prefixed memcmp/strcmp\n\nThe move to lfs_memcmp/lfs_strcmp highlighted an interesting hole in\nprettyasserts.py: the lack of support for custom memcmp/strcmp symbols.\n\nRather than just adding more flags for an increasing number of symbols,\nI've added -p/--prefix and -P/--prefix-insensitive to generate relevant\nsymbols based on a prefix. In littlefs's case, we use -Plfs_, which\nmatches both lfs_memcmp and LFS_ASSERT (and LFS_MEMCMP and lfs_assert\nbut ignore those):\n\n $ ./scripts/prettyasserts.py -Plfs_ lfs.t.c -o lfs.t.a.c\n\nDon't worry, you can still provide explicit symbols, but only via\nlong-form flags. This gets a bit noisy:\n\n $ ./scripts/prettyasserts.py \\\n --assert=LFS_ASSERT \\\n --unreachable=LFS_UNREACHABLE \\\n --memcmp=lfs_memcmp \\\n --strcmp=lfs_strcmp \\\n lfs.t.c -o lfs.t.a.c\n\nThis commit also finally gives the prettyasserts.py's symbols actual\nword boundaries, instead of the big error-prone hack of sorting by size.","shortMessageHtmlLink":"Extended prettyasserts.py to support prefixed memcmp/strcmp"}},{"before":"f3dd7772a3cc03ef9c09c9c9a74e2f561b734e61","after":"27d4b7adc96bcae307cd04186334c618f5883e7d","ref":"refs/heads/rbyd","pushedAt":"2024-05-13T20:24:09.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Renamed internal script result types * -> R*\n\nSo Int -> RInt, Frac -> RFrac, etc. This just helps distinguish these\ntypes from builtin types, which could be confusing.","shortMessageHtmlLink":"Renamed internal script result types * -> R*"}},{"before":"a9e3cad90a35de748fac69c6779a440a544a33a9","after":"f3dd7772a3cc03ef9c09c9c9a74e2f561b734e61","ref":"refs/heads/rbyd","pushedAt":"2024-05-13T07:49:14.000Z","pushType":"push","commitsCount":6,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"In scripts -d/--diff, show either all percentages or none\n\nPreviously, with -d/--diff, we would only show non-zero percentages. But\nthis was ambiguous/confusing when dealing with multiple results\n(stack.py, summary.py, etc).\n\nTo help with this, I've switched to showing all percentages unless all\npercentages are zero (no change). This matches the -d/--diff row-hiding\nlogic, so by default all rows should show all percentages.\n\nNote -p/--percent did not change, as it already showed all percentages\nall of the time.","shortMessageHtmlLink":"In scripts -d/--diff, show either all percentages or none"}},{"before":"09ea4eab062a0419083145742ffe786e1b2f0b9a","after":"a9e3cad90a35de748fac69c6779a440a544a33a9","ref":"refs/heads/rbyd","pushedAt":"2024-05-11T04:47:17.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Adopted explicit buffers for low/mid-level attrs\n\nIt's really frustrating that it's impossible to create an uninitialized\nexpression with the scope of a compound-literal...\n\n(I'm going to ignore that this is technically possible with alloca.)\n\nThe lack of uninitialized compound-literals forces each of our attribute\nlists to make a decision: 1. Use an implicit buffer and pay for\nzero-initialization? or 2. Use an explicit buffer, adding code noising\nand risking out-of-date buffer sizes.\n\nAs a compromise, this commit adopts explicit buffers in most of the\nlow/mid-level layers. Where the code is already pretty noisy, but also\nheavily scrutinized and iterated over to reduce code/stack costs. This\nleaves the high-level layers with the hopefully safer and more readable\nimplicit buffers.\n\nYou can see this zero initializing has a surprisingly high code cost,\nfor what is otherwise a noop:\n\n code stack\n before: 33828 2632\n after: 33656 (-0.5%) 2632 (+0.0%)","shortMessageHtmlLink":"Adopted explicit buffers for low/mid-level attrs"}},{"before":"69ad112f2db81c3000bdf3b9a6cc4640bc49766d","after":"09ea4eab062a0419083145742ffe786e1b2f0b9a","ref":"refs/heads/rbyd","pushedAt":"2024-05-06T07:01:05.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Crammed LFSR_CAT_NAME to reuse the wasted word in the name lfsr_data_t\n\nOne annoying thing about lfsr_data_t is when representing in-RAM\nbuffers, the last word of the struct goes completely unused. This\ncommit attempts to save this word of RAM in file names by forcibly\n(hackily?) truncating the name's lfsr_data_t:\n\n .---+---+---+---. . . . . .---+---+---+---. . . . . .---+---+---+---.\n |0| did_size | |0| did_size | | did_data |\n +---+---+---+---+ +---+---+---+---+ | |\n | did_ptr ------. | did_ptr ------. | |\n +---+---+---+---+ | +---+---+---+---+ | | |\n | (unused) | | | (unused) | | | |\n +---+---+---+---+ . | . . +---+---+---+---+ . | . . +---+---+---+---+\n |0| name_size | | |0| name_size | | | name_size |\n +---+---+---+---+ | +---+---+---+---+ | | |\n | name_ptr | | | name_ptr | | | |\n +---+---+---+---+ | +---+---+---+---+ | | |\n | (unused) | | | did | <-' | |\n +---+---+---+---+ . | . . | | . . . . '---+---+---+---'\n | did | <-' '---+---+---+---'\n | |\n '---+---+---+---'\n\nCuriously, this didn't seem to save RAM but saved a bit of code cost?\n\nI guess this is because 1. file names, despite being very common, don't\noccur on the stack hot-path that starts at lfsr_file_sync, and 2. while\nwe don't save stack cost, sometimes the reduced stack pressure can\nreduce stack manipulation instructions:\n\n code stack\n before: 33728 2776\n after: 33672 (-0.2%) 2776 (+0.0%)\n\nIf we look at the per-function stack cost, we can see the expected minor\nstack savings in most functions, albeit outside of the stack hot-path:\n\n function oframe olimit nframe nlimit dframe dlimit\n lfsr_file_open 16 2040 16 2032 +0 -8 (+0.0%, -0.4%)\n lfsr_rename 240 2128 232 2120 -8 -8 (-3.3%, -0.4%)\n lfsr_remove 176 2064 168 2056 -8 -8 (-4.5%, -0.4%)\n lfsr_file_opencfg 136 2024 128 2016 -8 -8 (-5.9%, -0.4%)","shortMessageHtmlLink":"Crammed LFSR_CAT_NAME to reuse the wasted word in the name lfsr_data_t"}},{"before":"210375e3a376c0a5b246e44dcf4d080fc881be37","after":"69ad112f2db81c3000bdf3b9a6cc4640bc49766d","ref":"refs/heads/rbyd","pushedAt":"2024-05-01T21:46:24.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Enabled erase=noop in test_rbyd, changed read* to error on leb128 overflow\n\nNow that reproducibility issues with erase_value=-1 (erase=noop) are\nfixed, this much more useful to test than erase_value=0x1b. Especially\nsince erase=noop is filled with so many sharp corners.\n\nThese tests already found that we were being too confident with our\nleb128/lleb128/tag parsing. Since we need to partially parse unfinished/\nold commits, lfsr_dir_read* can easily encounter invalid leb128s during\nnormal operation. If this happens we should not assert.\n\nDoing things correctly has a bit of a cost:\n\n code stack\n before: 33928 2840\n after: 33976 (+0.1%) 2840 (+0.0%)\n\nAt least we haven't seen any issues with our valid bit invalidating\nlogic yet.","shortMessageHtmlLink":"Enabled erase=noop in test_rbyd, changed read* to error on leb128 ove…"}},{"before":"d0b248791f7d44133b695c0e8aef7cf79847b987","after":"0e09a8a5f4c752a025f333d9c17270557f28acab","ref":"refs/heads/v2-prefix","pushedAt":"2024-04-29T22:00:13.000Z","pushType":"push","commitsCount":9,"pusher":{"login":"geky-bot","name":null,"path":"/geky-bot","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/35985906?s=80&v=4"},"commit":{"message":"Generated v2 prefixes","shortMessageHtmlLink":"Generated v2 prefixes"}},{"before":"68d28b5114467c897fa3b4d44056f6971626de7c","after":"d01280e64934a09ba16cac60cf9d3a37e228bb66","ref":"refs/heads/v2","pushedAt":"2024-04-29T22:00:13.000Z","pushType":"push","commitsCount":8,"pusher":{"login":"geky-bot","name":null,"path":"/geky-bot","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/35985906?s=80&v=4"},"commit":{"message":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb\n\nAdd links to pico-littlefs-usb (FAT12 emulation) and mklittlefs","shortMessageHtmlLink":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb"}},{"before":"344d004940a5136c5d5f9e9351ba2701ec90476c","after":null,"ref":"refs/tags/v2.9.3","pushedAt":"2024-04-29T21:35:29.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"}},{"before":"344d004940a5136c5d5f9e9351ba2701ec90476c","after":"d01280e64934a09ba16cac60cf9d3a37e228bb66","ref":"refs/heads/master","pushedAt":"2024-04-29T21:33:51.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb\n\nAdd links to pico-littlefs-usb (FAT12 emulation) and mklittlefs","shortMessageHtmlLink":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb"}},{"before":"344d004940a5136c5d5f9e9351ba2701ec90476c","after":"68d28b5114467c897fa3b4d44056f6971626de7c","ref":"refs/heads/v2","pushedAt":"2024-04-29T21:27:58.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Merge pull request #966 from BrianPugh/fix-divide-by-zero-full-filesystem\n\nFix DivideByZero exception when filesystem is completely full.","shortMessageHtmlLink":"Merge pull request #966 from BrianPugh/fix-divide-by-zero-full-filesy…"}},{"before":"2140918d65e6ded8754e23f3375cb742c8933a78","after":"d0b248791f7d44133b695c0e8aef7cf79847b987","ref":"refs/heads/v2-prefix","pushedAt":"2024-04-29T21:26:11.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Generated v2 prefixes","shortMessageHtmlLink":"Generated v2 prefixes"}},{"before":"f585925aeb36d706f6cbe9b696045136f9a0587c","after":null,"ref":"refs/heads/revert-967-ci-release-draft-only","pushedAt":"2024-04-29T21:22:55.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"}},{"before":"344d004940a5136c5d5f9e9351ba2701ec90476c","after":"d01280e64934a09ba16cac60cf9d3a37e228bb66","ref":"refs/heads/devel","pushedAt":"2024-04-29T21:22:37.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb\n\nAdd links to pico-littlefs-usb (FAT12 emulation) and mklittlefs","shortMessageHtmlLink":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb"}},{"before":null,"after":"f585925aeb36d706f6cbe9b696045136f9a0587c","ref":"refs/heads/revert-967-ci-release-draft-only","pushedAt":"2024-04-29T21:14:20.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Revert \"Limit release script to only draft releases\"","shortMessageHtmlLink":"Revert \"Limit release script to only draft releases\""}},{"before":"d0b248791f7d44133b695c0e8aef7cf79847b987","after":"2140918d65e6ded8754e23f3375cb742c8933a78","ref":"refs/heads/v2-prefix","pushedAt":"2024-04-29T20:00:45.000Z","pushType":"push","commitsCount":11,"pusher":{"login":"geky-bot","name":null,"path":"/geky-bot","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/35985906?s=80&v=4"},"commit":{"message":"Generated v2 prefixes","shortMessageHtmlLink":"Generated v2 prefixes"}},{"before":"68d28b5114467c897fa3b4d44056f6971626de7c","after":"344d004940a5136c5d5f9e9351ba2701ec90476c","ref":"refs/heads/v2","pushedAt":"2024-04-29T20:00:45.000Z","pushType":"push","commitsCount":10,"pusher":{"login":"geky-bot","name":null,"path":"/geky-bot","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/35985906?s=80&v=4"},"commit":{"message":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb\n\nAdd links to pico-littlefs-usb (FAT12 emulation) and mklittlefs","shortMessageHtmlLink":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb"}},{"before":"68d28b5114467c897fa3b4d44056f6971626de7c","after":"344d004940a5136c5d5f9e9351ba2701ec90476c","ref":"refs/heads/master","pushedAt":"2024-04-29T19:29:18.000Z","pushType":"push","commitsCount":10,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb\n\nAdd links to pico-littlefs-usb (FAT12 emulation) and mklittlefs","shortMessageHtmlLink":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb"}},{"before":"9a9d74e477624dffa732f5fff8bcd704e24ef242","after":"344d004940a5136c5d5f9e9351ba2701ec90476c","ref":"refs/heads/devel","pushedAt":"2024-04-29T19:27:01.000Z","pushType":"pr_merge","commitsCount":4,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb\n\nAdd links to pico-littlefs-usb (FAT12 emulation) and mklittlefs","shortMessageHtmlLink":"Merge pull request #968 from littlefs-project/link-pico-littlefs-usb"}},{"before":"6e52140d5171f98b30654396d3927ca63ef74034","after":"9a9d74e477624dffa732f5fff8bcd704e24ef242","ref":"refs/heads/devel","pushedAt":"2024-04-29T19:26:49.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"geky","name":"Christopher Haster","path":"/geky","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1075160?s=80&v=4"},"commit":{"message":"Merge pull request #967 from littlefs-project/ci-release-draft-only\n\nLimit release script to only draft releases","shortMessageHtmlLink":"Merge pull request #967 from littlefs-project/ci-release-draft-only"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEbxIMsQA","startCursor":null,"endCursor":null}},"title":"Activity · littlefs-project/littlefs"}