uffs_buf.c File Reference

uffs page buffers manipulations More...

#include "uffs/uffs_types.h"
#include "uffs/uffs_buf.h"
#include "uffs/uffs_device.h"
#include "uffs/uffs_os.h"
#include "uffs/uffs_public.h"
#include "uffs/ubuffer.h"
#include "uffs/uffs_ecc.h"
#include "uffs/uffs_badblock.h"
#include <string.h>

Go to the source code of this file.

Defines

#define PFX   "pg buf:"

Functions

uffs_Buf_FindMinimunPageIdFromDirtyList (uffs_Buf *dirtyList)
uffs_Bufuffs_BufClone (uffs_Device *dev, uffs_Buf *buf)
 clone from an exist buffer. allocate memory for new buffer, and copy data from original buffer if original buffer is not NULL.
void uffs_BufDecRef (uffs_Buf *buf)
uffs_Bufuffs_BufFind (uffs_Device *dev, u16 father, u16 serial, u16 pageID)
URET uffs_BufFlush (struct uffs_DeviceSt *dev)
void uffs_BufFreeClone (uffs_Device *dev, uffs_Buf *buf)
 release cloned buffer
uffs_Bufuffs_BufGet (struct uffs_DeviceSt *dev, u16 father, u16 serial, u16 pageID)
 get a page buffer
uffs_Bufuffs_BufGetEx (struct uffs_DeviceSt *dev, u8 type, TreeNode *node, u16 pageID)
void uffs_BufIncRef (uffs_Buf *buf)
URET uffs_BufInit (uffs_Device *dev, int maxBuf, int maxDirtyBuf)
 initialize page buffers for device in UFFS, each device has one buffer pool
UBOOL uffs_BufIsAllEmpty (struct uffs_DeviceSt *dev)
UBOOL uffs_BufIsAllFree (struct uffs_DeviceSt *dev)
uffs_Bufuffs_BufNew (struct uffs_DeviceSt *dev, u8 type, u16 father, u16 serial, u16 pageID)
URET uffs_BufPut (uffs_Device *dev, uffs_Buf *buf)
 Put back a page buffer, make reference count decrease by one.
URET uffs_BufRead (struct uffs_DeviceSt *dev, uffs_Buf *buf, void *data, u32 ofs, u32 len)
URET uffs_BufReleaseAll (uffs_Device *dev)
 release all page buffer, this function should be called when unmounting a uffs device
URET uffs_BufSetAllEmpty (struct uffs_DeviceSt *dev)
void uffs_BufSetMark (uffs_Buf *buf, int mark)
URET uffs_BufWrite (struct uffs_DeviceSt *dev, uffs_Buf *buf, void *data, u32 ofs, u32 len)
URET uffs_LoadPhiDataToBuf (uffs_Device *dev, uffs_Buf *buf, u32 block, u32 page)
URET uffs_LoadPhiDataToBufEccUnCare (uffs_Device *dev, uffs_Buf *buf, u32 block, u32 page)


Detailed Description

uffs page buffers manipulations

Author:
Ricky Zheng
Note:
Created in 11th May, 2005

Definition in file uffs_buf.c.


Define Documentation

#define PFX   "pg buf:"

Definition at line 18 of file uffs_buf.c.


Function Documentation

uffs_Buf* _FindMinimunPageIdFromDirtyList ( uffs_Buf dirtyList  ) 

find a page in dirty list, which has minimum pageID

Definition at line 388 of file uffs_buf.c.

References uffs_BufSt::nextDirty, and uffs_BufSt::pageID.

uffs_Buf* uffs_BufClone ( uffs_Device dev,
uffs_Buf buf 
)

clone from an exist buffer. allocate memory for new buffer, and copy data from original buffer if original buffer is not NULL.

Parameters:
[in] dev uffs device
[in] buf page buffer to be clone from. if NULL presented here, data copy will not be processed
Returns:
return the cloned page buffer, all data copied from source
Note:
the cloned buffer is not linked in page buffer list in uffs device, so you should use uffs_BufFreeClone instead of uffs_BufPut when you put back or release buffer

Definition at line 990 of file uffs_buf.c.

References CLONE_BUF_MARK, uffs_DeviceSt::com, uffs_BufSt::data, uffs_BufSt::dataLen, uffs_BufSt::father, uffs_BufSt::next, uffs_BufSt::nextDirty, NULL, uffs_BufSt::pageID, PFX, uffs_commInfoSt::pgSize, uffs_BufSt::prev, uffs_BufSt::prevDirty, uffs_BufSt::refCount, uffs_BufSt::serial, uffs_BufSt::type, UFFS_ERR_SERIOUS, and uffs_Perror().

