From 285afbfe9583d4aeee8131cfe455e7739071da26 Mon Sep 17 00:00:00 2001 From: batt Date: Thu, 7 Feb 2008 23:37:57 +0000 Subject: [PATCH] Add some tests. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1098 38d2e660-2303-0410-9eaa-f027e97ec537 --- app/battfs/battfs_test.c | 33 ++++++++++++++++++----- fs/battfs.c | 56 ++++++++++++++++++++++++++++++++++++++-- fs/battfs.h | 5 ++-- 3 files changed, 84 insertions(+), 10 deletions(-) diff --git a/app/battfs/battfs_test.c b/app/battfs/battfs_test.c index b949d074..e1972519 100644 --- a/app/battfs/battfs_test.c +++ b/app/battfs/battfs_test.c @@ -57,7 +57,7 @@ static bool disk_open(struct BattFsSuper *d) d->page_size = PAGE_SIZE; d->page_count = ftell(fp) / d->page_size; d->page_array = malloc(d->page_count * sizeof(pgcnt_t)); - TRACEMSG("page_size:%d, page_count:%d, disk_size:%d\n", d->page_size, d->page_count, d->disk_size); + TRACEMSG("page_size:%d, page_count:%d\n", d->page_size, d->page_count); return (fp && d->page_array); } @@ -68,7 +68,7 @@ static size_t disk_page_read(struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, return fread(buf, 1, size, fp); } -static size_t disk_page_write(struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t size) +static size_t disk_page_write(struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, const void *buf, size_t size) { TRACEMSG("page:%d, addr:%d, size:%d\n", page, addr, size); fseek(fp, page * d->page_size + addr, SEEK_SET); @@ -97,10 +97,10 @@ int main(int argc, char *argv[]) { if (argc < 2) { - FILE *fpt = fopen(test_filename, "w+"); - for (int i = 0; i < 32768; i++) - fputc(0xff, fpt); - fclose(fpt); +/* FILE *fpt = fopen(test_filename, "w+"); + for (int i = 0; i < 32768; i++) + fputc(0xff, fpt); + fclose(fpt);*/ filename = test_filename; } else @@ -123,6 +123,27 @@ int main(int argc, char *argv[]) kprintf("%04d ", disk.page_array[i]); } kputchar('\n'); + + for (pgcnt_t i = 0; i < disk.page_count; i++) + { + if (i < disk.page_count / 2) + { + if (!battfs_writeTestBlock(&disk, i, i, i, i/3, 0, MARK_PAGE_VALID)) + { + TRACEMSG("error writing:%d\n", i); + return 2; + } + } + else + { + if (!battfs_writeTestBlock(&disk, i, i, i, i/3, 0, i)) + { + TRACEMSG("error writing:%d\n", i); + return 2; + } + } + + } return 0; } else diff --git a/fs/battfs.c b/fs/battfs.c index dfffa6de..7d70646e 100644 --- a/fs/battfs.c +++ b/fs/battfs.c @@ -151,7 +151,7 @@ static bool battfs_readHeader(struct BattFsSuper *disk, pgcnt_t page, struct Bat * Header is actually a footer, and so * resides at page end. */ - if (disk->read(disk, page, disk->page_size - BATTFS_HEADER_LEN - 1, buf, BATTFS_HEADER_LEN) + if (disk->read(disk, page, disk->page_size - BATTFS_HEADER_LEN, buf, BATTFS_HEADER_LEN) != BATTFS_HEADER_LEN) { TRACEMSG("Error: page[%d]\n", page); @@ -164,6 +164,32 @@ static bool battfs_readHeader(struct BattFsSuper *disk, pgcnt_t page, struct Bat return true; } +/** + * Write header of page \a page. + * \return true on success, false otherwise. + * \note \a hdr is dirtyed even on errors. + */ +static bool battfs_writeHeader(struct BattFsSuper *disk, pgcnt_t page, struct BattFsPageHeader *hdr) +{ + uint8_t buf[BATTFS_HEADER_LEN]; + + /* Fill buffer */ + battfs_to_disk(hdr, buf); + + /* + * write header to disk. + * Header is actually a footer, and so + * resides at page end. + */ + if (disk->write(disk, page, disk->page_size - BATTFS_HEADER_LEN, buf, BATTFS_HEADER_LEN) + != BATTFS_HEADER_LEN) + { + TRACEMSG("Error: page[%d]\n", page); + return false; + } + return true; +} + /** * Count the number of pages from * inode 0 to \a inode in \a filelen_table. @@ -313,7 +339,7 @@ static void findFreeStartNext(struct BattFsSuper *disk, mark_t minl, mark_t maxl * No valid interval found. * Hopefully the disk is brand new. */ - TRACEMSG("No valid marked free block found, new disk?\n"); + TRACEMSG("No valid marked free block found, new disk or disk full\n"); disk->free_start = 0; disk->free_next = -1; //to be incremented ahead } @@ -562,3 +588,29 @@ bool battfs_init(struct BattFsSuper *disk) } +bool battfs_writeTestBlock(struct BattFsSuper *disk, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff, mark_t mark) +{ + BattFsPageHeader hdr; + TRACEMSG("page %d, inode %d, pgoff %d\n", page, inode, pgoff); + + hdr.inode = inode; + hdr.seq = seq; + hdr.fill = fill; + hdr.pgoff = pgoff; + hdr.mark = MARK_PAGE_VALID; + hdr.fcs_free = FCS_FREE_VALID; + hdr.fcs = computeFcs(&hdr); + if (mark != MARK_PAGE_VALID) + { + hdr.mark = mark; + hdr.fcs_free = computeFcsFree(&hdr); + } + + if (!battfs_writeHeader(disk, page, &hdr)) + { + TRACEMSG("error writing hdr\n"); + return false; + } + + return true; +} diff --git a/fs/battfs.h b/fs/battfs.h index 9235263e..c155b61e 100644 --- a/fs/battfs.h +++ b/fs/battfs.h @@ -99,7 +99,7 @@ typedef struct BattFsPageHeader * Simply set to 1 all field bits. * \{ */ -#define MARK_PAGE_VALID ((1LL << (CPU_BITS_PER_CHAR * sizeof(mark_t))) - 1) +#define MARK_PAGE_VALID ((1 << (CPU_BITS_PER_CHAR * sizeof(pgaddr_t) + 1)) - 1) #define FCS_FREE_VALID ((1 << (CPU_BITS_PER_CHAR * sizeof(fcs_t))) - 1) /* \} */ @@ -153,7 +153,7 @@ typedef size_t (*disk_page_read_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_ * \a size the lenght to be written. * \return the number of bytes written. */ -typedef size_t (*disk_page_write_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t); +typedef size_t (*disk_page_write_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, const void *buf, size_t); /** * Type interface for disk page erase function. @@ -215,5 +215,6 @@ typedef struct BattFsSuper } BattFsSuper; bool battfs_init(struct BattFsSuper *d); +bool battfs_writeTestBlock(struct BattFsSuper *disk, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff, mark_t mark); #endif /* FS_BATTFS_H */ -- 2.25.1