aboutsummaryrefslogtreecommitdiff
path: root/lib/fs/spifs/spifs.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fs/spifs/spifs.c')
-rw-r--r--lib/fs/spifs/spifs.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/fs/spifs/spifs.c b/lib/fs/spifs/spifs.c
index b1e8ac1e..2b4df9b8 100644
--- a/lib/fs/spifs/spifs.c
+++ b/lib/fs/spifs/spifs.c
@@ -207,8 +207,10 @@ static uint32_t find_open_run(spifs_t *spifs, uint32_t requested_length)
spifs_file_t *file;
list_for_every_entry(&spifs->files, file, spifs_file_t, node) {
// Number of pages that this file occupies
+ uint32_t page_size_shift = log2_uint(file->fs_handle->page_size);
+
uint32_t file_page_length =
- file->metadata.capacity / file->fs_handle->page_size;
+ divpow2(file->metadata.capacity, page_size_shift);
// Index of the page immediately following the last page of this file.
uint32_t file_end_page = file->metadata.page_idx + file_page_length;
@@ -747,6 +749,10 @@ static status_t spifs_create(fscookie *cookie, const char *name, filecookie **fc
if (strnlen(name, MAX_FILENAME_LENGTH) == MAX_FILENAME_LENGTH)
return ERR_BAD_PATH;
+ // Length is bigger than 4GB?
+ if (len > 0xFFFFFFFF)
+ return ERR_TOO_BIG;
+
mutex_acquire(&spifs->lock);
if (find_file(spifs, name)) {
@@ -939,7 +945,9 @@ static ssize_t spifs_write(filecookie *fcookie, const void *buf, off_t off, size
uint32_t start_addr =
off + (file->metadata.page_idx * spifs->page_size);
- uint32_t target_page_id = start_addr / spifs->page_size;
+
+ uint32_t page_shift = log2_uint(spifs->page_size);
+ uint32_t target_page_id = divpow2(start_addr, page_shift);
// Are we growing the file?
if (off + len > file->metadata.length) {