Skip to content

Commit 8621b61

Browse files
committed
Adopted 0xffffffff as null pointer
- Default value of most flash-based storage - Avoids 0 == superblock/dir issue - Usually causes assertions in bd driver layer - Easier to notice in hex dumps
1 parent 4808e9a commit 8621b61

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

lfs.c

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ static int lfs_cache_read(lfs_t *lfs, lfs_cache_t *rcache,
1717
const lfs_cache_t *pcache, lfs_block_t block,
1818
lfs_off_t off, void *buffer, lfs_size_t size) {
1919
uint8_t *data = buffer;
20+
assert(block < lfs->cfg->block_count);
2021

2122
while (size > 0) {
2223
if (pcache && block == pcache->block && off >= pcache->off &&
@@ -73,14 +74,14 @@ static int lfs_cache_read(lfs_t *lfs, lfs_cache_t *rcache,
7374
}
7475

7576
static int lfs_cache_flush(lfs_t *lfs, lfs_cache_t *cache) {
76-
if (cache->off != -1) {
77+
if (cache->block != 0xffffffff) {
7778
int err = lfs->cfg->prog(lfs->cfg, cache->block,
7879
cache->off, cache->buffer, lfs->cfg->prog_size);
7980
if (err) {
8081
return err;
8182
}
8283

83-
cache->off = -1;
84+
cache->block = 0xffffffff;
8485
}
8586

8687
return 0;
@@ -89,6 +90,7 @@ static int lfs_cache_flush(lfs_t *lfs, lfs_cache_t *cache) {
8990
static int lfs_cache_prog(lfs_t *lfs, lfs_cache_t *cache, lfs_block_t block,
9091
lfs_off_t off, const void *buffer, lfs_size_t size) {
9192
const uint8_t *data = buffer;
93+
assert(block < lfs->cfg->block_count);
9294

9395
while (size > 0) {
9496
if (block == cache->block && off >= cache->off &&
@@ -115,7 +117,7 @@ static int lfs_cache_prog(lfs_t *lfs, lfs_cache_t *cache, lfs_block_t block,
115117

116118
// cache must have been flushed, either by programming and
117119
// entire block or manually flushing the cache
118-
assert(cache->off == -1);
120+
assert(cache->block == 0xffffffff);
119121

120122
if (off % lfs->cfg->prog_size == 0 &&
121123
size >= lfs->cfg->prog_size) {
@@ -264,7 +266,7 @@ static inline void lfs_pairswap(lfs_block_t pair[2]) {
264266
}
265267

266268
static inline bool lfs_pairisnull(const lfs_block_t pair[2]) {
267-
return !pair[0] && !pair[1];
269+
return pair[0] == 0xffffffff || pair[1] == 0xffffffff;
268270
}
269271

270272
static inline int lfs_paircmp(
@@ -298,8 +300,8 @@ static int lfs_dir_alloc(lfs_t *lfs, lfs_dir_t *dir) {
298300
// set defaults
299301
dir->d.rev += 1;
300302
dir->d.size = sizeof(dir->d);
301-
dir->d.tail[0] = 0;
302-
dir->d.tail[1] = 0;
303+
dir->d.tail[0] = -1;
304+
dir->d.tail[1] = -1;
303305
dir->off = sizeof(dir->d);
304306

305307
// don't write out yet, let caller take care of that
@@ -872,7 +874,7 @@ static int lfs_index_find(lfs_t *lfs,
872874
lfs_block_t head, lfs_size_t size,
873875
lfs_size_t pos, lfs_block_t *block, lfs_off_t *off) {
874876
if (size == 0) {
875-
*block = 0;
877+
*block = -1;
876878
*off = 0;
877879
return 0;
878880
}
@@ -1019,7 +1021,7 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
10191021
// create entry to remember name
10201022
entry.d.type = LFS_TYPE_REG;
10211023
entry.d.len = sizeof(entry.d) + strlen(path);
1022-
entry.d.u.file.head = 0;
1024+
entry.d.u.file.head = -1;
10231025
entry.d.u.file.size = 0;
10241026
err = lfs_dir_append(lfs, &cwd, &entry, path);
10251027
if (err) {
@@ -1039,15 +1041,15 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
10391041
file->size = entry.d.u.file.size;
10401042
file->flags = flags;
10411043
file->pos = 0;
1042-
file->block = 0;
1044+
file->block = -1; // TODO rm me?
10431045

10441046
if (flags & LFS_O_TRUNC) {
1045-
file->head = 0;
1047+
file->head = -1;
10461048
file->size = 0;
10471049
}
10481050

10491051
// allocate buffer if needed
1050-
file->cache.off = -1;
1052+
file->cache.block = 0xffffffff;
10511053
if (lfs->cfg->file_buffer) {
10521054
file->cache.buffer = lfs->cfg->file_buffer;
10531055
} else if ((file->flags & 3) == LFS_O_RDONLY) {
@@ -1091,7 +1093,7 @@ int lfs_file_close(lfs_t *lfs, lfs_file_t *file) {
10911093
static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) {
10921094
if (file->flags & LFS_F_READING) {
10931095
// just drop read cache
1094-
file->cache.off = -1;
1096+
file->cache.block = 0xffffffff;
10951097
file->flags &= ~LFS_F_READING;
10961098
}
10971099

@@ -1106,7 +1108,7 @@ static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) {
11061108
.pos = file->pos,
11071109
.cache = lfs->rcache,
11081110
};
1109-
lfs->rcache.off = -1;
1111+
lfs->rcache.block = 0xffffffff;
11101112

11111113
while (file->pos < file->size) {
11121114
// copy over a byte at a time, leave it up to caching
@@ -1123,9 +1125,9 @@ static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) {
11231125
}
11241126

11251127
// keep our reference to the rcache in sync
1126-
if (lfs->rcache.off != -1) {
1127-
orig.cache.off = -1;
1128-
lfs->rcache.off = -1;
1128+
if (lfs->rcache.block != 0xffffffff) {
1129+
orig.cache.block = 0xffffffff;
1130+
lfs->rcache.block = 0xffffffff;
11291131
}
11301132
}
11311133

@@ -1273,7 +1275,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file,
12731275
}
12741276

12751277
// mark cache as dirty since we may have read data into it
1276-
file->cache.off = -1;
1278+
file->cache.block = 0xffffffff;
12771279
file->flags |= LFS_F_WRITING;
12781280
}
12791281

@@ -1515,7 +1517,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
15151517
lfs->words = lfs->cfg->block_size / sizeof(uint32_t);
15161518

15171519
// setup read cache
1518-
lfs->rcache.off = -1;
1520+
lfs->rcache.block = 0xffffffff;
15191521
if (lfs->cfg->read_buffer) {
15201522
lfs->rcache.buffer = lfs->cfg->read_buffer;
15211523
} else {
@@ -1526,7 +1528,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
15261528
}
15271529

15281530
// setup program cache
1529-
lfs->pcache.off = -1;
1531+
lfs->pcache.block = 0xffffffff;
15301532
if (lfs->cfg->prog_buffer) {
15311533
lfs->pcache.buffer = lfs->cfg->prog_buffer;
15321534
} else {

0 commit comments

Comments
 (0)