Referenced by uffs_RecoverBadBlock().

void uffs_BufDecRef ( uffs_Buf buf  ) 

Definition at line 1077 of file uffs_buf.c.

References uffs_BufSt::refCount.

uffs_Buf* uffs_BufFind ( uffs_Device dev,
u16  father,
u16  serial,
u16  pageID 
)

find a buffer in the pool

Parameters:
[in] dev uffs device
[in] father father serial num
[in] serial serial num
[in] pageID pageID
Returns:
return found buffer, return NULL if buffer not found

Definition at line 286 of file uffs_buf.c.

References uffs_DeviceSt::buf, uffs_pageBufsSt::bufHead, uffs_BufSt::father, uffs_BufSt::mark, uffs_BufSt::next, NULL, uffs_BufSt::pageID, uffs_BufSt::serial, and UFFS_BUF_EMPTY.

Referenced by uffs_BufGet(), uffs_BufGetEx(), uffs_DeleteObject(), and uffs_TruncateObject().

URET uffs_BufFlush ( struct uffs_DeviceSt dev  ) 

flush buffers to flash

Parameters:
[in] dev uffs device

Definition at line 734 of file uffs_buf.c.

References fdataSt::block, filehSt::block, dirhSt::block, uffs_DeviceSt::buf, uffs_treeNodeSt::data, uffs_treeNodeSt::dir, uffs_pageBufsSt::dirty, uffs_pageBufsSt::dirtyCount, uffs_BufSt::father, uffs_treeNodeSt::file, NULL, PFX, uffs_BufSt::serial, uffs_BufSt::type, uffs_treeNodeSt::u, U_FAIL, U_SUCC, UFFS_ALL_PAGES, UFFS_ERR_SERIOUS, uffs_FindDataNode(), uffs_FindDirNodeFromTree(), uffs_FindFileNodeFromTree(), uffs_GetBlockInfo(), uffs_GetFreePagesCount(), uffs_LoadBlockInfo(), uffs_Perror(), uffs_PutBlockInfo(), UFFS_TYPE_DATA, UFFS_TYPE_DIR, and UFFS_TYPE_FILE.

Referenced by uffs_BufGetEx(), uffs_BufNew(), uffs_BufReleaseAll(), uffs_BufWrite(), uffs_CloseObject(), uffs_DeleteObject(), uffs_RenameObject(), uffs_TruncateObject(), and uffs_WriteObject().

void uffs_BufFreeClone ( uffs_Device dev,
uffs_Buf buf 
)

release cloned buffer

Parameters:
[in] dev uffs device
[in] buf cloned buffer

Definition at line 1023 of file uffs_buf.c.

References CLONE_BUF_MARK, uffs_BufSt::mark, PFX, uffs_BufSt::refCount, UFFS_BUF_EMPTY, UFFS_ERR_SERIOUS, and uffs_Perror().

Referenced by uffs_RecoverBadBlock().

uffs_Buf* uffs_BufGet ( struct uffs_DeviceSt dev,
u16  father,
u16  serial,
u16  pageID 
)

get a page buffer

Parameters:
[in] dev uffs device
[in] father father serial num
[in] serial serial num
[in] pageID pageID
Returns:
return the buffer found in buffer list, if not found, return NULL.

Definition at line 818 of file uffs_buf.c.

References uffs_BufSt::refCount, and uffs_BufFind().

Referenced by uffs_BufNew(), and uffs_CreateNewFile().

uffs_Buf* uffs_BufGetEx ( struct uffs_DeviceSt dev,
u8  type,
TreeNode node,
u16  pageID 
)

get a page buffer

Parameters:
[in] dev uffs device
[in] type dir, file or data ?
[in] node node on the tree
[in] pageID pageID
Returns:
return the bufer if found in buffer list, if not found in buffer list, it will get a free buffer, and load data from flash. return NULL if not free buffer.

Definition at line 882 of file uffs_buf.c.

