mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-09-28 16:14:20 +08:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user