From 1e0ca9ceac9f0d1af0af5abe188af27b3a093bf7 Mon Sep 17 00:00:00 2001 From: nvt-se Date: Mon, 29 Jun 2009 13:30:16 +0000 Subject: [PATCH] Made the use of micro logs configurable to make file modifications more efficient on storage types that support inline updates. The sky platform uses logs, and the native platform uses no logs. --- core/cfs/cfs-coffee.c | 26 +++++++++++++++++++++++++- platform/native/cfs-coffee-arch.h | 2 ++ platform/sky/cfs-coffee-arch.h | 2 ++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/core/cfs/cfs-coffee.c b/core/cfs/cfs-coffee.c index 8bf2ce854..365b0f314 100644 --- a/core/cfs/cfs-coffee.c +++ b/core/cfs/cfs-coffee.c @@ -40,7 +40,7 @@ #include #include -#define DEBUG 0 +#define DEBUG 1 #if DEBUG #include #define PRINTF(...) printf(__VA_ARGS__) @@ -570,6 +570,7 @@ reserve(const char *name, coffee_page_t pages, return file; } /*---------------------------------------------------------------------------*/ +#if COFFEE_MICRO_LOGS static void adjust_log_config(struct file_header *hdr, uint16_t *log_record_size, uint16_t *log_records) @@ -579,7 +580,9 @@ adjust_log_config(struct file_header *hdr, *log_records = hdr->log_records == 0 ? COFFEE_LOG_SIZE / *log_record_size : hdr->log_records; } +#endif /* COFFEE_MICRO_LOGS */ /*---------------------------------------------------------------------------*/ +#if COFFEE_MICRO_LOGS static uint16_t modify_log_buffer(uint16_t log_record_size, cfs_offset_t *offset, uint16_t *size) @@ -593,7 +596,9 @@ modify_log_buffer(uint16_t log_record_size, } return region; } +#endif /* COFFEE_MICRO_LOGS */ /*---------------------------------------------------------------------------*/ +#if COFFEE_MICRO_LOGS static int get_record_index(coffee_page_t log_page, uint16_t search_records, uint16_t region) @@ -633,7 +638,9 @@ get_record_index(coffee_page_t log_page, uint16_t search_records, return match_index; } +#endif /* COFFEE_MICRO_LOGS */ /*---------------------------------------------------------------------------*/ +#if COFFEE_MICRO_LOGS static int read_log_page(struct file_header *hdr, int16_t last_record, struct log_param *lp) { @@ -660,7 +667,9 @@ read_log_page(struct file_header *hdr, int16_t last_record, struct log_param *lp return lp->size; } +#endif /* COFFEE_MICRO_LOGS */ /*---------------------------------------------------------------------------*/ +#if COFFEE_MICRO_LOGS static coffee_page_t create_log(struct file *file, struct file_header *hdr) { @@ -687,6 +696,7 @@ create_log(struct file *file, struct file_header *hdr) file->flags |= COFFEE_FILE_MODIFIED; return log_page; } +#endif /* COFFEE_MICRO_LOGS */ /*---------------------------------------------------------------------------*/ static int merge_log(coffee_page_t file_page, int extend) @@ -764,6 +774,7 @@ merge_log(coffee_page_t file_page, int extend) return 0; } /*---------------------------------------------------------------------------*/ +#if COFFEE_MICRO_LOGS static int find_next_record(struct file *file, coffee_page_t log_page, int log_records) @@ -800,7 +811,9 @@ find_next_record(struct file *file, coffee_page_t log_page, return log_record; } +#endif /* COFFEE_MICRO_LOGS */ /*---------------------------------------------------------------------------*/ +#if COFFEE_MICRO_LOGS static int write_log_page(struct file *file, struct log_param *lp) { @@ -868,6 +881,7 @@ write_log_page(struct file *file, struct log_param *lp) return lp->size; } +#endif /* COFFEE_MICRO_LOGS */ /*---------------------------------------------------------------------------*/ static int get_available_fd(void) @@ -987,7 +1001,9 @@ cfs_read(int fd, void *buf, unsigned size) struct file *file; unsigned bytes_left; int r; +#if COFFEE_MICRO_LOGS struct log_param lp; +#endif if(!(FD_VALID(fd) && FD_READABLE(fd))) { return -1; @@ -1011,12 +1027,14 @@ cfs_read(int fd, void *buf, unsigned size) while(bytes_left) { watchdog_periodic(); r = -1; +#if COFFEE_MICRO_LOGS if(FILE_MODIFIED(file)) { lp.offset = fdp->offset; lp.buf = buf; lp.size = bytes_left; r = read_log_page(&hdr, file->next_log_record, &lp); } +#endif /* COFFEE_MICRO_LOGS */ /* Read from the original file if we cannot find the data in the log. */ if(r < 0) { r = bytes_left; @@ -1034,10 +1052,12 @@ cfs_write(int fd, const void *buf, unsigned size) { struct file_desc *fdp; struct file *file; +#if COFFEE_MICRO_LOGS int i; struct log_param lp; cfs_offset_t bytes_left; const char dummy[1] = { 0xff }; +#endif if(!(FD_VALID(fd) && FD_WRITABLE(fd))) { return -1; @@ -1056,6 +1076,7 @@ cfs_write(int fd, const void *buf, unsigned size) PRINTF("Extended the file at page %u\n", (unsigned)file->page); } +#if COFFEE_MICRO_LOGS if(FILE_MODIFIED(file) || fdp->offset < file->end) { bytes_left = size; while(bytes_left) { @@ -1085,9 +1106,12 @@ cfs_write(int fd, const void *buf, unsigned size) COFFEE_WRITE(dummy, 1, absolute_offset(file->page, fdp->offset)); } } else { +#endif /* COFFEE_MICRO_LOGS */ COFFEE_WRITE(buf, size, absolute_offset(file->page, fdp->offset)); fdp->offset += size; +#if COFFEE_MICRO_LOGS } +#endif /* COFFEE_MICRO_LOGS */ if(fdp->offset > file->end) { file->end = fdp->offset; diff --git a/platform/native/cfs-coffee-arch.h b/platform/native/cfs-coffee-arch.h index 8c3e533cf..a9ed254b5 100644 --- a/platform/native/cfs-coffee-arch.h +++ b/platform/native/cfs-coffee-arch.h @@ -56,6 +56,8 @@ #define COFFEE_LOG_TABLE_LIMIT 256 #define COFFEE_DIR_CACHE_ENTRIES 16 +#define COFFEE_MICRO_LOGS 0 + #define COFFEE_WRITE(buf, size, offset) \ xmem_pwrite((char *)(buf), (size), COFFEE_START + (offset)) diff --git a/platform/sky/cfs-coffee-arch.h b/platform/sky/cfs-coffee-arch.h index 7448f42bb..204bc1ecd 100644 --- a/platform/sky/cfs-coffee-arch.h +++ b/platform/sky/cfs-coffee-arch.h @@ -56,6 +56,8 @@ #define COFFEE_DYN_SIZE 4*1024 #define COFFEE_LOG_SIZE 1024 +#define COFFEE_MICRO_LOGS 1 + /* Flash operations. */ #define COFFEE_WRITE(buf, size, offset) \ xmem_pwrite((char *)(buf), (size), COFFEE_START + (offset))