References fdataSt::block, filehSt::block, dirhSt::block, uffs_treeNodeSt::data, uffs_BufSt::dataLen, uffs_TagsSt::dataLength, uffs_treeNodeSt::dir, uffs_BufSt::father, fdataSt::father, filehSt::father, dirhSt::father, uffs_treeNodeSt::file, uffs_BufSt::mark, NULL, uffs_BufSt::pageID, PFX, uffs_BufSt::refCount, uffs_BufSt::serial, fdataSt::serial, filehSt::serial, dirhSt::serial, uffs_blockInfoSt::spares, uffs_pageSpareSt::tag, uffs_BufSt::type, uffs_treeNodeSt::u, U_FAIL, UFFS_BUF_EMPTY, UFFS_BUF_VALID, uffs_BufFind(), uffs_BufFlush(), UFFS_ERR_SERIOUS, uffs_FindBestPageInBlock(), uffs_FindPageInBlockWithPageId(), uffs_GetBlockInfo(), UFFS_INVALID_PAGE, uffs_LoadPhiDataToBuf(), uffs_Perror(), uffs_PutBlockInfo(), UFFS_TYPE_DATA, UFFS_TYPE_DIR, and UFFS_TYPE_FILE.

Referenced by uffs_CloseObject(), uffs_ReadObject(), and uffs_RenameObject().

void uffs_BufIncRef ( uffs_Buf buf  ) 

Definition at line 1072 of file uffs_buf.c.

References uffs_BufSt::refCount.

URET uffs_BufInit ( uffs_Device dev,
int  maxBuf,
int  maxDirtyBuf 
)

initialize page buffers for device in UFFS, each device has one buffer pool

Parameters:
[in] dev uffs device
[in] maxBuf maximum buffer number, normally use MAX_PAGE_BUFFERS
[in] maxDirtyBuf maximum dirty buffer allowed, if the dirty buffer over this number, than need to be flush to flash

Definition at line 29 of file uffs_buf.c.

References uffs_DeviceSt::attr, uffs_DeviceSt::buf, uffs_pageBufsSt::bufHead, uffs_pageBufsSt::bufTail, uffs_DeviceSt::com, uffs_BufSt::data, uffs_pageBufsSt::dirty, uffs_pageBufsSt::dirtyCount, uffs_commInfoSt::eccSize, uffs_DeviceSt::flash, uffs_FlashOpsSt::GetEccSize, uffs_pageBufsSt::maxBuf, uffs_pageBufsSt::maxDirtyBuf, uffs_BufSt::next, NULL, uffs_storageAttrSt::page_data_size, uffs_storageAttrSt::pages_per_block, PFX, uffs_commInfoSt::pgDataSize, uffs_commInfoSt::pgSize, uffs_pageBufsSt::pool, uffs_BufSt::prev, U_FAIL, U_SUCC, UFFS_BUF_EMPTY, UFFS_ERR_NOISY, UFFS_ERR_NORMAL, uffs_MemAlloc(), and uffs_Perror().

Referenced by uffs_InitDevice().

UBOOL uffs_BufIsAllEmpty ( struct uffs_DeviceSt dev  ) 

Definition at line 1050 of file uffs_buf.c.

References uffs_DeviceSt::buf, uffs_pageBufsSt::bufHead, uffs_BufSt::mark, uffs_BufSt::next, U_FALSE, U_TRUE, and UFFS_BUF_EMPTY.

UBOOL uffs_BufIsAllFree ( struct uffs_DeviceSt dev  ) 

Definition at line 1040 of file uffs_buf.c.

References uffs_DeviceSt::buf, uffs_pageBufsSt::bufHead, uffs_BufSt::next, uffs_BufSt::refCount, U_FALSE, and U_TRUE.

Referenced by uffs_FormatDevice().

uffs_Buf* uffs_BufNew ( struct uffs_DeviceSt dev,
u8  type,
u16  father,
u16  serial,
u16  pageID 
)

New generate a buffer

Definition at line 836 of file uffs_buf.c.

References uffs_DeviceSt::com, uffs_BufSt::data, uffs_BufSt::dataLen, uffs_BufSt::father, uffs_BufSt::mark, NULL, uffs_BufSt::pageID, PFX, uffs_commInfoSt::pgSize, uffs_BufSt::refCount, uffs_BufSt::serial, uffs_BufSt::type, UFFS_BUF_EMPTY, uffs_BufFlush(), uffs_BufGet(), UFFS_ERR_SERIOUS, and uffs_Perror().

URET uffs_BufPut ( uffs_Device dev,
uffs_Buf buf 
)

Put back a page buffer, make reference count decrease by one.

Parameters:
[in] dev uffs device
[in] buf buffer to be put back

Definition at line 963 of file uffs_buf.c.

References NULL, PFX, uffs_BufSt::refCount, U_FAIL, U_SUCC, UFFS_ERR_NORMAL, and uffs_Perror().

Referenced by uffs_CloseObject(), uffs_CreateNewFile(), uffs_ReadObject(), and uffs_RenameObject().

