update uffs from official repo(fixed bugs and support mount/unmount one partition"

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2018 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
goprife@gmail.com
2012-04-05 03:39:47 +00:00
parent 3ab019bf86
commit f435f7116a
12 changed files with 318 additions and 122 deletions
@@ -387,8 +387,30 @@ static int my_init_filesystem(void)
uffs_RegisterMountTable(mtbl);
mtbl++;
}
return uffs_InitMountTable() == U_SUCC ? 0 : -1;
// mount partitions
for (mtbl = &(demo_mount_table[0]); mtbl->mount != NULL; mtbl++) {
uffs_Mount(mtbl->mount);
}
return uffs_InitFileSystemObjects() == U_SUCC ? 0 : -1;
}
static int my_release_filesystem(void)
{
uffs_MountTable *mtb;
int ret = 0;
// unmount parttions
for (mtb = &(demo_mount_table[0]); ret == 0 && mtb->mount != NULL; mtb++) {
ret = uffs_UnMount(mtb->mount);
}
// release objects
if (ret == 0)
ret = (uffs_ReleaseFileSystemObjects() == U_SUCC ? 0 : -1);
return ret;
}
/* application entry */
@@ -401,7 +423,7 @@ int main()
// ... my application codes ....
// read/write/create/delete files ...
uffs_ReleaseMountTable();
my_release_filesystem();
return 0;
}
@@ -124,12 +124,17 @@ static int init_uffs_fs(void)
/* register mount table */
uffs_RegisterMountTable(mtbl);
return uffs_InitMountTable() == U_SUCC ? 0 : -1;
/* mount it */
uffs_Mount("/");
return uffs_InitFileSystemObjects() == U_SUCC ? 0 : -1;
}
static int release_uffs_fs(void)
{
return uffs_ReleaseMountTable();
uffs_UnMount("/");
return uffs_ReleaseFileSystemObjects();
}
int main(int argc, char *argv[])
@@ -49,24 +49,31 @@ extern "C"{
typedef struct uffs_MountTableEntrySt {
uffs_Device *dev;
int start_block;
int end_block;
const char *mount;
uffs_Device *dev; // UFFS 'device' - core internal data structure for partition
int start_block; // partition start block
int end_block; // partition end block ( if < 0, reserve space form the end of storage)
const char *mount; // mount point
struct uffs_MountTableEntrySt *prev;
struct uffs_MountTableEntrySt *next;
} uffs_MountTable;
/** initialize registered mount table */
URET uffs_InitMountTable(void);
/** Register mount entry, will be put at 'unmounted' list */
int uffs_RegisterMountTable(uffs_MountTable *mtb);
/** release registered mount table */
URET uffs_ReleaseMountTable(void);
/** Remove mount entry from the list */
int uffs_UnRegisterMountTable(uffs_MountTable *mtb);
/** get registered mount table */
uffs_MountTable * uffs_GetMountTable(void);
/** mount partition */
int uffs_Mount(const char *mount);
/** register mount table */
int uffs_RegisterMountTable(uffs_MountTable *mtab);
/** unmount parttion */
int uffs_UnMount(const char *mount);
/** get mounted entry list */
uffs_MountTable * uffs_MtbGetMounted(void);
/** get unmounted entry list */
uffs_MountTable * uffs_MtbGetUnMounted(void);
/** get matched mount point from absolute path */
int uffs_GetMatchedMountPointSize(const char *path);
@@ -325,9 +325,8 @@ int uffs_DirEntryBufPutAll(uffs_Device *dev);
URET uffs_InitDevice(uffs_Device *dev);
URET uffs_ReleaseDevice(uffs_Device *dev);
URET uffs_InitFlashClass(uffs_Device *dev);
URET uffs_InitFileSystemObjects(void);
URET uffs_ReleaseFileSystemObjects(void);
#ifdef __cplusplus
@@ -68,7 +68,7 @@ struct BlockListSt { /* 12 bytes */
union {
u16 serial; /* for suspended block list */
u8 need_check; /* for erased block list */
}u;
} u;
};
struct DirhSt { /* 8 bytes */
@@ -160,6 +160,7 @@ URET uffs_BlockInfoReleaseCache(uffs_Device *dev)
}
if (dev->mem.free) {
dev->mem.free(dev, dev->bc.mem_pool);
dev->mem.blockinfo_pool_size = 0;
}
}
@@ -212,8 +212,10 @@ URET uffs_BufReleaseAll(uffs_Device *dev)
return U_FAIL;
}
if (dev->mem.free)
if (dev->mem.free) {
dev->mem.free(dev, dev->buf.pool);
dev->mem.pagebuf_pool_size = 0;
}
dev->buf.pool = NULL;
dev->buf.head = dev->buf.tail = NULL;
@@ -106,6 +106,7 @@ URET uffs_GetObjectInfo(uffs_Object *obj, uffs_ObjectInfo *info, int *err)
// this is ROOT. UFFS does not physically has root, just fake it ...
memset(info, 0, sizeof(uffs_ObjectInfo));
info->serial = obj->serial;
info->info.attr |= (FILE_ATTR_DIR | FILE_ATTR_WRITE);
if (err)
*err = UENOERR;
ret = U_SUCC;
@@ -966,8 +966,20 @@ static int do_WriteObject(uffs_Object *obj, const void *data, int len)
size = do_WriteNewBlock(obj, data ? (u8 *)data + len - remain : NULL,
remain, fnode->u.file.serial, fdn);
// Flush immediately, so that the new data node will be
//
// Flush the new block buffers immediately, so that the new data node will be
// created and put in the tree.
//
// But before do that, we need to make sure the previous
// data block (if exist) been flushed first.
//
if (fdn > 1) {
uffs_BufFlushGroup(dev, fnode->u.file.serial, fdn - 1);
}
else {
uffs_BufFlushGroup(dev, fnode->u.file.parent, fnode->u.file.serial);
}
// Now flush the new block.
uffs_BufFlushGroup(dev, fnode->u.file.serial, fdn);
if (size == 0)
@@ -42,6 +42,7 @@
#include "uffs/uffs_tree.h"
#include "uffs/uffs_fs.h"
#include "uffs/uffs_badblock.h"
#include "uffs/uffs_utils.h"
#include <string.h>
#define PFX "init: "
@@ -178,3 +179,26 @@ ext:
}
URET uffs_InitFileSystemObjects(void)
{
if (uffs_InitObjectBuf() == U_SUCC) {
if (uffs_DirEntryBufInit() == U_SUCC) {
uffs_InitGlobalFsLock();
return U_SUCC;
}
}
return U_FAIL;
}
URET uffs_ReleaseFileSystemObjects(void)
{
if (uffs_ReleaseObjectBuf() == U_SUCC) {
if (uffs_DirEntryBufRelease() == U_SUCC) {
uffs_ReleaseGlobalFsLock();
return U_SUCC;
}
}
return U_FAIL;
}
File diff suppressed because it is too large Load Diff
@@ -138,11 +138,13 @@ static int init_uffs_fs(void)
0, // bc_caches - default
0, // page_buffers - default
0, // dirty_pages - default
0, // dirty_groups - force 1
0, // dirty_groups - default
0, // reserved_free_blocks - default
};
if(bIsFileSystemInited) return -4;
if (bIsFileSystemInited)
return -4;
bIsFileSystemInited = 1;
while (mtbl->dev) {
@@ -157,13 +159,26 @@ static int init_uffs_fs(void)
mtbl++;
}
return uffs_InitMountTable() == U_SUCC ? 0 : -1;
// mount partitions
for (mtbl = &(conf_mounts[0]); mtbl->mount != NULL; mtbl++) {
uffs_Mount(mtbl->mount);
}
return uffs_InitFileSystemObjects() == U_SUCC ? 0 : -1;
}
static int release_uffs_fs(void)
{
int ret;
ret = uffs_ReleaseMountTable();
int ret = 0;
uffs_MountTable *mtb;
for (mtb = &(conf_mounts[0]); ret == 0 && mtb->mount != NULL; mtb++) {
uffs_UnMount(mtb->mount);
}
if (ret == 0)
ret = (uffs_ReleaseFileSystemObjects() == U_SUCC ? 0 : -1);
return ret;
}
@@ -357,6 +372,7 @@ static int parse_options(int argc, char *argv[])
}
if (m_idx == 0) {
// if not given mount information, use default ('/' for whole partition)
parse_mount_point("/,0,-1", 0);
}