)]}'
{
  "log": [
    {
      "commit": "6cb4e86540eca0d9ba62500a298385c9d863c8be",
      "tree": "9079d55ac294f6b66c58147a215ea73779431cef",
      "parents": [
        "d3375f1cef27a424c00c15bdb8578da98ad7371d",
        "488e84bb538c20a62b2976e9d631f81bf3fc51ec"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Mar 24 17:26:24 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 17:26:24 2026 -0500"
      },
      "message": "Merge pull request #1194 from littlefs-project/fix-multi-whandle-corruption\n\nFixed data corruption with multiple write handles"
    },
    {
      "commit": "d3375f1cef27a424c00c15bdb8578da98ad7371d",
      "tree": "1f2417f0575d876accbb9e8ae40b591c80bf6c36",
      "parents": [
        "24d23dda83904b46db17b4380abeda38e24df8e2",
        "fd5e7f62538d727653a50178dbd578bb33ac0ab6"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Mar 24 17:26:08 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 17:26:08 2026 -0500"
      },
      "message": "Merge pull request #1180 from ChaserTlss/master\n\n lfs: guard null callbacks in lfs_dir_fetchmatch"
    },
    {
      "commit": "24d23dda83904b46db17b4380abeda38e24df8e2",
      "tree": "52031ddea2fb87ae1dd8b00fc2b365c1db1f1d75",
      "parents": [
        "58eaa9836ea2175770ea0305666347eeca3b73ad",
        "74f32c83ac58dfa89afce84f44044e9f9f1078c3"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Mar 24 17:25:53 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 17:25:53 2026 -0500"
      },
      "message": "Merge pull request #1172 from ThaChoppahIsLookinSharp/fix/emu-block-readme\n\nFix broken link on README.md for emu device"
    },
    {
      "commit": "58eaa9836ea2175770ea0305666347eeca3b73ad",
      "tree": "09c6b25f28aef1ddb36c56d0746d14de7d7e2bc6",
      "parents": [
        "87d5f61d3e2508eab67e5011a47d3718bcf38872",
        "dbe96d0326166331dcee9ff15b3b1b935ce44a02"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Mar 24 17:25:43 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 17:25:43 2026 -0500"
      },
      "message": "Merge pull request #1161 from amubiera/size-t-warnings\n\nFixes for \u0027Implicit conversion loses integer precision\u0027 warnings."
    },
    {
      "commit": "87d5f61d3e2508eab67e5011a47d3718bcf38872",
      "tree": "7f1fcdf308fe5572ab74ae91c51cc3ceffa4f0ff",
      "parents": [
        "adad0fbbcf5382c20978d07f94f9c13be9041c1b",
        "b062c88a08869399773dae8f4aa6c24bff4737cd"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Mar 24 17:25:31 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 17:25:31 2026 -0500"
      },
      "message": "Merge pull request #1156 from amgross/minor_typo\n\nFix comment typo and -\u003e an"
    },
    {
      "commit": "488e84bb538c20a62b2976e9d631f81bf3fc51ec",
      "tree": "b7631b9e52633fc54446b16a82770f2eee67911e",
      "parents": [
        "adad0fbbcf5382c20978d07f94f9c13be9041c1b"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Mar 09 17:59:58 2026 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Mar 09 19:13:43 2026 -0500"
      },
      "message": "Fixed data corruption with multiple write handles\n\nMultiple write handles in littlefs has always been a bit confusing\n(hopefully improving in littlefs3), but I didn\u0027t realize it could lead\nto corrupted data.\n\nThe problem, as noted by Ictogan1, is that syncs to related file handles\nignores the LFS_F_DIRTY flag. If you open a file twice, and write to one\nhandle, littlefs doesn\u0027t realize the other handle it out-of-date.\n\nThis may not seem like a problem, but then littlefs is happy to\nreallocate those (still referenced) blocks, leading to data corruption:\n\n  open(a, \"quiche.txt\")\n  write(a)\n  sync(a) // syncs a\u0027s contents\n  open(b, \"quiche.txt\")\n  truncate(b)\n  sync(b) // syncs b\u0027s contents\n  write(b) // may allocate from a\n  rewind(a)\n  read(a) // potentially corrupted\n\n---\n\nWhat we want is to set LFS_F_DIRTY in all other file handles during\nlfs_file_sync, but doing so would force those file handles to sync\nduring close. That would be even more confusing (not to mention\nbackwards incompatible).\n\nIn theory setting both LFS_F_DIRTY + LFS_F_ERRED could work, but that\nwould prevent implicit syncs of writes that haven\u0027t actually errored:\n\n  open(a, \"quiche.txt\")\n  write(a)\n  open(b, \"quiche.txt\")\n  write(b)\n  close(b) // syncs b\u0027s contents\n  close(a) // should sync a\u0027s contents\n\nSo, instead, as a somewhat clunky workaround, a new flag: LFS_F_DUSTY,\nwhich indicates a file does not match storage, but should not be synced\nduring close.\n\n---\n\nIt\u0027s worth noting this is already fixed in littlefs3, which includes a\nmore rigorous, and hopefully easier to use sync model. But in the\nmeantime, this should at least prevent the loss of data.\n\nAdded test_alloc_multihandle and test_alloc_multihandle_reuse to prevent\na regression, test_alloc_multihandle_reuse does reproduce the bug.\n\nFound and reproduced by Ictogan1\n"
    },
    {
      "commit": "fd5e7f62538d727653a50178dbd578bb33ac0ab6",
      "tree": "50f29a3d6cb43604c85e7809ecb745ff44c951a2",
      "parents": [
        "2311cd785ae875965a77d848d3f6ee29258fa0fe"
      ],
      "author": {
        "name": "daimiao chen",
        "email": "daniel-daimiao-chen@outlook.com",
        "time": "Thu Mar 05 16:56:03 2026 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Mar 09 19:09:15 2026 -0500"
      },
      "message": "Using LFS_ASSERT instead of an runtime check.\n\nRemove NULL check from condition and assert callback is valid.\n"
    },
    {
      "commit": "2311cd785ae875965a77d848d3f6ee29258fa0fe",
      "tree": "5d95759b5c4519687096d99449819c5045e3e198",
      "parents": [
        "adad0fbbcf5382c20978d07f94f9c13be9041c1b"
      ],
      "author": {
        "name": "Daimiao Chen",
        "email": "daimiao.chen@accuenergy.com",
        "time": "Thu Jan 22 11:04:59 2026 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Mar 09 19:09:06 2026 -0500"
      },
      "message": "Guard null callbacks in lfs_dir_fetchmatch\n\nlfs_dir_fetch relies on an impossible tag match to avoid calling a\nNULL callback. Add an explicit cb !\u003d NULL check in the match path\nso future refactors don’t risk a NULL function-pointer call.\n"
    },
    {
      "commit": "74f32c83ac58dfa89afce84f44044e9f9f1078c3",
      "tree": "ad5cf6258acbe9a6c9d7ea560b5ce890d86a9b5a",
      "parents": [
        "adad0fbbcf5382c20978d07f94f9c13be9041c1b"
      ],
      "author": {
        "name": "Daniel Lamana",
        "email": "daniel.lamana@semidynamics.com",
        "time": "Tue Nov 25 12:07:09 2025 +0100"
      },
      "committer": {
        "name": "Daniel Lamana",
        "email": "daniel.lamana@semidynamics.com",
        "time": "Tue Nov 25 12:07:09 2025 +0100"
      },
      "message": "Fix broken link on README.md for emu device\n"
    },
    {
      "commit": "dbe96d0326166331dcee9ff15b3b1b935ce44a02",
      "tree": "625e89c132dc8b293a5c4e14fcb881e30daf35cd",
      "parents": [
        "adad0fbbcf5382c20978d07f94f9c13be9041c1b"
      ],
      "author": {
        "name": "Amilcar Ubiera",
        "email": "chopin952@gmail.com",
        "time": "Mon Oct 27 09:51:54 2025 -0400"
      },
      "committer": {
        "name": "Amilcar Ubiera",
        "email": "chopin952@gmail.com",
        "time": "Tue Nov 11 09:15:20 2025 -0500"
      },
      "message": "Fixes for \u0027Implicit conversion loses integer precision\u0027 warnings.\n"
    },
    {
      "commit": "b062c88a08869399773dae8f4aa6c24bff4737cd",
      "tree": "7f1fcdf308fe5572ab74ae91c51cc3ceffa4f0ff",
      "parents": [
        "adad0fbbcf5382c20978d07f94f9c13be9041c1b"
      ],
      "author": {
        "name": "aryeg",
        "email": "arye.gross@altair-semi.com",
        "time": "Sun Oct 19 08:35:05 2025 +0300"
      },
      "committer": {
        "name": "aryeg",
        "email": "arye.gross@altair-semi.com",
        "time": "Sun Oct 19 08:35:05 2025 +0300"
      },
      "message": "Fix comment typo and -\u003e an\n"
    },
    {
      "commit": "adad0fbbcf5382c20978d07f94f9c13be9041c1b",
      "tree": "bc0861eb72ed11924918ec2172b5655da7066218",
      "parents": [
        "ed127050bb8ea03a52d6f8694c091b45c6777033",
        "f5b2226a804b8cfdab15e4cee29601c61bbf6d69"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Sep 29 15:10:55 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 29 15:10:55 2025 -0500"
      },
      "message": "Merge pull request #1140 from tjko/littlefs-toy\n\nAdd littlefs-toy to the related projects section."
    },
    {
      "commit": "ed127050bb8ea03a52d6f8694c091b45c6777033",
      "tree": "28481cb38e089d905cf4ae23b5d0ee6bae96c33b",
      "parents": [
        "ec26996631c7bac1e739fb8e8168476af4a1cf6d",
        "4cd2bfc2c12b981f891d4fa335ce7492cc9141f4"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Sep 29 15:10:42 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 29 15:10:42 2025 -0500"
      },
      "message": "Merge pull request #1137 from dschendt/dschendt-fix-dir-count\n\nfix: compact when dir count hits 0x3ff"
    },
    {
      "commit": "ec26996631c7bac1e739fb8e8168476af4a1cf6d",
      "tree": "f0f7eda33c15f39d81b3c643317166178e62e29b",
      "parents": [
        "17ab6e92f763ecdc77d95ee13325b0d6534cf05b",
        "8b75de74c916ed516c634388f81c1bbcac446d41"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Sep 29 15:10:26 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 29 15:10:26 2025 -0500"
      },
      "message": "Merge pull request #1134 from elupus/patch-2\n\nfix: add missing return causing uninitialized reads"
    },
    {
      "commit": "17ab6e92f763ecdc77d95ee13325b0d6534cf05b",
      "tree": "55481a1a4cded13d24baf951fdc05f0e1b7fbeb9",
      "parents": [
        "8e251dd675da00342d45dac78b6f627f119aed03",
        "11cecd079c26c4a220f250440b310814e6c9fe27"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Sep 29 15:10:10 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 29 15:10:10 2025 -0500"
      },
      "message": "Merge pull request #1133 from elupus/patch-1\n\nfix: false uninitialized read warning"
    },
    {
      "commit": "4cd2bfc2c12b981f891d4fa335ce7492cc9141f4",
      "tree": "f6212f4cce6eb1a0545738c81f2d36bc29a748cd",
      "parents": [
        "f24ff9fb2568d769d3d679c84d6ea19e269867f8"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Sep 25 15:22:19 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Sep 25 15:24:33 2025 -0500"
      },
      "message": "Fixed inverted dir-\u003ecount check logic\n\nCuriously, the logic from 48bd2bf was incorrect, and would allow a\ncommit to be tried if erased _or_ dir-\u003ecount was at risk of overflow.\n\nThat is clearly wrong, we should only try to commit if both conditions\nare met...\n\nFound again by dschendt\n"
    },
    {
      "commit": "f24ff9fb2568d769d3d679c84d6ea19e269867f8",
      "tree": "890ff346303fbab0f09d795f8d49c1ce5bc388c6",
      "parents": [
        "172a186fa91dbb817cdda3829120e7217d711510"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Sep 25 13:03:42 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Sep 25 13:03:42 2025 -0500"
      },
      "message": "Moved dir-\u003ecount check before commit, limited to \u003c 0xff\n\nThis matches the logic originally implemented in 48bd2bf, which was lost\nduring the big no-recursion refactor 84da4c0.\n\nOther notes:\n\n- Checking \u003e\u003d 0xff matches the split logic during compaction (line\n  2158):\n\n    end - split \u003c 0xff\n\n- Grouping dir-\u003eerased || dir-\u003ecount \u003e\u003d 0xff together makes it clear\n  these share a common code path.\n\n- Checking for dir-\u003ecount \u003e\u003d 0xff early avoids committing \u003e8-bit ids to\n  disk.\n\n  The cat may already be out-of-the bag on this one, but opening the id\n  space up to the full 10-bits should probably be on a non-patch\n  release.\n\nFound by dschendt\n"
    },
    {
      "commit": "f5b2226a804b8cfdab15e4cee29601c61bbf6d69",
      "tree": "36e7a681b509139fa11c104343572cf65155f767",
      "parents": [
        "8e251dd675da00342d45dac78b6f627f119aed03"
      ],
      "author": {
        "name": "Timo Kokkonen",
        "email": "tjko@iki.fi",
        "time": "Mon Sep 15 17:32:05 2025 -0700"
      },
      "committer": {
        "name": "Timo Kokkonen",
        "email": "tjko@iki.fi",
        "time": "Mon Sep 15 17:32:05 2025 -0700"
      },
      "message": "Add littlefs-toy to the related projects section.\n"
    },
    {
      "commit": "172a186fa91dbb817cdda3829120e7217d711510",
      "tree": "73e1307a4916c60f0ac4297a0aa65f4bd30a03fb",
      "parents": [
        "8e251dd675da00342d45dac78b6f627f119aed03"
      ],
      "author": {
        "name": "David",
        "email": "david.schendt@gmail.com",
        "time": "Tue Sep 02 19:36:10 2025 -0400"
      },
      "committer": {
        "name": "David",
        "email": "david.schendt@gmail.com",
        "time": "Tue Sep 02 19:36:10 2025 -0400"
      },
      "message": "compact when dir count hits 0x3ff\n"
    },
    {
      "commit": "8b75de74c916ed516c634388f81c1bbcac446d41",
      "tree": "2dd73d0e586e64f04b147bfe0baec1a57cc903dc",
      "parents": [
        "8e251dd675da00342d45dac78b6f627f119aed03"
      ],
      "author": {
        "name": "Joakim Plate",
        "email": "joakim.plate@rt-labs.com",
        "time": "Tue Aug 12 17:03:40 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 12 17:03:40 2025 +0200"
      },
      "message": "fix: add missing return causing uninitialized reads\n\nIf lfs_bd_read fails, lfs_fcrc_fromle32 will read uninitialized memory, and hasfcrc will be set to true.\r\n\r\nThis may end up in a \"working\" state later due to crcs not matching. but it\u0027s hard to follow if that woud be the case."
    },
    {
      "commit": "11cecd079c26c4a220f250440b310814e6c9fe27",
      "tree": "55481a1a4cded13d24baf951fdc05f0e1b7fbeb9",
      "parents": [
        "8c7b6b26e625ce803cd1ad86a19f1710cbe9bc7f"
      ],
      "author": {
        "name": "Joakim Plate",
        "email": "joakim.plate@rt-labs.com",
        "time": "Tue Aug 12 16:29:31 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 12 16:29:31 2025 +0200"
      },
      "message": "fix: also assert inside lfs_bd_read"
    },
    {
      "commit": "8c7b6b26e625ce803cd1ad86a19f1710cbe9bc7f",
      "tree": "1a23821ba0bc04242dedc7d40c544e612f625d70",
      "parents": [
        "8e251dd675da00342d45dac78b6f627f119aed03"
      ],
      "author": {
        "name": "Joakim Plate",
        "email": "joakim.plate@rt-labs.com",
        "time": "Tue Aug 12 14:56:29 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 12 14:56:29 2025 +0200"
      },
      "message": "fix: false uninitialized read warning\n\nAdd asserts on file system reads to make sure\r\nno positive values are returned, which would\r\nmake assumptions on error checks invalid.\r\n\r\nThis fixes clang tidy warnings on uninitialized\r\nreads in uses of lfs_dir_get where only negative\r\nreturns are considered errors."
    },
    {
      "commit": "8e251dd675da00342d45dac78b6f627f119aed03",
      "tree": "0d5f272949320938dbc98560cdda30ae9138df88",
      "parents": [
        "25b9a4af857ba9ec4dc02debc579bdae336ccd31",
        "d5a86fd28de74dd1d5a6126d843b16276e6023cf"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Jun 30 11:39:17 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 30 11:39:17 2025 -0500"
      },
      "message": "Merge pull request #1110 from Ryan-CW-Code/perf_gc\n\nperf: gc might try to populate the lookahead buffer each time"
    },
    {
      "commit": "25b9a4af857ba9ec4dc02debc579bdae336ccd31",
      "tree": "d06c5cd587e5105d91411a30d5943315eaf6cc09",
      "parents": [
        "2acf939a0052d727b6c11450c05830bfba699bbd",
        "0755b00c215af570fff800061074f939379d8f10"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Jun 30 11:39:05 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 30 11:39:05 2025 -0500"
      },
      "message": "Merge pull request #1109 from Ryan-CW-Code/never_read\n\nrefactor: value stored to \u0027diff\u0027 is never read"
    },
    {
      "commit": "2acf939a0052d727b6c11450c05830bfba699bbd",
      "tree": "affd20c416c92079690ee0ef2e72fbac459f2b79",
      "parents": [
        "16ceb6793449fa159f99aed4a766c2823f59cf3e",
        "8365bbb7a2ce23388654cac7cef957e1d300b535"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Jun 30 11:38:56 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 30 11:38:56 2025 -0500"
      },
      "message": "Merge pull request #1106 from littlefs-project/fix-make-build-dep\n\nmake: Add missing BUILD_DEP include"
    },
    {
      "commit": "d5a86fd28de74dd1d5a6126d843b16276e6023cf",
      "tree": "897f7d6d53ceca8c06fb93ae23a03e07f74f783c",
      "parents": [
        "2349ac8c96f719ce44b38114ffcc1f6b058b8159"
      ],
      "author": {
        "name": "ryancw",
        "email": "1831931681@qq.com",
        "time": "Tue Jun 03 09:46:59 2025 +0800"
      },
      "committer": {
        "name": "ryancw",
        "email": "1831931681@qq.com",
        "time": "Tue Jun 03 09:46:59 2025 +0800"
      },
      "message": "style: format code, limit to 80 columns.\n"
    },
    {
      "commit": "2349ac8c96f719ce44b38114ffcc1f6b058b8159",
      "tree": "f1aaa83333d8116e3af14c132cf897b4f0710660",
      "parents": [
        "16ceb6793449fa159f99aed4a766c2823f59cf3e"
      ],
      "author": {
        "name": "ryancw",
        "email": "1831931681@qq.com",
        "time": "Wed May 28 10:23:47 2025 +0800"
      },
      "committer": {
        "name": "ryancw",
        "email": "1831931681@qq.com",
        "time": "Wed May 28 10:23:47 2025 +0800"
      },
      "message": "perf: gc might try to populate the lookahead buffer each time\n"
    },
    {
      "commit": "0755b00c215af570fff800061074f939379d8f10",
      "tree": "a684cd5b624b186cefcfc4c0500d7a276a549e93",
      "parents": [
        "16ceb6793449fa159f99aed4a766c2823f59cf3e"
      ],
      "author": {
        "name": "ryancw",
        "email": "1831931681@qq.com",
        "time": "Tue May 27 20:00:29 2025 +0800"
      },
      "committer": {
        "name": "ryancw",
        "email": "1831931681@qq.com",
        "time": "Tue May 27 20:00:29 2025 +0800"
      },
      "message": "refactor: value stored to \u0027diff\u0027 is never read\n"
    },
    {
      "commit": "8365bbb7a2ce23388654cac7cef957e1d300b535",
      "tree": "affd20c416c92079690ee0ef2e72fbac459f2b79",
      "parents": [
        "16ceb6793449fa159f99aed4a766c2823f59cf3e"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu May 15 13:38:31 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu May 15 13:38:31 2025 -0500"
      },
      "message": "make: Added missing BUILD_DEP include\n\nThis was preventing bench modifications from triggering relevant\nbench-runner rebuilds.\n"
    },
    {
      "commit": "16ceb6793449fa159f99aed4a766c2823f59cf3e",
      "tree": "07bf00d6a4e89f9ae1d2938a038e5ce6d16252be",
      "parents": [
        "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7",
        "8434536f0abe7ac6dae491f9a781d98491f77b71"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed May 14 20:45:44 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 14 20:45:44 2025 -0500"
      },
      "message": "Merge pull request #1103 from littlefs-project/devel\n\nMinor release: v2.11"
    },
    {
      "commit": "8434536f0abe7ac6dae491f9a781d98491f77b71",
      "tree": "07bf00d6a4e89f9ae1d2938a038e5ce6d16252be",
      "parents": [
        "523319b6858fda82ba9f1b496841185c897ec236"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue May 13 13:18:31 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue May 13 13:18:31 2025 -0500"
      },
      "message": "Bumped minor version to v2.11\n"
    },
    {
      "commit": "523319b6858fda82ba9f1b496841185c897ec236",
      "tree": "73d84b8676f12df2b13e49e1749e43219d2f1a79",
      "parents": [
        "8c458fa6bde1aebdc1a86003120a8cec815679b1",
        "ba250a30751d5568ff1d690987d6c77e9eec60d5"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue May 13 13:17:53 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 13:17:53 2025 -0500"
      },
      "message": "Merge pull request #1104 from DvdGiessen/os-rename-between-filesystems\n\nuse shutil.move instead of os.rename to move file"
    },
    {
      "commit": "ba250a30751d5568ff1d690987d6c77e9eec60d5",
      "tree": "80caa6cbd0c6d7ee5ac87a53d0a1c5ca36629035",
      "parents": [
        "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7"
      ],
      "author": {
        "name": "Daniël van de Giessen",
        "email": "daniel@dvdgiessen.nl",
        "time": "Tue May 13 13:12:42 2025 +0200"
      },
      "committer": {
        "name": "Daniël van de Giessen",
        "email": "daniel@dvdgiessen.nl",
        "time": "Tue May 13 13:15:21 2025 +0200"
      },
      "message": "use shutil.move instead of os.rename to move file\n\nThis prevents a \"OSError: [Errno 18] Invalid cross-device link\" if the temporary\nfile was created on different filesystem (such as a tmpfs mount).\n"
    },
    {
      "commit": "8c458fa6bde1aebdc1a86003120a8cec815679b1",
      "tree": "f51135c52c1f46397aaa02cb850446fa5f92dd7b",
      "parents": [
        "3149201ae5ba3e10cadfbd6cc6f570ce42fb9b15",
        "edaaaf88ead8d0828fa79f45b9c0d55662504da1"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue May 13 00:45:32 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 00:45:32 2025 -0500"
      },
      "message": "Merge pull request #1094 from sosthene-nitrokey/shrink-fs\n\nAdd support for shrinking a filesystem"
    },
    {
      "commit": "3149201ae5ba3e10cadfbd6cc6f570ce42fb9b15",
      "tree": "b1d33a51a25f7a30385bb1c130c409776d0c9b6c",
      "parents": [
        "6a43f3cdc37188ea1cb51431d31447e98a6db558",
        "0d861b7916809861b62840c42a4df6e05844dd65"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue May 13 00:45:02 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 00:45:02 2025 -0500"
      },
      "message": "Merge pull request #1091 from yamt/mach-o\n\nadapt the linker sections usage to mach-o"
    },
    {
      "commit": "6a43f3cdc37188ea1cb51431d31447e98a6db558",
      "tree": "f698a4c69a99c1de76558c827febfff5371cd0d8",
      "parents": [
        "d73fb8ef3c9b3742d5f8ff9ee045d76e01262e7e",
        "0115cf6b74cc27e288678aeb7f8c977be0792be0"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue May 13 00:44:46 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 00:44:46 2025 -0500"
      },
      "message": "Merge pull request #1090 from yamt/clang\n\ndrop a few unsupported CFLAGS for clang"
    },
    {
      "commit": "d73fb8ef3c9b3742d5f8ff9ee045d76e01262e7e",
      "tree": "20085b4df7710ea7bc2f61d465f0da67b73e48f6",
      "parents": [
        "c1bf7cee84dc77082b39b9285ea2909e51694252",
        "a3d6bec5f0e90a5a5b96cccab21fd1bf8fb97f17"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue May 13 00:44:26 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 00:44:26 2025 -0500"
      },
      "message": "Merge pull request #1099 from littlefs-project/fix-remove-double-deorphan\n\nFix double deorphan caused by relocation mid dir remove"
    },
    {
      "commit": "c1bf7cee84dc77082b39b9285ea2909e51694252",
      "tree": "fbed5ea5056f054bd9b3ff49e4530fd9a07f2258",
      "parents": [
        "b26bf3494c00c6c66d0efb6fb7b6d0036e28a634",
        "f4a1bb328ae1b85ce1b9b72985742073a1c89765"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue May 13 00:44:05 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 00:44:05 2025 -0500"
      },
      "message": "Merge pull request #1100 from selimkeles/fix/bitshift_overflow\n\nfix: added uint32_t cast to the bitshift places"
    },
    {
      "commit": "b26bf3494c00c6c66d0efb6fb7b6d0036e28a634",
      "tree": "baa9eda7703c95d847a88aebf0c000e5569bf4e3",
      "parents": [
        "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7",
        "b82372842038af7714770b1d3fc5fcae46fe9974"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue May 13 00:43:24 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 00:43:24 2025 -0500"
      },
      "message": "Merge pull request #1095 from DvdGiessen/lfs_crc\n\nlfs_crc should be static if LFS_CRC is defined"
    },
    {
      "commit": "0115cf6b74cc27e288678aeb7f8c977be0792be0",
      "tree": "032c05c5fcdef6c8e975817db551235fa4d8a925",
      "parents": [
        "bff4dfd1b1f6f2ee53bd4aae6de5d3b66c172251"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed May 07 23:45:29 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed May 07 23:45:29 2025 -0500"
      },
      "message": "gha: Dropped explicit CFLAGS from clang testing in CI\n\nThanks to yamt, GCC-specific flags should now be disabled if compiling\nwith clang. Dropping the explicit flags also doubles as a test that the\nNO_GCC inference works.\n"
    },
    {
      "commit": "bff4dfd1b1f6f2ee53bd4aae6de5d3b66c172251",
      "tree": "82232e0937f6ed9ecf038088a82b028bdcf785f2",
      "parents": [
        "26bee8ad36030c89b1300d5095f56fa635b53b95"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed May 07 22:46:31 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed May 07 23:40:25 2025 -0500"
      },
      "message": "Added NO_GCC to allow users to explicitly disable GCC-specific flags\n\nThis is the same as the implicit Clang \u003d\u003e NO_GCC behavior introduced by\nyamt, but with an explicit variable that can be assigned by users using\nother, non-gcc, compilers:\n\n  $ NO_GCC\u003d1 make\n\nNote, stack measurements are currently GCC specific:\n\n  $ NO_GCC\u003d1 make stack\n  ... snip ...\n  FileNotFoundError: [Errno 2] No such file or directory: \u0027lfs.ci\u0027\n  make: *** [Makefile:494: lfs.stack.csv] Error 1\n"
    },
    {
      "commit": "edaaaf88ead8d0828fa79f45b9c0d55662504da1",
      "tree": "e96dae3cb14a27a8f8440885297e1e58fd5a6a9a",
      "parents": [
        "7d79423972049b195ba26822e58e34d2d4cf5f97"
      ],
      "author": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Wed May 07 10:38:43 2025 +0200"
      },
      "committer": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Wed May 07 10:38:43 2025 +0200"
      },
      "message": "Apply review comments\n"
    },
    {
      "commit": "7d79423972049b195ba26822e58e34d2d4cf5f97",
      "tree": "1cf6bbfb4e34af048ef3ee860f000067b848d32e",
      "parents": [
        "7782d3dfa306b3dad917afb3a646cc1e72bba4a0"
      ],
      "author": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Wed May 07 10:32:03 2025 +0200"
      },
      "committer": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Wed May 07 10:34:24 2025 +0200"
      },
      "message": "Rename SHRINKIFCHEAP to SHRINKNONRELOCATING\n"
    },
    {
      "commit": "7782d3dfa306b3dad917afb3a646cc1e72bba4a0",
      "tree": "fd6acba1608ebbd659080c5929d2436d971f7368",
      "parents": [
        "9b8f802b4357e7cb8d8d6e6dc5c768ad2178c1c3"
      ],
      "author": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Tue May 06 10:59:32 2025 +0200"
      },
      "committer": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Tue May 06 11:00:29 2025 +0200"
      },
      "message": "Mention that shrinking is unlikely to work\n"
    },
    {
      "commit": "f4a1bb328ae1b85ce1b9b72985742073a1c89765",
      "tree": "3b15b63b9b374eaaa15b39842f2dcd8d6905639a",
      "parents": [
        "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7"
      ],
      "author": {
        "name": "selim.keles",
        "email": "Selim.Keles@landisgyr.com",
        "time": "Mon May 05 13:38:05 2025 +0300"
      },
      "committer": {
        "name": "selim.keles",
        "email": "Selim.Keles@landisgyr.com",
        "time": "Mon May 05 13:38:05 2025 +0300"
      },
      "message": "fix: added uint32_t cast to the bitshift places\nIn 16 bit and 8 bit architectures, overflow and underflow issues were occuring while using functions lfs_frombe32 and lfs_fromle32\n"
    },
    {
      "commit": "9b8f802b4357e7cb8d8d6e6dc5c768ad2178c1c3",
      "tree": "a5f3783bb982b057aa479ad5ba98ac570bdc2d8b",
      "parents": [
        "2105e502c526ebd4d0cc7e2dca63e6586f1e884f"
      ],
      "author": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Mon May 05 11:37:39 2025 +0200"
      },
      "committer": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Mon May 05 11:37:39 2025 +0200"
      },
      "message": "fixup! Add support for shrinking a filesystem\n"
    },
    {
      "commit": "a3d6bec5f0e90a5a5b96cccab21fd1bf8fb97f17",
      "tree": "29b496b7de5aea7c4c637df47c14e29ae5437c32",
      "parents": [
        "0634d13e07d831a2bda7efeb38287dcaf06ffac2"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Sat May 03 17:20:02 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Sat May 03 18:13:19 2025 -0500"
      },
      "message": "Fixed a double deorphan caused by relocation mid dir remove\n\nLong story short: There is a specific case where removing a directory\ncan trigger a deorphan pass, but lfs_remove did not check for this,\nwould try to clean up the (already cleaned) directory orphan, and\ntrigger an assert:\n\n  lfs.c:4890:assert: assert failed with false, expected eq true\n      LFS_ASSERT(lfs_tag_size(lfs-\u003egstate.tag) \u003e 0x000 || orphans \u003e\u003d 0);\n\nThe specific case being a remove commit that triggers a relocation that\ncreates an orphan.\n\nThis is also possible in lfs_rename, but only if you\u0027re renaming a\ndirectory that implies a remove, which is a pretty rare operation.\n\n---\n\nThis was probably an oversight introduced in the non-recursive commit\nlogic rework.\n\nFortunately the fix is to just check if we even have an orphan before\ntrying to remove it. We can rely on this instead of the file type, so\nthis fix shouldn\u0027t even increase the code size.\n\nFound and root-caused by Hugh-Baoa\n"
    },
    {
      "commit": "0634d13e07d831a2bda7efeb38287dcaf06ffac2",
      "tree": "9e7256863f3b2c1ca5fa847d172f90556b4d2ab1",
      "parents": [
        "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Sat May 03 17:15:26 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Sat May 03 17:15:26 2025 -0500"
      },
      "message": "tests: Added non-reentrant variants of orphan/relocation tests\n\nThese are the same as the related reentrant variants, but by opting out\nof powerloss testing, we can test a much larger number of states without\nhaving to worry about the impact on powerloss testing runtime.\n\nBumped CYCLES from 20 -\u003e 2000.\n\nThis reveals an orphan remove bug found by Hugh-Baoa.\n"
    },
    {
      "commit": "2105e502c526ebd4d0cc7e2dca63e6586f1e884f",
      "tree": "d5d420a28b5447dbd36761660a69dc06d0748154",
      "parents": [
        "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7"
      ],
      "author": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Wed Apr 16 17:46:34 2025 +0200"
      },
      "committer": {
        "name": "Sosthène Guédon",
        "email": "sosthene@nitrokey.com",
        "time": "Thu Apr 17 10:07:37 2025 +0200"
      },
      "message": "Add support for shrinking a filesystem\n\nThis PR adds a new `lfs_fs_shrink`, which functions similarly to\n`lfs_fs_grow`, but supports reducing the block count.\n\nThis functions first checks that none of the removed block are in use.\nIf it is the case, it will fail.\n"
    },
    {
      "commit": "b82372842038af7714770b1d3fc5fcae46fe9974",
      "tree": "baa9eda7703c95d847a88aebf0c000e5569bf4e3",
      "parents": [
        "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7"
      ],
      "author": {
        "name": "Daniël van de Giessen",
        "email": "daniel@dvdgiessen.nl",
        "time": "Wed Apr 16 18:17:21 2025 +0200"
      },
      "committer": {
        "name": "Daniël van de Giessen",
        "email": "daniel@dvdgiessen.nl",
        "time": "Wed Apr 16 18:17:21 2025 +0200"
      },
      "message": "lfs_crc should be static if LFS_CRC is defined\n"
    },
    {
      "commit": "0d861b7916809861b62840c42a4df6e05844dd65",
      "tree": "b182236ffe5ecdb5344eb20a7d0bf466b89a2d5b",
      "parents": [
        "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7"
      ],
      "author": {
        "name": "YAMAMOTO Takashi",
        "email": "yamamoto@midokura.com",
        "time": "Mon Apr 07 16:07:17 2025 +0900"
      },
      "committer": {
        "name": "YAMAMOTO Takashi",
        "email": "yamamoto@midokura.com",
        "time": "Mon Apr 07 16:20:23 2025 +0900"
      },
      "message": "adapt the linker sections usage to mach-o\n\n\"make test\" on macOS:\n\n```\nusing runner: ./runners/test_runner\nfound 19 suites, 188 cases, 11242/11770 permutations\n\nrunning test_alloc: 12/12 cases, 207/207 perms\nrunning test_attrs: 4/4 cases, 20/20 perms\nrunning test_badblocks: 4/4 cases, 300/300 perms\nrunning test_bd: 5/5 cases, 85/85 perms\nrunning test_compat: 17/17 cases, 205/205 perms\nrunning test_dirs: 15/15 cases, 450/450 perms, 1756pls!\nrunning test_entries: 8/8 cases, 32/32 perms\nrunning test_evil: 8/8 cases, 105/105 perms\nrunning test_exhaustion: 5/5 cases, 85/85 perms\nrunning test_files: 10/10 cases, 7155/7155 perms, 9410pls!\nrunning test_interspersed: 4/4 cases, 190/190 perms, 2835pls!\nrunning test_move: 17/17 cases, 161/161 perms, 157pls!\nrunning test_orphans: 6/6 cases, 50/50 perms, 846pls!\nrunning test_paths: 33/33 cases, 325/325 perms\nrunning test_powerloss: 2/2 cases, 21/21 perms\nrunning test_relocations: 4/4 cases, 68/68 perms, 1612pls!\nrunning test_seek: 10/10 cases, 195/195 perms, 1050pls!\nrunning test_superblocks: 17/17 cases, 318/318 perms, 1437pls!\nrunning test_truncate: 7/7 cases, 1270/1270 perms, 9691pls!\n\ndone: 11242/11242 passed, 0/11242 failed, 28794pls!, in 585.76s\n```\n"
    },
    {
      "commit": "26bee8ad36030c89b1300d5095f56fa635b53b95",
      "tree": "65bda86ad0175e06f742fbc6ab286dc7a782668b",
      "parents": [
        "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7"
      ],
      "author": {
        "name": "YAMAMOTO Takashi",
        "email": "yamamoto@midokura.com",
        "time": "Mon Apr 07 16:06:01 2025 +0900"
      },
      "committer": {
        "name": "YAMAMOTO Takashi",
        "email": "yamamoto@midokura.com",
        "time": "Mon Apr 07 16:06:01 2025 +0900"
      },
      "message": "drop a few unsupported CFLAGS for clang\n"
    },
    {
      "commit": "8ed63b27be79ab59ee1cd15a950ddd64e7a602f7",
      "tree": "b3144325c0afe9a09b1712236b8eebaddf58f2be",
      "parents": [
        "a666730044029ff40abfb10b12a69d87669bb1c9",
        "61a1b0b496958de3ba1849626296bac8a5a97f02"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Mar 20 01:26:11 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 20 01:26:11 2025 -0500"
      },
      "message": "Merge pull request #1084 from elupus/fix/packing\n\nfix: avoid assuming struct packing"
    },
    {
      "commit": "a666730044029ff40abfb10b12a69d87669bb1c9",
      "tree": "660c012a3ade5f4ce8ff4be39b6641a1ef1ce9c6",
      "parents": [
        "47e738b78839dcdb03444352a67cde9a78041010",
        "5281a20f6c3e2af453591eeb62a8f5d5a86dd063"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Mar 20 01:25:56 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 20 01:25:56 2025 -0500"
      },
      "message": "Merge pull request #1078 from BrianPugh/unit-test-readme\n\nAdd a little bit of documentation on how to run tests."
    },
    {
      "commit": "47e738b78839dcdb03444352a67cde9a78041010",
      "tree": "075c5c272b4593b362175d92b6afd74fbdd105f9",
      "parents": [
        "81b0db0cdc844a21e13df774a28905f5ba17d7e8",
        "936919d13488f307731fa203981ffb62d9e43479"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Mar 20 01:25:33 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 20 01:25:33 2025 -0500"
      },
      "message": "Merge pull request #1071 from RocLoong/patch-1\n\nprint lfs_file_size overflow"
    },
    {
      "commit": "81b0db0cdc844a21e13df774a28905f5ba17d7e8",
      "tree": "c8dfefeb5bc779c17c3c619c6e6a61443745a28a",
      "parents": [
        "63ab1ffb65413996fc54cf0d12003383ea825964",
        "d2c3a476277b9f9ebf1291c65653d2c565b66dfd"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Mar 20 01:24:19 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 20 01:24:19 2025 -0500"
      },
      "message": "Merge pull request #1070 from Noxet/filebd-wrong-cast\n\nChanged cast to correct type when trace is enabled for filebd"
    },
    {
      "commit": "63ab1ffb65413996fc54cf0d12003383ea825964",
      "tree": "2d6910f5a1856fa977ecb1e265d9bfb0c0dcc2ff",
      "parents": [
        "ca1081e7c47c9d09c99f66846d657ae4e06a1739",
        "caba4f31df7a93fca8a04030a5d79f6819552308"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Mar 20 01:24:04 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 20 01:24:04 2025 -0500"
      },
      "message": "Merge pull request #1068 from littlefs-project/fix-dir-remove-read\n\nFix dir iteration being broken by concurrent removes"
    },
    {
      "commit": "ca1081e7c47c9d09c99f66846d657ae4e06a1739",
      "tree": "f54795cd384e0c31926cc72a01210f3a9edb9ad8",
      "parents": [
        "76027f1502749c5389df1186aea9131e1593836f",
        "152d03043ccab2ca6c454dd6cef43dc072d5810a"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Mar 20 01:23:35 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 20 01:23:35 2025 -0500"
      },
      "message": "Merge pull request #1065 from amubiera/fix-unsafe-use-of-bool\n\nFix for \"unsafe use of type bool\" warning when compiling with MSVC."
    },
    {
      "commit": "76027f1502749c5389df1186aea9131e1593836f",
      "tree": "29dd052e1c61fe4ff7ef353d09c43376691b8ee3",
      "parents": [
        "0494ce7169f06a734a7bd7585f49a9fa91fa7318",
        "8d01895b325f0ca70577fe01ef013875770d3a09"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Mar 20 01:23:19 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 20 01:23:19 2025 -0500"
      },
      "message": "Merge pull request #1064 from tim-nordell-nimbelink/fix/script_syntax_warnings\n\nscripts: Fixed several SyntaxWarning for python test helpers"
    },
    {
      "commit": "61a1b0b496958de3ba1849626296bac8a5a97f02",
      "tree": "3aa68634034a6febc49b9380df31dbb00bae30fe",
      "parents": [
        "ffafb9cbb106c8e890a9949b49033e6deee44863"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Mar 18 02:39:28 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Mar 18 02:39:28 2025 -0500"
      },
      "message": "Tweaked lfs_gstate_iszero for terseness\n"
    },
    {
      "commit": "ffafb9cbb106c8e890a9949b49033e6deee44863",
      "tree": "718734a8fa18a25ff388cae7b691f57d39f9cf8c",
      "parents": [
        "0494ce7169f06a734a7bd7585f49a9fa91fa7318"
      ],
      "author": {
        "name": "Joakim Plate",
        "email": "joakim.plate@rt-labs.com",
        "time": "Tue Mar 11 16:19:58 2025 +0100"
      },
      "committer": {
        "name": "Joakim Plate",
        "email": "joakim.plate@rt-labs.com",
        "time": "Fri Mar 14 10:03:46 2025 +0100"
      },
      "message": "fix: avoid assuming struct packing\n\nlfs_gstate_t was assumed to be a packed array of uint32_t,\nbut this is not always guaranteed. Access the fields directly\ninstead of attempting to loop over an array of uint32_t\n\nFixes clang tidy warnings about use of uninitialized memory\naccessed.\n"
    },
    {
      "commit": "5281a20f6c3e2af453591eeb62a8f5d5a86dd063",
      "tree": "c6665558743d7b66a614ab1475b8c7361045cc4d",
      "parents": [
        "f55520380da00985015180be4a5da554c461645b"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Mar 13 13:18:48 2025 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Mar 13 13:23:20 2025 -0500"
      },
      "message": "README.md: Tweaked testing documentation\n\n- Showing some of the more useful flags.\n- Showing the usual flow of bug -\u003e reproduce -\u003e gdb.\n- Being a bit pedantic since this is the README.md.\n"
    },
    {
      "commit": "f55520380da00985015180be4a5da554c461645b",
      "tree": "24aec7d8c910e9304e5bdec8e3dad65274b304f0",
      "parents": [
        "0494ce7169f06a734a7bd7585f49a9fa91fa7318"
      ],
      "author": {
        "name": "Brian Pugh",
        "email": "bnp117@gmail.com",
        "time": "Thu Feb 27 17:41:29 2025 -0800"
      },
      "committer": {
        "name": "Brian Pugh",
        "email": "bnp117@gmail.com",
        "time": "Thu Feb 27 17:41:29 2025 -0800"
      },
      "message": "Add a little bit of documentation on how to run tests.\n"
    },
    {
      "commit": "936919d13488f307731fa203981ffb62d9e43479",
      "tree": "92b934c840ef89adcd83d87c663a55d84494dbe0",
      "parents": [
        "0494ce7169f06a734a7bd7585f49a9fa91fa7318"
      ],
      "author": {
        "name": "Rocloong",
        "email": "63897185+RocLoong@users.noreply.github.com",
        "time": "Sat Feb 08 15:12:16 2025 +0800"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Feb 13 15:46:39 2025 -0600"
      },
      "message": "LFS_TRACE: Fixed sign mismatch in lfs_file_size\n"
    },
    {
      "commit": "d2c3a476277b9f9ebf1291c65653d2c565b66dfd",
      "tree": "2d741b0c3114cea6744cc659ee95746d0de5da6c",
      "parents": [
        "0320e7db0e7465c3c2578feb261b52853507bfa1"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Feb 06 01:20:29 2025 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Feb 06 01:20:29 2025 -0600"
      },
      "message": "gha: Added test-yes-trace build/test job to CI\n\nTo hopefully catch typos like the one found by Noxet in the future.\n\nNothing is actually testing that these trace statements compile\notherwise.\n"
    },
    {
      "commit": "0320e7db0e7465c3c2578feb261b52853507bfa1",
      "tree": "d765ef9b2e6841b11fc2758885a15f8bb08c6af2",
      "parents": [
        "0494ce7169f06a734a7bd7585f49a9fa91fa7318"
      ],
      "author": {
        "name": "Jonathan Sönnerup",
        "email": "nooxet@gmail.com",
        "time": "Wed Feb 05 16:16:53 2025 +0100"
      },
      "committer": {
        "name": "Jonathan Sönnerup",
        "email": "nooxet@gmail.com",
        "time": "Wed Feb 05 16:16:53 2025 +0100"
      },
      "message": "Changed cast to correct type when trace is enabled for filebd\n"
    },
    {
      "commit": "caba4f31df7a93fca8a04030a5d79f6819552308",
      "tree": "506234ffa38683fc1b92b03c388269556b4ba203",
      "parents": [
        "0494ce7169f06a734a7bd7585f49a9fa91fa7318"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Feb 03 18:05:15 2025 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Feb 03 22:52:24 2025 -0600"
      },
      "message": "Fixed dir iteration being broken by concurrent removes\n\nWhen removing a file, we mark all open handles as \"removed\" (\npair\u003d{-1,-1}) to avoid trying to later read metadata that no longer\nexists. Unfortunately, this also includes open dir handles that happen\nto be pointing at the removed file, causing them to return\nLFS_ERR_CORRUPT on the next read.\n\nThe good news is this is _not_ actual filesystem corruption, only a\nlogic error in lfs_dir_read.\n\nWe actually already have logic in place to nudge the dir to the next id,\nbut it was unreachable with the existing logic. I suspect this worked at\none point but was broken during a refactor due to lack of testing.\n\n---\n\nFortunately, all we need to do is _not_ clobber the handle if the\ninternal type is a dir. Then the dir-nudging logic can correctly take\nover.\n\nI\u0027ve also added test_dirs_remove_read to test this and prevent another\nregression, adapted from tests provided by tpwrules that identified the\noriginal bug.\n\nFound by tpwrules\n"
    },
    {
      "commit": "152d03043ccab2ca6c454dd6cef43dc072d5810a",
      "tree": "b78acbc444e245fabab3b696bc91946e16abacac",
      "parents": [
        "0494ce7169f06a734a7bd7585f49a9fa91fa7318"
      ],
      "author": {
        "name": "Amilcar Ubiera",
        "email": "chopin952@gmail.com",
        "time": "Wed Jan 15 14:22:12 2025 -0500"
      },
      "committer": {
        "name": "Amilcar Ubiera",
        "email": "chopin952@gmail.com",
        "time": "Mon Feb 03 18:59:14 2025 -0500"
      },
      "message": "Fix for \"unsafe use of type bool\" warning when compiling with MSVC.\n"
    },
    {
      "commit": "8d01895b325f0ca70577fe01ef013875770d3a09",
      "tree": "29dd052e1c61fe4ff7ef353d09c43376691b8ee3",
      "parents": [
        "0494ce7169f06a734a7bd7585f49a9fa91fa7318"
      ],
      "author": {
        "name": "Tim Nordell",
        "email": "tnordell@airgain.com",
        "time": "Mon Jan 13 16:52:57 2025 -0600"
      },
      "committer": {
        "name": "Tim Nordell",
        "email": "tnordell@airgain.com",
        "time": "Mon Jan 13 16:54:13 2025 -0600"
      },
      "message": "scripts: Fixed several SyntaxWarning for python test helpers\n\nMany of these require a r\u0027\u0027 string context to avoid errors like:\n\n  scripts/test.py:105: SyntaxWarning: invalid escape sequence \u0027\\s\u0027\n"
    },
    {
      "commit": "0494ce7169f06a734a7bd7585f49a9fa91fa7318",
      "tree": "06dd0162169d3cb550cd24a3e34d0e4d02983ad3",
      "parents": [
        "630a0d87c23900c05ed5906db461ab91d3cc2c27",
        "366100b1403d2b680ed7a0f3bd0ba982c34d5c07"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Dec 20 09:02:13 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 20 09:02:13 2024 -0600"
      },
      "message": "Merge pull request #1058 from littlefs-project/fix-seek-eob-cache\n\nFixed incorrect cache reuse when seeking from end-of-block"
    },
    {
      "commit": "366100b1403d2b680ed7a0f3bd0ba982c34d5c07",
      "tree": "06dd0162169d3cb550cd24a3e34d0e4d02983ad3",
      "parents": [
        "630a0d87c23900c05ed5906db461ab91d3cc2c27"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Dec 19 01:32:50 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Dec 19 02:39:10 2024 -0600"
      },
      "message": "Fixed incorrect cache reuse when seeking from end-of-block\n\nIn v2.5, we introduced an optimization to avoid rereading data when\nseeking inside the file cache. Unfortunately this used a slightly\nwrong condition to check if the cache was \"live\", which meant seeks from\nend-of-blocks could end up with invalid caches and wrong data. Not\ngreat.\n\nThe problem is the nuance of when a file\u0027s cache is \"live\":\n\n1. The file is marked as LFS_F_READING or LFS_F_WRITING.\n\n   But we can\u0027t reuse the cache when writing, so we only care about\n   LFS_F_READING.\n\n2. file-\u003eoff !\u003d lfs-\u003ecfg-\u003eblock_size (end-of-block).\n\n   This is an optimization to avoid eagerly reading blocks we may not\n   actually care about.\n\nWe weren\u0027t checking for the end-of-block case, which meant if you seeked\n_from_ the end of a block to a seemingly valid location in the file\ncache, you could end up with an invalid cache.\n\nNote that end-of-block may not be powers-of-two due to CTZ skip-list\npointers.\n\n---\n\nThe fix is to check for the end-of-block case in lfs_file_seek. Note\nthis now matches the need-new-block logic in lfs_file_flushedread.\n\nThis logic change may also make lfs_file_seek call lfs_file_flush more\noften, but only in cases where lfs_file_flush is a noop.\n\nI\u0027ve also extended the test_seek tests to cover a few more boundary-read\ncases and prevent a regression in the future.\n\nFound by wjl and lrodorigo\n"
    },
    {
      "commit": "630a0d87c23900c05ed5906db461ab91d3cc2c27",
      "tree": "72683e939b1a30883997580114f8b80621def6db",
      "parents": [
        "d01280e64934a09ba16cac60cf9d3a37e228bb66",
        "3d0386489b0a6f7fd1986e4ca4f60c49f9186401"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed Dec 11 16:56:45 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 11 16:56:45 2024 -0600"
      },
      "message": "Merge pull request #1050 from littlefs-project/devel\n\nMinor release: v2.10"
    },
    {
      "commit": "3d0386489b0a6f7fd1986e4ca4f60c49f9186401",
      "tree": "72683e939b1a30883997580114f8b80621def6db",
      "parents": [
        "b8e4433b34186d54c9c5850e781b82b7d16cfb3c"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed Dec 11 16:23:10 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed Dec 11 16:23:10 2024 -0600"
      },
      "message": "Bumped minor version to v2.10\n"
    },
    {
      "commit": "b8e4433b34186d54c9c5850e781b82b7d16cfb3c",
      "tree": "d865d239a9fffb3abaf9b9ca365f105f785690cc",
      "parents": [
        "215613e41fcbf859597d46e60ea2f6e1454421ee",
        "dae656aa53cfab693f3013a6be6b051c2b20543d"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Dec 10 11:48:48 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 10 11:48:48 2024 -0600"
      },
      "message": "Merge pull request #1052 from wangdongustc/assert_null_sync\n\nAssert on NULL IO functions"
    },
    {
      "commit": "dae656aa53cfab693f3013a6be6b051c2b20543d",
      "tree": "28c0b11bdac78c58f5e45f50ad8838a520aadcf8",
      "parents": [
        "469c863c18b99bf17470e1c066252d43bfaa3e14"
      ],
      "author": {
        "name": "Dong Wang",
        "email": "wangdong115@foxmail.com",
        "time": "Tue Dec 10 01:21:59 2024 +0800"
      },
      "committer": {
        "name": "Dong Wang",
        "email": "wangdong115@foxmail.com",
        "time": "Tue Dec 10 22:54:58 2024 +0800"
      },
      "message": "Fix prettyasserts.py for pointer asserts\n"
    },
    {
      "commit": "469c863c18b99bf17470e1c066252d43bfaa3e14",
      "tree": "bec055528b734ee46e72797e91eea09b16743f25",
      "parents": [
        "2fcecc88946a48d21bcab5ea2d13e02cccd8fd8d"
      ],
      "author": {
        "name": "Dong Wang",
        "email": "wangdong115@foxmail.com",
        "time": "Tue Dec 10 00:17:43 2024 +0800"
      },
      "committer": {
        "name": "Dong Wang",
        "email": "wangdong115@foxmail.com",
        "time": "Tue Dec 10 22:54:54 2024 +0800"
      },
      "message": "Assert on NULL IO function\n"
    },
    {
      "commit": "215613e41fcbf859597d46e60ea2f6e1454421ee",
      "tree": "4b98011a5460d4f63d47d8bf11951ea7a02b00c9",
      "parents": [
        "2fcecc88946a48d21bcab5ea2d13e02cccd8fd8d"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Dec 09 14:56:12 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Dec 09 14:56:12 2024 -0600"
      },
      "message": "gha: Fixed x86-only statuses\n\nLooks like I missed a line during refactoring, resulted in only x86\nsizes being reported in GitHub statuses.\n\nIf we wanted to limited these to one architecture, thumb would have\nprobably been a better pick.\n"
    },
    {
      "commit": "2fcecc88946a48d21bcab5ea2d13e02cccd8fd8d",
      "tree": "839d05e15caf12ee60dfe7c83d0fb2bd8ba45fb7",
      "parents": [
        "78f9a5fcd3aaa13af4e05a4eeeeb53aaa5fe9d55",
        "999ef6656f13eeaa0de7f7d880ba6d1937aa60dd"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Dec 06 13:48:26 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 13:48:26 2024 -0600"
      },
      "message": "Merge pull request #1046 from littlefs-project/fix-trailing-slashes\n\npaths: Revisit path parsing, fix trailing slash behavior"
    },
    {
      "commit": "78f9a5fcd3aaa13af4e05a4eeeeb53aaa5fe9d55",
      "tree": "e78dc6a869586812db5e9626354a978b1c927084",
      "parents": [
        "83fe41b6058db4396775317b87bb6bf7f984f902",
        "1407db95569ea3b4132b7801a702aa8e86bf416b"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Dec 06 13:47:47 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 13:47:47 2024 -0600"
      },
      "message": "Merge pull request #1038 from littlefs-project/link-ramcrc32bd-ramrsbd\n\nAdd links to ramcrc32bd and ramrsbd"
    },
    {
      "commit": "83fe41b6058db4396775317b87bb6bf7f984f902",
      "tree": "430cb3683d484cf5f8d39297f3a36b733feae224",
      "parents": [
        "d7a911923be9d135708ceaf4b90b5edc6f4336bc",
        "ea431bd6aefd6f4f2a00b1b90bb15bcb0c9a411d"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Dec 06 13:47:36 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 13:47:36 2024 -0600"
      },
      "message": "Merge pull request #1031 from littlefs-project/fix-enospc-issues\n\nFix metadata_max\u003d\u003dprog_size commit-\u003eend calculation"
    },
    {
      "commit": "d7a911923be9d135708ceaf4b90b5edc6f4336bc",
      "tree": "c2a230980c66cb101a881782ec789fb379ebe6ec",
      "parents": [
        "2ba4280a5e4f151bcbaeaea4a968097815979876",
        "abaec45652a1e8c79f812c3e868f6c1063e06c51"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Dec 06 13:47:20 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 13:47:20 2024 -0600"
      },
      "message": "Merge pull request #1027 from littlefs-project/fix-seek-overflow-ub\n\nFix seek undefined behavior on signed integer overflow"
    },
    {
      "commit": "2ba4280a5e4f151bcbaeaea4a968097815979876",
      "tree": "f2e6ae66db69b7e6c99070736c13a9886024908e",
      "parents": [
        "c961e1fe66a76b33d30edfb0ebb51236fb1975a3",
        "ac207586bae9d086ccaa8ff71fc90509fa4f54bc"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Dec 06 13:47:06 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 13:47:06 2024 -0600"
      },
      "message": "Merge pull request #997 from littlefs-project/fix-trace-format-again\n\nFix some more LFS_TRACE format specifiers"
    },
    {
      "commit": "c961e1fe66a76b33d30edfb0ebb51236fb1975a3",
      "tree": "8db453b8e4d791fd7d06cbc668f882f249e85b51",
      "parents": [
        "bd01a4c0eebca569e2e7821b88b45e83334e260e",
        "4a845be0beccda3d9872eb4935f471e2eb245553"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Dec 06 13:45:56 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 13:45:56 2024 -0600"
      },
      "message": "Merge pull request #1004 from yamt/user-define-header\n\nAdd an alternative way to override LFS_MALLOC etc"
    },
    {
      "commit": "bd01a4c0eebca569e2e7821b88b45e83334e260e",
      "tree": "5d3a127e36e2fac7dd3dd2cfab819497ec81266f",
      "parents": [
        "b78afe25182182f4678346cb7fabad5424700724",
        "a2c2e49e6b87c1871bba3b3b3c6fbaf48154fa3f"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Dec 06 13:44:37 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 13:44:37 2024 -0600"
      },
      "message": "Merge pull request #1013 from wdfk-prog/feature_2.9.3\n\nWrite the detect cycles function as a function to optimize code"
    },
    {
      "commit": "999ef6656f13eeaa0de7f7d880ba6d1937aa60dd",
      "tree": "551a28ab43a34db305ccde3f612c6e471b0a69f6",
      "parents": [
        "b735c8fd7f948e4db34f063c52086b802d095f28"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 15:22:33 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 15:40:44 2024 -0600"
      },
      "message": "paths: Changed CREAT with a trailing slash to return NOTDIR\n\n- before: lfs_file_open(\"missing/\") \u003d\u003e LFS_ERR_ISDIR\n- after:  lfs_file_open(\"missing/\") \u003d\u003e LFS_ERR_NOTDIR\n\nAs noted by bmcdonnell-fb, returning LFS_ERR_ISDIR here was inconsistent\nwith the case where the file exists:\n\n  case                           before          after\n  lfs_file_open(\"dir_a\")      \u003d\u003e LFS_ERR_ISDIR   LFS_ERR_ISDIR\n  lfs_file_open(\"dir_a/\")     \u003d\u003e LFS_ERR_ISDIR   LFS_ERR_ISDIR\n  lfs_file_open(\"reg_a/\")     \u003d\u003e LFS_ERR_NOTDIR  LFS_ERR_NOTDIR\n  lfs_file_open(\"missing_a/\") \u003d\u003e LFS_ERR_ISDIR   LFS_ERR_NOTDIR\n\nNote this is consistent with the behavior of lfs_stat:\n\n  lfs_file_open(\"reg_a/\") \u003d\u003e LFS_ERR_NOTDIR\n  lfs_stat(\"reg_a/\")      \u003d\u003e LFS_ERR_NOTDIR\n\nAnd the only other function that can \"create\" files, lfs_rename:\n\n  lfs_file_open(\"missing_a/\")       \u003d\u003e LFS_ERR_NOTDIR\n  lfs_rename(\"reg_a\", \"missing_a/\") \u003d\u003e LFS_ERR_NOTDIR\n\nThere is some ongoing discussion about if these should return NOTDIR,\nISDIR, or INVAL, but this is at least an improvement over the\nrename/open mismatch.\n"
    },
    {
      "commit": "b735c8fd7f948e4db34f063c52086b802d095f28",
      "tree": "d58c5832046b0927c04b61dd5bd8a9d72658f96f",
      "parents": [
        "30947054d4a3f59300fc2f7bd66f7727cd911cd8"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 15:16:01 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 15:40:15 2024 -0600"
      },
      "message": "paths: Added tests over NOENT + trailing slash/dot\n\n- test_paths_noent_trailing_slashes\n- test_paths_noent_trailing_dots\n- test_paths_noent_trailing_dotdots\n\nThese managed to slip through our path testing but should be tested, if\nanything just to know exactly what errors these return.\n"
    },
    {
      "commit": "30947054d4a3f59300fc2f7bd66f7727cd911cd8",
      "tree": "a8959d5c548460fb2f5cb11e77c1f9a9890efe35",
      "parents": [
        "80ca1ea300a7a969984ab4b9afd04f276fba40a8"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 14:26:50 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 15:40:15 2024 -0600"
      },
      "message": "paths: Extended tests to cover open with CREAT/EXCL\n\nThese flags change the behavior of open quite significantly. It\u0027s useful\nto cover these in our path tests so the behavior is locked down.\n"
    },
    {
      "commit": "80ca1ea300a7a969984ab4b9afd04f276fba40a8",
      "tree": "9ac72daac493f91bec97d11ad65a239665db8e51",
      "parents": [
        "815f0d85a53d2ae7fa99ec0be8cf0d86b90dc780"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Sat Nov 23 18:25:40 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 15:40:15 2024 -0600"
      },
      "message": "paths: Reject empty paths\n\nBefore this, the empty path (\"\") was treated as an alias for the root.\nThis was unintentional and just a side-effect of how the path parser\nworked.\n\nNow, the empty path should always result in LFS_ERR_INVAL:\n\n- before: lfs_stat(\"\") \u003d\u003e 0\n- after:  lfs_stat(\"\") \u003d\u003e LFS_ERR_INVAL\n"
    },
    {
      "commit": "815f0d85a53d2ae7fa99ec0be8cf0d86b90dc780",
      "tree": "356c4995703f0dd2bfdfe37eaedc64e0ad8c81b1",
      "parents": [
        "dc92dec6d3f41213c4d0011c440195c991ef38a4"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Sat Nov 23 01:49:08 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 15:40:15 2024 -0600"
      },
      "message": "paths: Fixed dots followed by dotdots\n\nUnlike normal files, dots (\".\") should not change the depth when\nattempting to skip dotdot (\"..\") entries.\n\nA weird nuance in the path parser, but at least it had a relatively easy\nfix.\n\nAdded test_paths_dot_dotdots to prevent a regression.\n"
    },
    {
      "commit": "dc92dec6d3f41213c4d0011c440195c991ef38a4",
      "tree": "b3822957d255cdb3fc8bb265fb06a192793275b2",
      "parents": [
        "a6035071bede7308d30f38c26594b90e5c21395a"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Sat Nov 23 01:23:11 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 15:40:07 2024 -0600"
      },
      "message": "paths: Reject dotdots above root\n\nThis changes the behavior of paths that attempt to navigate above root\nto now return LFS_ERR_INVAL:\n\n- before: lfs_stat(\"/../a\") \u003d\u003e 0\n- after:  lfs_stat(\"/../a\") \u003d\u003e LFS_ERR_INVAL\n\nThis is a bit of an opinionated change while making other path\nresolution tweaks.\n\nIn terms of POSIX-compatibility, it\u0027s a bit unclear exactly what dotdots\nabove the root should do.\n\nPOSIX notes:\n\n\u003e As a special case, in the root directory, dot-dot may refer to the\n\u003e root directory itself.\n\nBut the word choice of \"may\" implies it is up to the implementation.\n\nI originally implement this as a root-loop simply because that is what\nmy Linux machine does, but I now think that\u0027s not the best option. Since\nwe\u0027re making other path-related tweaks, we might as well try to adopt\nbehavior that is, in my opinion, safer and less... weird...\n\nThis should also help make paths more consistent with future theoretical\nopenat-list APIs, where saturating at the current directory is sort of\nthe least expected behavior.\n"
    },
    {
      "commit": "a6035071bede7308d30f38c26594b90e5c21395a",
      "tree": "470f1a9ddf35ece07f99a36286654d2ddd6fbcbf",
      "parents": [
        "232e736aae99dda27a0a6f3b37e94c3c7c7e61cb"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Nov 22 17:07:51 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Mon Nov 25 15:39:29 2024 -0600"
      },
      "message": "paths: Fixed/doc trailing slash/dot POSIX incompatibilities\n\n- lfs_mkdir now accepts trailing slashes:\n  - before: lfs_mkdir(\"a/\") \u003d\u003e LFS_ERR_NOENT\n  - after:  lfs_mkdir(\"a/\") \u003d\u003e 0\n\n- lfs_stat, lfs_getattr, etc, now reject trailing slashes if the file is\n  not a directory:\n  - before: lfs_stat(\"reg_a/\") \u003d\u003e 0\n  - after:  lfs_stat(\"reg_a/\") \u003d\u003e LFS_ERR_NOTDIR\n\n  Note trailing slashes are accepted if the file is a directory:\n  - before: lfs_stat(\"dir_a/\") \u003d\u003e 0\n  - after:  lfs_stat(\"dir_a/\") \u003d\u003e 0\n\n- lfs_file_open now returns LFS_ERR_NOTDIR if the file exists but the\n  path contains trailing slashes:\n  - before: lfs_file_open(\"reg_a/\") \u003d\u003e LFS_ERR_NOENT\n  - after:  lfs_file_open(\"reg_a/\") \u003d\u003e LFS_ERR_NOTDIR\n\nTo make these work, the internal lfs_dir_find API required some\ninteresting changes:\n\n- lfs_dir_find no longer sets id\u003d0x3ff on not finding a parent entry in\n  the path. Instead, lfs_path_islast can be used to determine if the\n  modified path references a parent entry or child entry based on the\n  remainder of the path string.\n\n  Note this is only necessary for functions that create new entries\n  (lfs_mkdir, lfs_rename, lfs_file_open).\n\n- Trailing slashes mean we can no longer rely on the modified path being\n  NULL-terminated. lfs_path_namelen provides an alternative to strlen\n  that stops at slash or NULL.\n\n- lfs_path_isdir also tells you if the modified path must reference a\n  dir (contains trailing slashes). I considered handling this entirely\n  in lfs_dir_find, but the behavior of entry-creating functions is too\n  nuanced.\n\n  At least lfs_dir_find returns LFS_ERR_NOTDIR if the file exists on\n  disk.\n\nLike strlen, lfs_path_namelen/islast/isdir are all O(n) where n is the\nname length. This isn\u0027t great, but if you\u0027re using filenames large\nenough for this to actually matter... uh... open an issue on GitHub and\nwe might improve this in the future.\n\n---\n\nThere are a couple POSIX incompatibilities that I think are not\nworth fixing:\n\n- Root modifications return EINVAL instead of EBUSY:\n  - littlefs: remove(\"/\") \u003d\u003e EINVAL\n  - POSIX:    remove(\"/\") \u003d\u003e EBUSY\n  Reason: This would be the only use of EBUSY in the system.\n\n- We accept modifications of directories with trailing dots:\n  - littlefs: remove(\"a/.\") \u003d\u003e 0\n  - POSIX:    remove(\"a/.\") \u003d\u003e EBUSY\n  Reason: Not worth implementing.\n\n- We do not check for existence of directories followed by dotdots:\n  - littlefs: stat(\"a/missing/..\") \u003d\u003e 0\n  - POSIX:    stat(\"a/missing/..\") \u003d\u003e ENOENT\n  Reason: Difficult to implement non-recursively.\n\n- We accept modifications of directories with trailing dotdots:\n  - littlefs: rename(\"a/b/..\", \"c\") \u003d\u003e 0\n  - POSIX:    rename(\"a/b/..\", \"c\") \u003d\u003e EBUSY\n  Reason: Not worth implementing.\n\nThese are at least now documented in tests/test_paths.toml, which isn\u0027t\nthe greatest location, but it\u0027s at least something until a better\ndocument is created.\n\nNote that these don\u0027t really belong in SPEC.md because path parsing is\na function of the driver and has no impact on disk.\n"
    },
    {
      "commit": "232e736aae99dda27a0a6f3b37e94c3c7c7e61cb",
      "tree": "f110923a78a59f4e044facb02992856626f1b320",
      "parents": [
        "0de0389c6f83860826c5a3340d41256966f3ac08"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed Nov 20 18:38:23 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Sat Nov 23 19:03:36 2024 -0600"
      },
      "message": "paths: Added trailing slashes and dots tests\n\nAs expected these are failing and will need some work to pass.\n\nThe issue with lfs_file_open allowing trailing slashes was found by\nrob-zeno, and the issue with lfs_mkdir disallowing trailing slashes was\nfound by XinStellaris, PoppaChubby, pavel-kirienko, inf265, Xywzel,\nsteverpalmer, and likely others.\n"
    },
    {
      "commit": "0de0389c6f83860826c5a3340d41256966f3ac08",
      "tree": "8c0e0b1e2d88406fa39362911630215f9ed08753",
      "parents": [
        "b78afe25182182f4678346cb7fabad5424700724"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Wed Nov 20 17:30:18 2024 -0600"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Sat Nov 23 18:20:06 2024 -0600"
      },
      "message": "paths: Reworked test_paths to cover more corner cases\n\nThis should be a superset of the previous test_paths test suite, while\ncovering a couple more things (more APIs, more path synonyms, utf8,\nnon-printable ascii, non-utf8, etc).\n\nNot yet tested are some corner cases with known bugs, mainly around\ntrailing slashes.\n"
    },
    {
      "commit": "1407db95569ea3b4132b7801a702aa8e86bf416b",
      "tree": "462108b2035a63cccc45c3972e5d39f27bd94084",
      "parents": [
        "b78afe25182182f4678346cb7fabad5424700724"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Nov 01 16:56:08 2024 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Nov 01 17:09:45 2024 -0500"
      },
      "message": "Added links to ramcrc32bd and ramrsbd\n\nThese two small libraries provide examples of error-correction\ncompatible with littlefs (or any filesystem really).\n\nIt would be nice to eventually provide these as drop-in solutions, but\nright now it\u0027s not really possible without breaking changes to\nlittlefs\u0027s block device API.\n\nIn the meantime, ramcrc32bd and ramrsbd at least provide example\nimplementations that can be adapted to users\u0027 own block devices.\n"
    },
    {
      "commit": "ea431bd6aefd6f4f2a00b1b90bb15bcb0c9a411d",
      "tree": "f5d682def80b90c65e9d05f10f4f1806ac52844e",
      "parents": [
        "2d62d2f4c9f4743e090ce503fd5d4f9eb104da70"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Oct 04 13:29:03 2024 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Oct 04 13:45:57 2024 -0500"
      },
      "message": "Added some checks that metadata_max makes sense\n\nLike the read/prog/block_size checks, these are just asserts. If these\ninvariants are broken the filesystem will break in surprising ways.\n"
    },
    {
      "commit": "2d62d2f4c9f4743e090ce503fd5d4f9eb104da70",
      "tree": "7a4d79cf7a98ac522ba7a68bc47c88776708f8cf",
      "parents": [
        "1f82c0f27f8098f229106a95b09e6a97d0a24944"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Oct 04 13:19:40 2024 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Oct 04 13:45:43 2024 -0500"
      },
      "message": "Fixed metadata_max\u003d\u003dprog_size commit-\u003eend calculation\n\nThe inconsistency here between the use of block_size vs metadata_max was\nsuspicious. Turns out there\u0027s a bug when metadata_max \u003d\u003d prog_size.\n\nWe correctly use metadata_max for the block_size/2 check, but we weren\u0027t\nusing it for the block_size-40 check. The second check seems unnecessary\nafter the first, but it protects against running out of space in a\ncommit for commit-related metadata (checksums, tail pointers, etc) when\nwe can\u0027t program half-blocks.\n\nTurns out this is also needed when limiting metadata_max to a single\nprog, otherwise we risk erroring with LFS_ERR_NOSPC early.\n\nFound by ajheck, dpkristensen, NLLK, and likely others.\n"
    },
    {
      "commit": "1f82c0f27f8098f229106a95b09e6a97d0a24944",
      "tree": "24cadf0b841fc518af41db800e93acd5927cc1c9",
      "parents": [
        "b78afe25182182f4678346cb7fabad5424700724"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Thu Oct 03 16:34:45 2024 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Fri Oct 04 13:06:23 2024 -0500"
      },
      "message": "Added some metadata_max testing\n\n- Added METADATA_MAX to test_runner.\n- Added METADATA_MAX to bench_runner.\n- Added a simple metadata_max test to test_superblocks, for lack of\n  better location.\n\nThere have been several issues floating around related to metadata_max\nand LFS_ERR_NOSPC which makes me think there\u0027s a bug in our metadata_max\nlogic.\n\nmetadata_max was a quick patch and is relatively untested, so an\nundetected bug isn\u0027t too surprising. This commit adds at least some\ntesting over metadata_max.\n\nSure enough, the new test_superblocks_metadata_max test reveals a\ncurious LFS_ERR_NAMETOOLONG error that shouldn\u0027t be there.\n\nMore investigation needed.\n"
    },
    {
      "commit": "a2c2e49e6b87c1871bba3b3b3c6fbaf48154fa3f",
      "tree": "5d3a127e36e2fac7dd3dd2cfab819497ec81266f",
      "parents": [
        "b78afe25182182f4678346cb7fabad5424700724"
      ],
      "author": {
        "name": "wdfk-prog",
        "email": "1425075683@qq.com",
        "time": "Fri Oct 04 10:37:25 2024 +0800"
      },
      "committer": {
        "name": "wdfk-prog",
        "email": "1425075683@qq.com",
        "time": "Fri Oct 04 10:37:25 2024 +0800"
      },
      "message": "Write the detect cycles function as a function to optimize code\n"
    },
    {
      "commit": "abaec45652a1e8c79f812c3e868f6c1063e06c51",
      "tree": "0f90cf4c04aac622f480f0e94edd3a62e2ef8abd",
      "parents": [
        "f1c430e779b81d891e9ce7fa7ea5acbcbc98d312"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Sep 24 13:47:28 2024 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Sep 24 14:01:20 2024 -0500"
      },
      "message": "Fixed seek undefined behavior on signed integer overflow\n\nIn the previous implementation of lfs_file_seek, we calculated the new\noffset using signed arithmetic before checking for possible\noverflow/underflow conditions. This results in undefined behavior in C.\n\nFortunately for us, littlefs is now limited to 31-bit file sizes for API\nreasons, so we don\u0027t have to be too clever here. Doing the arithmetic\nwith unsigned integers and just checking if we\u0027re in a valid range\nafterwards should work.\n\nFound by m-kostrzewa and lucic71\n"
    },
    {
      "commit": "f1c430e779b81d891e9ce7fa7ea5acbcbc98d312",
      "tree": "b0627026add67310c44e460c0121db16f2b310bc",
      "parents": [
        "b78afe25182182f4678346cb7fabad5424700724"
      ],
      "author": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Sep 24 13:31:23 2024 -0500"
      },
      "committer": {
        "name": "Christopher Haster",
        "email": "geky@geky.net",
        "time": "Tue Sep 24 14:01:08 2024 -0500"
      },
      "message": "Added some tests around seek integer overflow/underflow\n\nOriginal tests provided by m-kostrzewa, these identify signed overflow\n(undefined behavior) when compiled with -fsanitize\u003dundefined.\n"
    }
  ],
  "next": "4a845be0beccda3d9872eb4935f471e2eb245553"
}
