mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			v2.2.0
			...
			fix-file-u
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | cb2e35143e | 
							
								
								
									
										38
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -415,6 +415,7 @@ static int lfs_dir_compact(lfs_t *lfs, | ||||
|         lfs_mdir_t *dir, const struct lfs_mattr *attrs, int attrcount, | ||||
|         lfs_mdir_t *source, uint16_t begin, uint16_t end); | ||||
| static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file); | ||||
| static int lfs_file_outline(lfs_t *lfs, lfs_file_t *file); | ||||
| static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file); | ||||
| static void lfs_fs_preporphans(lfs_t *lfs, int8_t orphans); | ||||
| static void lfs_fs_prepmove(lfs_t *lfs, | ||||
| @@ -633,8 +634,9 @@ static int lfs_dir_traverse_filter(void *p, | ||||
|     // check for redundancy | ||||
|     uint32_t mask = LFS_MKTAG(0x7ff, 0x3ff, 0); | ||||
|     if ((mask & tag) == (mask & *filtertag) || | ||||
|         (mask & tag) == (LFS_MKTAG(LFS_TYPE_DELETE, 0, 0) | | ||||
|             (LFS_MKTAG(0, 0x3ff, 0) & *filtertag))) { | ||||
|             lfs_tag_isdelete(*filtertag) || | ||||
|             (mask & tag) == (LFS_MKTAG(LFS_TYPE_DELETE, 0, 0) | | ||||
|                 (LFS_MKTAG(0, 0x3ff, 0) & *filtertag))) { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
| @@ -1643,11 +1645,7 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, | ||||
|         if (dir != &f->m && lfs_pair_cmp(f->m.pair, dir->pair) == 0 && | ||||
|                 f->type == LFS_TYPE_REG && (f->flags & LFS_F_INLINE) && | ||||
|                 f->ctz.size > lfs->cfg->cache_size) { | ||||
|             f->flags &= ~LFS_F_READING; | ||||
|             f->off = 0; | ||||
|  | ||||
|             lfs_alloc_ack(lfs); | ||||
|             int err = lfs_file_relocate(lfs, f); | ||||
|             int err = lfs_file_outline(lfs, f); | ||||
|             if (err) { | ||||
|                 return err; | ||||
|             } | ||||
| @@ -2473,7 +2471,6 @@ static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file) { | ||||
|         lfs_cache_zero(lfs, &lfs->pcache); | ||||
|  | ||||
|         file->block = nblock; | ||||
|         file->flags &= ~LFS_F_INLINE; | ||||
|         file->flags |= LFS_F_WRITING; | ||||
|         return 0; | ||||
|  | ||||
| @@ -2485,6 +2482,19 @@ relocate: | ||||
|     } | ||||
| } | ||||
|  | ||||
| static int lfs_file_outline(lfs_t *lfs, lfs_file_t *file) { | ||||
|     file->off = file->pos; | ||||
|     lfs_alloc_ack(lfs); | ||||
|     int err = lfs_file_relocate(lfs, file); | ||||
|     if (err) { | ||||
|         return err; | ||||
|     } | ||||
|  | ||||
|     file->flags &= ~LFS_F_INLINE; | ||||
|     file->flags |= LFS_F_OUTLINE; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) { | ||||
|     if (file->flags & LFS_F_READING) { | ||||
|         if (!(file->flags & LFS_F_INLINE)) { | ||||
| @@ -2596,6 +2606,9 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) { | ||||
|  | ||||
|             // commit file data and attributes | ||||
|             err = lfs_dir_commit(lfs, &file->m, LFS_MKATTRS( | ||||
|                     {file->flags & LFS_F_OUTLINE | ||||
|                         ? LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0x3ff) | ||||
|                         : LFS_MKTAG(LFS_FROM_NOOP, 0, 0), NULL}, | ||||
|                     {LFS_MKTAG(type, file->id, size), buffer}, | ||||
|                     {LFS_MKTAG(LFS_FROM_USERATTRS, file->id, | ||||
|                         file->cfg->attr_count), file->cfg->attrs})); | ||||
| @@ -2607,15 +2620,14 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) { | ||||
|                 return err; | ||||
|             } | ||||
|  | ||||
|             file->flags &= ~LFS_F_DIRTY; | ||||
|             file->flags &= ~LFS_F_DIRTY & ~LFS_F_OUTLINE; | ||||
|         } | ||||
|  | ||||
|         return 0; | ||||
|  | ||||
| relocate: | ||||
|         // inline file doesn't fit anymore | ||||
|         file->off = file->pos; | ||||
|         err = lfs_file_relocate(lfs, file); | ||||
|         err = lfs_file_outline(lfs, file); | ||||
|         if (err) { | ||||
|             file->flags |= LFS_F_ERRED; | ||||
|             return err; | ||||
| @@ -2740,9 +2752,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, | ||||
|             lfs_min(0x3fe, lfs_min( | ||||
|                 lfs->cfg->cache_size, lfs->cfg->block_size/8))) { | ||||
|         // inline file doesn't fit anymore | ||||
|         file->off = file->pos; | ||||
|         lfs_alloc_ack(lfs); | ||||
|         int err = lfs_file_relocate(lfs, file); | ||||
|         int err = lfs_file_outline(lfs, file); | ||||
|         if (err) { | ||||
|             file->flags |= LFS_F_ERRED; | ||||
|             return err; | ||||
|   | ||||
							
								
								
									
										15
									
								
								lfs.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								lfs.h
									
									
									
									
									
								
							| @@ -122,13 +122,13 @@ enum lfs_type { | ||||
| // File open flags | ||||
| enum lfs_open_flags { | ||||
|     // open flags | ||||
|     LFS_O_RDONLY = 1,         // Open a file as read only | ||||
|     LFS_O_WRONLY = 2,         // Open a file as write only | ||||
|     LFS_O_RDWR   = 3,         // Open a file as read and write | ||||
|     LFS_O_CREAT  = 0x0100,    // Create a file if it does not exist | ||||
|     LFS_O_EXCL   = 0x0200,    // Fail if a file already exists | ||||
|     LFS_O_TRUNC  = 0x0400,    // Truncate the existing file to zero size | ||||
|     LFS_O_APPEND = 0x0800,    // Move to end of file on every write | ||||
|     LFS_O_RDONLY  = 1,        // Open a file as read only | ||||
|     LFS_O_WRONLY  = 2,        // Open a file as write only | ||||
|     LFS_O_RDWR    = 3,        // Open a file as read and write | ||||
|     LFS_O_CREAT   = 0x0100,   // Create a file if it does not exist | ||||
|     LFS_O_EXCL    = 0x0200,   // Fail if a file already exists | ||||
|     LFS_O_TRUNC   = 0x0400,   // Truncate the existing file to zero size | ||||
|     LFS_O_APPEND  = 0x0800,   // Move to end of file on every write | ||||
|  | ||||
|     // internally used flags | ||||
|     LFS_F_DIRTY   = 0x010000, // File does not match storage | ||||
| @@ -136,6 +136,7 @@ enum lfs_open_flags { | ||||
|     LFS_F_READING = 0x040000, // File has been read since last flush | ||||
|     LFS_F_ERRED   = 0x080000, // An error occured during write | ||||
|     LFS_F_INLINE  = 0x100000, // Currently inlined in directory entry | ||||
|     LFS_F_OUTLINE = 0x200000, // Need to delete inlined directory entry | ||||
| }; | ||||
|  | ||||
| // File seek flags | ||||
|   | ||||
		Reference in New Issue
	
	Block a user