Browse Source

Possibility to add integer offset to file handles.

New buildtime config, SPIFFS_FILEHDL_OFFSET. If enabled
fh_ix_offset must be set in config struct before mounting.
pull/51/head
Peter Andersson 9 years ago
parent
commit
5ecf71f799
  1. 9
      src/default/spiffs_config.h
  2. 5
      src/spiffs.h
  3. 19
      src/spiffs_hydrogen.c
  4. 5
      src/test/params_test.h
  5. 5
      src/test/test_bugreports.c
  6. 36
      src/test/test_hydrogen.c
  7. 4
      src/test/test_spiffs.c

9
src/default/spiffs_config.h

@ -169,6 +169,15 @@
#define SPIFFS_HAL_CALLBACK_EXTRA 0 #define SPIFFS_HAL_CALLBACK_EXTRA 0
#endif #endif
// Enable this if you want to add an integer offset to all file handles
// (spiffs_file). This is useful if running multiple instances of spiffs on
// same target, in order to recognise to what spiffs instance a file handle
// belongs.
// NB: This adds config field fh_ix_offset in the configuration struct when
// mounting, which must be defined.
#ifndef SPIFFS_FILEHDL_OFFSET
#define SPIFFS_FILEHDL_OFFSET 0
#endif
// Set SPIFFS_TEST_VISUALISATION to non-zero to enable SPIFFS_vis function // Set SPIFFS_TEST_VISUALISATION to non-zero to enable SPIFFS_vis function
// in the api. This function will visualize all filesystem using given printf // in the api. This function will visualize all filesystem using given printf

5
src/spiffs.h

@ -186,6 +186,11 @@ typedef struct {
// logical size of a page, must be at least // logical size of a page, must be at least
// log_block_size / 8 // log_block_size / 8
u32_t log_page_size; u32_t log_page_size;
#endif
#if SPIFFS_FILEHDL_OFFSET
// an integer offset added to each file handle
u16_t fh_ix_offset;
#endif #endif
} spiffs_config; } spiffs_config;

19
src/spiffs_hydrogen.c

