mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 08:42:40 +01:00 
			
		
		
		
	Generated v2 prefixes
This commit is contained in:
		
							
								
								
									
										128
									
								
								lfs2.c
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								lfs2.c
									
									
									
									
									
								
							| @@ -425,7 +425,8 @@ static inline void lfs2_superblock_tole32(lfs2_superblock_t *superblock) { | ||||
|     superblock->attr_max    = lfs2_tole32(superblock->attr_max); | ||||
| } | ||||
|  | ||||
| static inline bool lfs2_mlist_isopen(struct lfs2_mlist *head, | ||||
| #ifndef LFS2_NO_ASSERT | ||||
| static bool lfs2_mlist_isopen(struct lfs2_mlist *head, | ||||
|         struct lfs2_mlist *node) { | ||||
|     for (struct lfs2_mlist **p = &head; *p; p = &(*p)->next) { | ||||
|         if (*p == (struct lfs2_mlist*)node) { | ||||
| @@ -435,8 +436,9 @@ static inline bool lfs2_mlist_isopen(struct lfs2_mlist *head, | ||||
|  | ||||
|     return false; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static inline void lfs2_mlist_remove(lfs2_t *lfs2, struct lfs2_mlist *mlist) { | ||||
| static void lfs2_mlist_remove(lfs2_t *lfs2, struct lfs2_mlist *mlist) { | ||||
|     for (struct lfs2_mlist **p = &lfs2->mlist; *p; p = &(*p)->next) { | ||||
|         if (*p == mlist) { | ||||
|             *p = (*p)->next; | ||||
| @@ -445,7 +447,7 @@ static inline void lfs2_mlist_remove(lfs2_t *lfs2, struct lfs2_mlist *mlist) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| static inline void lfs2_mlist_append(lfs2_t *lfs2, struct lfs2_mlist *mlist) { | ||||
| static void lfs2_mlist_append(lfs2_t *lfs2, struct lfs2_mlist *mlist) { | ||||
|     mlist->next = lfs2->mlist; | ||||
|     lfs2->mlist = mlist; | ||||
| } | ||||
| @@ -465,7 +467,7 @@ static int lfs2_file_rawsync(lfs2_t *lfs2, lfs2_file_t *file); | ||||
| static int lfs2_file_outline(lfs2_t *lfs2, lfs2_file_t *file); | ||||
| static int lfs2_file_flush(lfs2_t *lfs2, lfs2_file_t *file); | ||||
|  | ||||
| static void lfs2_fs_preporphans(lfs2_t *lfs2, int8_t orphans); | ||||
| static int lfs2_fs_preporphans(lfs2_t *lfs2, int8_t orphans); | ||||
| static void lfs2_fs_prepmove(lfs2_t *lfs2, | ||||
|         uint16_t id, const lfs2_block_t pair[2]); | ||||
| static int lfs2_fs_pred(lfs2_t *lfs2, const lfs2_block_t dir[2], | ||||
| @@ -1589,7 +1591,8 @@ static int lfs2_dir_compact(lfs2_t *lfs2, | ||||
|         // for metadata updates. | ||||
|         if (end - begin < 0xff && | ||||
|                 size <= lfs2_min(lfs2->cfg->block_size - 36, | ||||
|                     lfs2_alignup(lfs2->cfg->block_size/2, | ||||
|                     lfs2_alignup((lfs2->cfg->metadata_max ? | ||||
|                             lfs2->cfg->metadata_max : lfs2->cfg->block_size)/2, | ||||
|                         lfs2->cfg->prog_size))) { | ||||
|             break; | ||||
|         } | ||||
| @@ -1674,7 +1677,8 @@ static int lfs2_dir_compact(lfs2_t *lfs2, | ||||
|                 .crc = 0xffffffff, | ||||
|  | ||||
|                 .begin = 0, | ||||
|                 .end = lfs2->cfg->block_size - 8, | ||||
|                 .end = (lfs2->cfg->metadata_max ? | ||||
|                     lfs2->cfg->metadata_max : lfs2->cfg->block_size) - 8, | ||||
|             }; | ||||
|  | ||||
|             // erase block to write to | ||||
| @@ -1884,7 +1888,8 @@ static int lfs2_dir_commit(lfs2_t *lfs2, lfs2_mdir_t *dir, | ||||
|             .crc = 0xffffffff, | ||||
|  | ||||
|             .begin = dir->off, | ||||
|             .end = lfs2->cfg->block_size - 8, | ||||
|             .end = (lfs2->cfg->metadata_max ? | ||||
|                 lfs2->cfg->metadata_max : lfs2->cfg->block_size) - 8, | ||||
|         }; | ||||
|  | ||||
|         // traverse attrs that need to be written out | ||||
| @@ -2061,7 +2066,10 @@ static int lfs2_rawmkdir(lfs2_t *lfs2, const char *path) { | ||||
|     // current block end of list? | ||||
|     if (cwd.m.split) { | ||||
|         // update tails, this creates a desync | ||||
|         lfs2_fs_preporphans(lfs2, +1); | ||||
|         err = lfs2_fs_preporphans(lfs2, +1); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         // it's possible our predecessor has to be relocated, and if | ||||
|         // our parent is our predecessor's predecessor, this could have | ||||
| @@ -2081,7 +2089,10 @@ static int lfs2_rawmkdir(lfs2_t *lfs2, const char *path) { | ||||
|         } | ||||
|  | ||||
|         lfs2->mlist = cwd.next; | ||||
|         lfs2_fs_preporphans(lfs2, -1); | ||||
|         err = lfs2_fs_preporphans(lfs2, -1); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // now insert into our parent block | ||||
| @@ -2966,7 +2977,9 @@ static lfs2_ssize_t lfs2_file_rawwrite(lfs2_t *lfs2, lfs2_file_t *file, | ||||
|     if ((file->flags & LFS2_F_INLINE) && | ||||
|             lfs2_max(file->pos+nsize, file->ctz.size) > | ||||
|             lfs2_min(0x3fe, lfs2_min( | ||||
|                 lfs2->cfg->cache_size, lfs2->cfg->block_size/8))) { | ||||
|                 lfs2->cfg->cache_size, | ||||
|                 (lfs2->cfg->metadata_max ? | ||||
|                     lfs2->cfg->metadata_max : lfs2->cfg->block_size) / 8))) { | ||||
|         // inline file doesn't fit anymore | ||||
|         int err = lfs2_file_outline(lfs2, file); | ||||
|         if (err) { | ||||
| @@ -3048,14 +3061,6 @@ relocate: | ||||
|  | ||||
| static lfs2_soff_t lfs2_file_rawseek(lfs2_t *lfs2, lfs2_file_t *file, | ||||
|         lfs2_soff_t off, int whence) { | ||||
| #ifndef LFS2_READONLY | ||||
|     // write out everything beforehand, may be noop if rdonly | ||||
|     int err = lfs2_file_flush(lfs2, file); | ||||
|     if (err) { | ||||
|         return err; | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     // find new pos | ||||
|     lfs2_off_t npos = file->pos; | ||||
|     if (whence == LFS2_SEEK_SET) { | ||||
| @@ -3063,7 +3068,7 @@ static lfs2_soff_t lfs2_file_rawseek(lfs2_t *lfs2, lfs2_file_t *file, | ||||
|     } else if (whence == LFS2_SEEK_CUR) { | ||||
|         npos = file->pos + off; | ||||
|     } else if (whence == LFS2_SEEK_END) { | ||||
|         npos = file->ctz.size + off; | ||||
|         npos = lfs2_file_rawsize(lfs2, file) + off; | ||||
|     } | ||||
|  | ||||
|     if (npos > lfs2->file_max) { | ||||
| @@ -3071,6 +3076,19 @@ static lfs2_soff_t lfs2_file_rawseek(lfs2_t *lfs2, lfs2_file_t *file, | ||||
|         return LFS2_ERR_INVAL; | ||||
|     } | ||||
|  | ||||
|     if (file->pos == npos) { | ||||
|         // noop - position has not changed | ||||
|         return npos; | ||||
|     } | ||||
|  | ||||
| #ifndef LFS2_READONLY | ||||
|     // write out everything beforehand, may be noop if rdonly | ||||
|     int err = lfs2_file_flush(lfs2, file); | ||||
|     if (err) { | ||||
|         return err; | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     // update pos | ||||
|     file->pos = npos; | ||||
|     return npos; | ||||
| @@ -3101,21 +3119,22 @@ static int lfs2_file_rawtruncate(lfs2_t *lfs2, lfs2_file_t *file, lfs2_off_t siz | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         // need to set pos/block/off consistently so seeking back to | ||||
|         // the old position does not get confused | ||||
|         file->pos = size; | ||||
|         file->ctz.head = file->block; | ||||
|         file->ctz.size = size; | ||||
|         file->flags |= LFS2_F_DIRTY | LFS2_F_READING; | ||||
|     } else if (size > oldsize) { | ||||
|         // flush+seek if not already at end | ||||
|         if (file->pos != oldsize) { | ||||
|             lfs2_soff_t res = lfs2_file_rawseek(lfs2, file, 0, LFS2_SEEK_END); | ||||
|             if (res < 0) { | ||||
|                 return (int)res; | ||||
|             } | ||||
|         lfs2_soff_t res = lfs2_file_rawseek(lfs2, file, 0, LFS2_SEEK_END); | ||||
|         if (res < 0) { | ||||
|             return (int)res; | ||||
|         } | ||||
|  | ||||
|         // fill with zeros | ||||
|         while (file->pos < size) { | ||||
|             lfs2_ssize_t res = lfs2_file_rawwrite(lfs2, file, &(uint8_t){0}, 1); | ||||
|             res = lfs2_file_rawwrite(lfs2, file, &(uint8_t){0}, 1); | ||||
|             if (res < 0) { | ||||
|                 return (int)res; | ||||
|             } | ||||
| @@ -3206,7 +3225,10 @@ static int lfs2_rawremove(lfs2_t *lfs2, const char *path) { | ||||
|         } | ||||
|  | ||||
|         // mark fs as orphaned | ||||
|         lfs2_fs_preporphans(lfs2, +1); | ||||
|         err = lfs2_fs_preporphans(lfs2, +1); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         // I know it's crazy but yes, dir can be changed by our parent's | ||||
|         // commit (if predecessor is child) | ||||
| @@ -3226,7 +3248,10 @@ static int lfs2_rawremove(lfs2_t *lfs2, const char *path) { | ||||
|     lfs2->mlist = dir.next; | ||||
|     if (lfs2_tag_type3(tag) == LFS2_TYPE_DIR) { | ||||
|         // fix orphan | ||||
|         lfs2_fs_preporphans(lfs2, -1); | ||||
|         err = lfs2_fs_preporphans(lfs2, -1); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         err = lfs2_fs_pred(lfs2, dir.m.pair, &cwd); | ||||
|         if (err) { | ||||
| @@ -3312,7 +3337,10 @@ static int lfs2_rawrename(lfs2_t *lfs2, const char *oldpath, const char *newpath | ||||
|         } | ||||
|  | ||||
|         // mark fs as orphaned | ||||
|         lfs2_fs_preporphans(lfs2, +1); | ||||
|         err = lfs2_fs_preporphans(lfs2, +1); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         // I know it's crazy but yes, dir can be changed by our parent's | ||||
|         // commit (if predecessor is child) | ||||
| @@ -3355,7 +3383,10 @@ static int lfs2_rawrename(lfs2_t *lfs2, const char *oldpath, const char *newpath | ||||
|     lfs2->mlist = prevdir.next; | ||||
|     if (prevtag != LFS2_ERR_NOENT && lfs2_tag_type3(prevtag) == LFS2_TYPE_DIR) { | ||||
|         // fix orphan | ||||
|         lfs2_fs_preporphans(lfs2, -1); | ||||
|         err = lfs2_fs_preporphans(lfs2, -1); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         err = lfs2_fs_pred(lfs2, prevdir.m.pair, &newcwd); | ||||
|         if (err) { | ||||
| @@ -3536,6 +3567,8 @@ static int lfs2_init(lfs2_t *lfs2, const struct lfs2_config *cfg) { | ||||
|         lfs2->attr_max = LFS2_ATTR_MAX; | ||||
|     } | ||||
|  | ||||
|     LFS2_ASSERT(lfs2->cfg->metadata_max <= lfs2->cfg->block_size); | ||||
|  | ||||
|     // setup default state | ||||
|     lfs2->root[0] = LFS2_BLOCK_NULL; | ||||
|     lfs2->root[1] = LFS2_BLOCK_NULL; | ||||
| @@ -3616,12 +3649,6 @@ static int lfs2_rawformat(lfs2_t *lfs2, const struct lfs2_config *cfg) { | ||||
|             goto cleanup; | ||||
|         } | ||||
|  | ||||
|         // sanity check that fetch works | ||||
|         err = lfs2_dir_fetch(lfs2, &root, (const lfs2_block_t[2]){0, 1}); | ||||
|         if (err) { | ||||
|             goto cleanup; | ||||
|         } | ||||
|  | ||||
|         // force compaction to prevent accidentally mounting any | ||||
|         // older version of littlefs that may live on disk | ||||
|         root.erased = false; | ||||
| @@ -3629,6 +3656,12 @@ static int lfs2_rawformat(lfs2_t *lfs2, const struct lfs2_config *cfg) { | ||||
|         if (err) { | ||||
|             goto cleanup; | ||||
|         } | ||||
|  | ||||
|         // sanity check that fetch works | ||||
|         err = lfs2_dir_fetch(lfs2, &root, (const lfs2_block_t[2]){0, 1}); | ||||
|         if (err) { | ||||
|             goto cleanup; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| cleanup: | ||||
| @@ -3829,7 +3862,7 @@ int lfs2_fs_rawtraverse(lfs2_t *lfs2, | ||||
|                 if (err) { | ||||
|                     return err; | ||||
|                 } | ||||
|             } else if (includeorphans &&  | ||||
|             } else if (includeorphans && | ||||
|                     lfs2_tag_type3(tag) == LFS2_TYPE_DIRSTRUCT) { | ||||
|                 for (int i = 0; i < 2; i++) { | ||||
|                     err = cb(data, (&ctz.head)[i]); | ||||
| @@ -3986,7 +4019,10 @@ static int lfs2_fs_relocate(lfs2_t *lfs2, | ||||
|  | ||||
|     if (tag != LFS2_ERR_NOENT) { | ||||
|         // update disk, this creates a desync | ||||
|         lfs2_fs_preporphans(lfs2, +1); | ||||
|         int err = lfs2_fs_preporphans(lfs2, +1); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         // fix pending move in this pair? this looks like an optimization but | ||||
|         // is in fact _required_ since relocating may outdate the move. | ||||
| @@ -4003,7 +4039,7 @@ static int lfs2_fs_relocate(lfs2_t *lfs2, | ||||
|         } | ||||
|  | ||||
|         lfs2_pair_tole32(newpair); | ||||
|         int err = lfs2_dir_commit(lfs2, &parent, LFS2_MKATTRS( | ||||
|         err = lfs2_dir_commit(lfs2, &parent, LFS2_MKATTRS( | ||||
|                 {LFS2_MKTAG_IF(moveid != 0x3ff, | ||||
|                     LFS2_TYPE_DELETE, moveid, 0), NULL}, | ||||
|                 {tag, newpair})); | ||||
| @@ -4013,7 +4049,10 @@ static int lfs2_fs_relocate(lfs2_t *lfs2, | ||||
|         } | ||||
|  | ||||
|         // next step, clean up orphans | ||||
|         lfs2_fs_preporphans(lfs2, -1); | ||||
|         err = lfs2_fs_preporphans(lfs2, -1); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // find pred | ||||
| @@ -4052,11 +4091,13 @@ static int lfs2_fs_relocate(lfs2_t *lfs2, | ||||
| #endif | ||||
|  | ||||
| #ifndef LFS2_READONLY | ||||
| static void lfs2_fs_preporphans(lfs2_t *lfs2, int8_t orphans) { | ||||
| static int lfs2_fs_preporphans(lfs2_t *lfs2, int8_t orphans) { | ||||
|     LFS2_ASSERT(lfs2_tag_size(lfs2->gstate.tag) > 0 || orphans >= 0); | ||||
|     lfs2->gstate.tag += orphans; | ||||
|     lfs2->gstate.tag = ((lfs2->gstate.tag & ~LFS2_MKTAG(0x800, 0, 0)) | | ||||
|             ((uint32_t)lfs2_gstate_hasorphans(&lfs2->gstate) << 31)); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @@ -4173,8 +4214,7 @@ static int lfs2_fs_deorphan(lfs2_t *lfs2) { | ||||
|     } | ||||
|  | ||||
|     // mark orphans as fixed | ||||
|     lfs2_fs_preporphans(lfs2, -lfs2_gstate_getorphans(&lfs2->gstate)); | ||||
|     return 0; | ||||
|     return lfs2_fs_preporphans(lfs2, -lfs2_gstate_getorphans(&lfs2->gstate)); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @@ -4723,7 +4763,7 @@ static int lfs2_rawmigrate(lfs2_t *lfs2, const struct lfs2_config *cfg) { | ||||
|  | ||||
|                 lfs21_entry_tole32(&entry1.d); | ||||
|                 err = lfs2_dir_commit(lfs2, &dir2, LFS2_MKATTRS( | ||||
|                         {LFS2_MKTAG(LFS2_TYPE_CREATE, id, 0)}, | ||||
|                         {LFS2_MKTAG(LFS2_TYPE_CREATE, id, 0), NULL}, | ||||
|                         {LFS2_MKTAG_IF_ELSE(isdir, | ||||
|                             LFS2_TYPE_DIR, id, entry1.d.nlen, | ||||
|                             LFS2_TYPE_REG, id, entry1.d.nlen), | ||||
| @@ -4828,7 +4868,7 @@ static int lfs2_rawmigrate(lfs2_t *lfs2, const struct lfs2_config *cfg) { | ||||
|  | ||||
|         lfs2_superblock_tole32(&superblock); | ||||
|         err = lfs2_dir_commit(lfs2, &dir2, LFS2_MKATTRS( | ||||
|                 {LFS2_MKTAG(LFS2_TYPE_CREATE, 0, 0)}, | ||||
|                 {LFS2_MKTAG(LFS2_TYPE_CREATE, 0, 0), NULL}, | ||||
|                 {LFS2_MKTAG(LFS2_TYPE_SUPERBLOCK, 0, 8), "littlefs"}, | ||||
|                 {LFS2_MKTAG(LFS2_TYPE_INLINESTRUCT, 0, sizeof(superblock)), | ||||
|                     &superblock})); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user