aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGurjant Kalsi <me@gurjantkalsi.com>2015-11-14 18:21:22 -0800
committerGurjant Kalsi <me@gurjantkalsi.com>2015-11-14 18:21:22 -0800
commite98e1657f47ac16f77af1ef16fa4b51e046e6ee2 (patch)
tree3c655d94c989b1004a79ad4490e0460155ac63e0 /lib
parente5edfcd3c22cbb419059ee291b589a28b95bdca1 (diff)
downloadcommon-e98e1657f47ac16f77af1ef16fa4b51e046e6ee2.tar.gz
[spifs][fs] Trivial changes from previous PR comments.
Diffstat (limited to 'lib')
-rw-r--r--lib/fs/fs.c7
-rw-r--r--lib/fs/include/lib/fs.h6
-rw-r--r--lib/fs/spifs/rules.mk5
-rw-r--r--lib/fs/spifs/spifs.c12
-rw-r--r--lib/fs/spifs/test/spifstest.c44
5 files changed, 45 insertions, 29 deletions
diff --git a/lib/fs/fs.c b/lib/fs/fs.c
index 863912e1..4cf053f3 100644
--- a/lib/fs/fs.c
+++ b/lib/fs/fs.c
@@ -427,6 +427,7 @@ status_t fs_stat_fs(const char* mountpoint, struct fs_stat* stat)
}
if (!mount->api->fs_stat){
+ put_mount(mount);
return ERR_NOT_SUPPORTED;
}
@@ -460,8 +461,12 @@ ssize_t fs_load_file(const char *path, void *ptr, size_t maxlen)
const char *trim_name(const char *_name)
{
- // chew up leading slashes
const char *name = &_name[0];
+ // chew up leading spaces
+ while (*name == ' ')
+ name++;
+
+ // chew up leading slashes
while (*name == '/')
name++;
diff --git a/lib/fs/include/lib/fs.h b/lib/fs/include/lib/fs.h
index 48e99392..31a42f0f 100644
--- a/lib/fs/include/lib/fs.h
+++ b/lib/fs/include/lib/fs.h
@@ -51,7 +51,7 @@ typedef struct filehandle filehandle;
typedef struct dirhandle dirhandle;
-status_t fs_format_device(const char *fsname, const char *device, const void *args);
+status_t fs_format_device(const char *fsname, const char *device, const void *args) __NONNULL((1));
status_t fs_mount(const char *path, const char *fs, const char *device) __NONNULL((1)) __NONNULL((2));
status_t fs_unmount(const char *path) __NONNULL();
@@ -70,7 +70,7 @@ status_t fs_open_dir(const char *path, dirhandle **handle) __NONNULL();
status_t fs_read_dir(dirhandle *handle, struct dirent *ent) __NONNULL();
status_t fs_close_dir(dirhandle *handle) __NONNULL();
-status_t fs_stat_fs(const char* mountpoint, struct fs_stat* stat);
+status_t fs_stat_fs(const char* mountpoint, struct fs_stat* stat) __NONNULL((1)) __NONNULL((2));
/* convenience routines */
ssize_t fs_load_file(const char *path, void *ptr, size_t maxlen) __NONNULL();
@@ -78,7 +78,7 @@ ssize_t fs_load_file(const char *path, void *ptr, size_t maxlen) __NONNULL();
/* walk through a path string, removing duplicate path seperators, flattening . and .. references */
void fs_normalize_path(char *path) __NONNULL();
-/* Remove any leading spaces */
+/* Remove any leading spaces or slashes */
const char *trim_name(const char *_name);
/* file system api */
diff --git a/lib/fs/spifs/rules.mk b/lib/fs/spifs/rules.mk
index 4fd3ae69..039caef9 100644
--- a/lib/fs/spifs/rules.mk
+++ b/lib/fs/spifs/rules.mk
@@ -3,6 +3,9 @@ LOCAL_DIR := $(GET_LOCAL_DIR)
MODULE := $(LOCAL_DIR)
MODULE_SRCS += \
- $(LOCAL_DIR)/spifs.c
+ $(LOCAL_DIR)/spifs.c \
+ lib/fs \
+ lib/cksum \
+ lib/bio
include make/module.mk
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) {
diff --git a/lib/fs/spifs/test/spifstest.c b/lib/fs/spifs/test/spifstest.c
index a0d1ca00..ca3bb8b3 100644
--- a/lib/fs/spifs/test/spifstest.c
+++ b/lib/fs/spifs/test/spifstest.c
@@ -44,17 +44,17 @@ typedef struct {
uint32_t toc_pages;
} test;
-bool test_empty_after_format(const char *);
-bool test_double_create_file(const char *);
-bool test_write_read_normal(const char *);
-bool test_write_past_eof(const char *);
-bool test_full_toc(const char *);
-bool test_full_fs(const char *);
-bool test_write_past_end_of_capacity(const char *);
-bool test_rm_reclaim(const char *);
-bool test_corrupt_toc(const char *);
-bool test_write_with_offset(const char *);
-bool test_read_write_big(const char *);
+static bool test_empty_after_format(const char *);
+static bool test_double_create_file(const char *);
+static bool test_write_read_normal(const char *);
+static bool test_write_past_eof(const char *);
+static bool test_full_toc(const char *);
+static bool test_full_fs(const char *);
+static bool test_write_past_end_of_capacity(const char *);
+static bool test_rm_reclaim(const char *);
+static bool test_corrupt_toc(const char *);
+static bool test_write_with_offset(const char *);
+static bool test_read_write_big(const char *);
static test tests[] = {
{&test_empty_after_format, "Test no files in ToC after format.", 1},
@@ -103,7 +103,7 @@ bool test_teardown(void)
return true;;
}
-bool test_empty_after_format(const char *dev_name)
+static bool test_empty_after_format(const char *dev_name)
{
dirhandle *dhandle;
status_t err = fs_open_dir(MNT_PATH, &dhandle);
@@ -121,7 +121,7 @@ bool test_empty_after_format(const char *dev_name)
return true;
}
-bool test_double_create_file(const char *dev_name)
+static bool test_double_create_file(const char *dev_name)
{
status_t status;
@@ -162,7 +162,7 @@ err:
return status == NO_ERROR ? num_files == 1 : false;
}
-bool test_write_read_normal(const char *dev_name)
+static bool test_write_read_normal(const char *dev_name)
{
char test_message[] = "spifs test";
char test_buf[sizeof(test_message)];
@@ -213,7 +213,7 @@ bool test_write_read_normal(const char *dev_name)
return strncmp(test_message, test_buf, sizeof(test_message)) == 0;
}
-bool test_write_past_eof(const char *dev_name)
+static bool test_write_past_eof(const char *dev_name)
{
char test_message[] = "spifs test";
@@ -242,7 +242,7 @@ bool test_write_past_eof(const char *dev_name)
return true;
}
-bool test_full_toc(const char *dev_name)
+static bool test_full_toc(const char *dev_name)
{
struct fs_stat stat;
@@ -284,7 +284,7 @@ bool test_full_toc(const char *dev_name)
return true;
}
-bool test_rm_reclaim(const char *dev_name)
+static bool test_rm_reclaim(const char *dev_name)
{
// Create some number of files that's a power of 2;
size_t n_files = 4;
@@ -356,7 +356,7 @@ bool test_rm_reclaim(const char *dev_name)
return true;
}
-bool test_full_fs(const char *dev_name)
+static bool test_full_fs(const char *dev_name)
{
struct fs_stat stat;
@@ -385,7 +385,7 @@ bool test_full_fs(const char *dev_name)
return true;
}
-bool test_write_past_end_of_capacity(const char *dev_name)
+static bool test_write_past_end_of_capacity(const char *dev_name)
{
filehandle *handle;
status_t status = fs_create_file(TEST_FILE_PATH, &handle, 0);
@@ -413,7 +413,7 @@ finish:
return status == NO_ERROR;
}
-bool test_corrupt_toc(const char *dev_name)
+static bool test_corrupt_toc(const char *dev_name)
{
// Create a zero byte file.
filehandle *handle;
@@ -490,7 +490,7 @@ bool test_corrupt_toc(const char *dev_name)
return true;
}
-bool test_write_with_offset(const char *dev_name)
+static bool test_write_with_offset(const char *dev_name)
{
size_t repeats = 3;
char test_message[] = "test";
@@ -530,7 +530,7 @@ bool test_write_with_offset(const char *dev_name)
return success;
}
-bool test_read_write_big(const char *dev_name)
+static bool test_read_write_big(const char *dev_name)
{
bool success = true;