@ -8,6 +8,14 @@
#include "spiffs.h" #include "spiffs.h"
#include "spiffs_nucleus.h" #include "spiffs_nucleus.h"
#if SPIFFS_FILEHDL_OFFSET
#define SPIFFS_FH_OFFS(fs, fh) ((fh) != 0 ? ((fh) + (fs)->cfg.fh_ix_offset) : 0)
#define SPIFFS_FH_UNOFFS(fs, fh) ((fh) != 0 ? ((fh) - (fs)->cfg.fh_ix_offset) : 0)
#else
#define SPIFFS_FH_OFFS(fs, fh) (fh)
#define SPIFFS_FH_UNOFFS(fs, fh) (fh)
#endif
#if SPIFFS_CACHE == 1 #if SPIFFS_CACHE == 1
static s32_t spiffs_fflush_cache(spiffs *fs, spiffs_file fh); static s32_t spiffs_fflush_cache(spiffs *fs, spiffs_file fh);
#endif #endif
@ -236,7 +244,7 @@ spiffs_file SPIFFS_open(spiffs *fs, char *path, spiffs_flags flags, spiffs_mode
SPIFFS_UNLOCK(fs); SPIFFS_UNLOCK(fs);
return fd->file_nbr; return SPIFFS_FH_OFFS(fs, fd->file_nbr);
} }
spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_flags flags, spiffs_mode mode) { spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_flags flags, spiffs_mode mode) {
@ -266,7 +274,7 @@ spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_fl
SPIFFS_UNLOCK(fs); SPIFFS_UNLOCK(fs);
return fd->file_nbr; return SPIFFS_FH_OFFS(fs, fd->file_nbr);
} }
s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) { s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
@ -277,6 +285,7 @@ s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
spiffs_fd *fd; spiffs_fd *fd;
s32_t res; s32_t res;
fh = SPIFFS_FH_UNOFFS(fs, fh);
res = spiffs_fd_get(fs, fh, &fd); res = spiffs_fd_get(fs, fh, &fd);
SPIFFS_API_CHECK_RES_UNLOCK(fs, res); SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
@ -353,6 +362,7 @@ s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
s32_t res; s32_t res;
u32_t offset; u32_t offset;
fh = SPIFFS_FH_UNOFFS(fs, fh);
res = spiffs_fd_get(fs, fh, &fd); res = spiffs_fd_get(fs, fh, &fd);
SPIFFS_API_CHECK_RES_UNLOCK(fs, res); SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
@ -470,6 +480,7 @@ s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence) {
spiffs_fd *fd; spiffs_fd *fd;
s32_t res; s32_t res;
fh = SPIFFS_FH_UNOFFS(fs, fh);
res = spiffs_fd_get(fs, fh, &fd); res = spiffs_fd_get(fs, fh, &fd);
SPIFFS_API_CHECK_RES(fs, res); SPIFFS_API_CHECK_RES(fs, res);
@ -549,6 +560,7 @@ s32_t SPIFFS_fremove(spiffs *fs, spiffs_file fh) {
spiffs_fd *fd; spiffs_fd *fd;
s32_t res; s32_t res;
fh = SPIFFS_FH_UNOFFS(fs, fh);
res = spiffs_fd_get(fs, fh, &fd); res = spiffs_fd_get(fs, fh, &fd);
SPIFFS_API_CHECK_RES_UNLOCK(fs, res); SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
@ -618,6 +630,7 @@ s32_t SPIFFS_fstat(spiffs *fs, spiffs_file fh, spiffs_stat *s) {
spiffs_fd *fd; spiffs_fd *fd;
s32_t res; s32_t res;
fh = SPIFFS_FH_UNOFFS(fs, fh);
res = spiffs_fd_get(fs, fh, &fd); res = spiffs_fd_get(fs, fh, &fd);
SPIFFS_API_CHECK_RES_UNLOCK(fs, res); SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
@ -675,6 +688,7 @@ s32_t SPIFFS_fflush(spiffs *fs, spiffs_file fh) {
s32_t res = SPIFFS_OK; s32_t res = SPIFFS_OK;
#if SPIFFS_CACHE_WR #if SPIFFS_CACHE_WR
SPIFFS_LOCK(fs); SPIFFS_LOCK(fs);
fh = SPIFFS_FH_UNOFFS(fs, fh);
res = spiffs_fflush_cache(fs, fh); res = spiffs_fflush_cache(fs, fh);
SPIFFS_API_CHECK_RES_UNLOCK(fs,res); SPIFFS_API_CHECK_RES_UNLOCK(fs,res);
SPIFFS_UNLOCK(fs); SPIFFS_UNLOCK(fs);
@ -690,6 +704,7 @@ s32_t SPIFFS_close(spiffs *fs, spiffs_file fh) {
s32_t res = SPIFFS_OK; s32_t res = SPIFFS_OK;
SPIFFS_LOCK(fs); SPIFFS_LOCK(fs);
fh = SPIFFS_FH_UNOFFS(fs, fh);
#if SPIFFS_CACHE #if SPIFFS_CACHE
res = spiffs_fflush_cache(fs, fh); res = spiffs_fflush_cache(fs, fh);
SPIFFS_API_CHECK_RES_UNLOCK(fs, res); SPIFFS_API_CHECK_RES_UNLOCK(fs, res);

5
src/test/params_test.h

@ -43,6 +43,11 @@ typedef unsigned char u8_t;
#define SPIFFS_HAL_CALLBACK_EXTRA 1 #define SPIFFS_HAL_CALLBACK_EXTRA 1
#endif #endif
#define SPIFFS_FILEHDL_OFFSET 1
#if SPIFFS_FILEHDL_OFFSET
#define TEST_SPIFFS_FILEHDL_OFFSET 0x1000
#endif
// Enable/disable // Enable/disable
void real_assert(int c, const char *n, const char *file, int l); void real_assert(int c, const char *n, const char *file, int l);

5
src/test/test_bugreports.c

@ -388,7 +388,12 @@ TEST(truncate_48) {
TEST_CHECK_GE(fd, 0); TEST_CHECK_GE(fd, 0);
spiffs_fd *desc; spiffs_fd *desc;
#if SPIFFS_FILEHDL_OFFSET
res = spiffs_fd_get(FS, fd - TEST_SPIFFS_FILEHDL_OFFSET, &desc);
#else
res = spiffs_fd_get(FS, fd, &desc); res = spiffs_fd_get(FS, fd, &desc);
#endif
TEST_CHECK_GE(res, 0); TEST_CHECK_GE(res, 0);
TEST_CHECK_EQ(desc->size, len); TEST_CHECK_EQ(desc->size, len);

36
src/test/test_hydrogen.c

@ -225,6 +225,42 @@ TEST(file_by_open_excl)
} }
TEST_END(file_by_open_excl) TEST_END(file_by_open_excl)
#if SPIFFS_FILEHDL_OFFSET
TEST(open_fh_offs)
{
int res;
spiffs_stat s;
spiffs_file fd1, fd2, fd3;
fd1 = SPIFFS_open(FS, "1", SPIFFS_CREAT | SPIFFS_EXCL, 0);
fd2 = SPIFFS_open(FS, "2", SPIFFS_CREAT | SPIFFS_EXCL, 0);
fd3 = SPIFFS_open(FS, "3", SPIFFS_CREAT | SPIFFS_EXCL, 0);
TEST_CHECK(fd1 >= TEST_SPIFFS_FILEHDL_OFFSET);
TEST_CHECK(fd2 >= TEST_SPIFFS_FILEHDL_OFFSET);
TEST_CHECK(fd3 >= TEST_SPIFFS_FILEHDL_OFFSET);
SPIFFS_close(FS, fd1);
fd1 = SPIFFS_open(FS, "2", SPIFFS_RDONLY, 0);
TEST_CHECK(fd1 >= TEST_SPIFFS_FILEHDL_OFFSET);
SPIFFS_close(FS, fd2);
fd2 = SPIFFS_open(FS, "3", SPIFFS_RDONLY, 0);
TEST_CHECK(fd2 >= TEST_SPIFFS_FILEHDL_OFFSET);
SPIFFS_close(FS, fd3);
fd3 = SPIFFS_open(FS, "1", SPIFFS_RDONLY, 0);
TEST_CHECK(fd3 >= TEST_SPIFFS_FILEHDL_OFFSET);
SPIFFS_close(FS, fd1);
SPIFFS_close(FS, fd2);
SPIFFS_close(FS, fd3);
fd1 = SPIFFS_open(FS, "3", SPIFFS_RDONLY, 0);
TEST_CHECK(fd1 >= TEST_SPIFFS_FILEHDL_OFFSET);
SPIFFS_close(FS, fd1);
fd1 = SPIFFS_open(FS, "foo", SPIFFS_RDONLY, 0);
TEST_CHECK(fd1 < TEST_SPIFFS_FILEHDL_OFFSET);
return TEST_RES_OK;
}
TEST_END(open_fh_offs)
#endif //SPIFFS_FILEHDL_OFFSET
TEST(list_dir) TEST(list_dir)
{ {
int res; int res;

4
src/test/test_spiffs.c

@ -332,7 +332,9 @@ s32_t fs_mount_specific(u32_t phys_addr, u32_t phys_size,
c.phys_addr = phys_addr; c.phys_addr = phys_addr;
c.phys_erase_block = phys_sector_size; c.phys_erase_block = phys_sector_size;
c.phys_size = phys_size; c.phys_size = phys_size;
#if SPIFFS_FILEHDL_OFFSET
c.fh_ix_offset = TEST_SPIFFS_FILEHDL_OFFSET;
#endif
return SPIFFS_mount(&__fs, &c, _work, _fds, sizeof(_fds), _cache, sizeof(_cache), spiffs_check_cb_f); return SPIFFS_mount(&__fs, &c, _work, _fds, sizeof(_fds), _cache, sizeof(_cache), spiffs_check_cb_f);
} }

Loading…
Cancel
Save