URET uffs_BufRead ( struct uffs_DeviceSt dev,
uffs_Buf buf,
void *  data,
u32  ofs,
u32  len 
)

Definition at line 1139 of file uffs_buf.c.

References uffs_DeviceSt::com, uffs_BufSt::data, uffs_commInfoSt::pgDataSize, and U_SUCC.

Referenced by uffs_CloseObject(), and uffs_ReadObject().

URET uffs_BufReleaseAll ( uffs_Device dev  ) 

release all page buffer, this function should be called when unmounting a uffs device

Parameters:
[in] dev uffs device
Note:
if there are page buffers in used, it may cause fail to release

Definition at line 100 of file uffs_buf.c.

References uffs_DeviceSt::buf, uffs_pageBufsSt::bufHead, uffs_pageBufsSt::bufTail, uffs_BufSt::father, uffs_BufSt::next, NULL, uffs_BufSt::pageID, PFX, uffs_pageBufsSt::pool, uffs_BufSt::refCount, uffs_BufSt::serial, U_FAIL, U_SUCC, uffs_BufFlush(), uffs_DeviceLock(), uffs_DeviceUnLock(), UFFS_ERR_NORMAL, uffs_MemFree(), and uffs_Perror().

Referenced by uffs_ReleaseDevice().

URET uffs_BufSetAllEmpty ( struct uffs_DeviceSt dev  ) 

Definition at line 1061 of file uffs_buf.c.

References uffs_DeviceSt::buf, uffs_pageBufsSt::bufHead, uffs_BufSt::mark, uffs_BufSt::next, U_SUCC, and UFFS_BUF_EMPTY.

Referenced by uffs_FormatDevice().

void uffs_BufSetMark ( uffs_Buf buf,
int  mark 
)

Definition at line 1082 of file uffs_buf.c.

References uffs_BufSt::mark.

Referenced by uffs_TruncateObject().

URET uffs_BufWrite ( struct uffs_DeviceSt dev,
uffs_Buf buf,
void *  data,
u32  ofs,
u32  len 
)

Definition at line 1097 of file uffs_buf.c.

References uffs_DeviceSt::buf, uffs_DeviceSt::com, uffs_BufSt::data, uffs_BufSt::dataLen, uffs_pageBufsSt::dirty, uffs_pageBufsSt::dirtyCount, uffs_BufSt::father, uffs_pageBufsSt::maxDirtyBuf, PFX, uffs_commInfoSt::pgDataSize, uffs_BufSt::serial, uffs_BufSt::type, U_FAIL, U_FALSE, U_SUCC, uffs_BufFlush(), UFFS_ERR_SERIOUS, and uffs_Perror().

Referenced by uffs_CloseObject(), and uffs_RenameObject().

URET uffs_LoadPhiDataToBuf ( uffs_Device dev,
uffs_Buf buf,
u32  block,
u32  page 
)

load psychical page data into buf and do ecc check

Parameters:
[in] dev uffs device
[in] buf buf to be load in
[in] block psychical block number
[in] page psychical page number
Returns:
return U_SUCC if no error, return U_FAIL if I/O error or ecc check fail

Definition at line 228 of file uffs_buf.c.

References uffs_DeviceSt::com, uffs_BufSt::data, uffs_BufSt::mark, uffs_DeviceSt::ops, uffs_commInfoSt::pgSize, uffs_DeviceOpsSt::ReadPageData, U_FAIL, U_SUCC, UFFS_BUF_EMPTY, UFFS_BUF_VALID, and uffs_CheckBadBlock().

Referenced by uffs_BufGetEx().

URET uffs_LoadPhiDataToBufEccUnCare ( uffs_Device dev,
uffs_Buf buf,
u32  block,
u32  page 
)

load psychical page data into buf and try ecc check

Parameters:
[in] dev uffs device
[in] buf buf to be load in
[in] block psychical block number
[in] page psychical page number
Returns:
return U_SUCC if no error, return U_FAIL if I/O error
Note:
this function should be only used when doing bad block recover.

Definition at line 258 of file uffs_buf.c.

References uffs_DeviceSt::com, uffs_BufSt::data, uffs_BufSt::mark, uffs_DeviceSt::ops, uffs_commInfoSt::pgSize, uffs_DeviceOpsSt::ReadPageData, U_SUCC, UFFS_BUF_EMPTY, UFFS_BUF_VALID, and uffs_CheckBadBlock().

Referenced by uffs_RecoverBadBlock().


Generated on Sat Mar 17 15:45:45 2007 for uffs-doc by  doxygen 1.5.0