Changeset 582:cc8f05cb0cc9

Show
Ignore:
Timestamp:
06/05/08 17:10:27 (7 months ago)
Author:
Maxime Petazzoni <maxime.petazzoni@…>
Branch:
default
Message:

Fix filesystem filename save bug (how the heck did this thing worked before?)

Location:
nxos/base
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • nxos/base/fs.c

    r575 r582  
    2323#define FS_FILE_METADATA_SIZE 10 
    2424 
     25/** Filename offset (in U32s) in the metadata. */ 
     26#define FS_FILENAME_OFFSET 2 
     27 
    2528/** File metadata size, in bytes. */ 
    2629#define FS_FILE_METADATA_BYTES (FS_FILE_METADATA_SIZE * sizeof(U32)) 
    2730 
     31/** Mask to use on the first metadata U32 to get the file origin marker value. */ 
    2832#define FS_FILE_ORIGIN_MASK 0xFF000000 
     33 
     34/** Mask to use on the first metadata U32 to get the file permissions. */ 
    2935#define FS_FILE_PERMS_MASK 0x00F00000 
     36 
     37/** Mask to use on the first metadata U32 to get the file size. */ 
    3038#define FS_FILE_SIZE_MASK 0x000FFFFF 
    3139 
    3240#define FS_FILE_PERM_MASK_READWRITE (1 << 0) 
    3341#define FS_FILE_PERM_MASK_EXECUTABLE (1 << 1) 
    34  
    35 #define FS_FILENAME_OFFSET 2 
    3642 
    3743/** U32 <-> char conversion union for filenames. */ 
     
    303309static fs_err_t nx_fs_init_fd(U32 origin, fs_fd_t fd) { 
    304310  volatile U32 *metadata = &(FLASH_BASE_PTR[origin*EFC_PAGE_WORDS]); 
     311  union U32tochar nameconv; 
    305312  fs_file_t *file; 
    306313 
     
    308315  NX_ASSERT(file != NULL); 
    309316 
     317  memcpy(nameconv.integers, 
     318         (void *)(metadata + FS_FILENAME_OFFSET), 
     319         FS_FILENAME_LENGTH); 
     320 
    310321  file->origin = origin; 
     322  memcpy(file->name, nameconv.chars, MIN(strlen(nameconv.chars), 31)); 
    311323  file->size = nx_fs_get_file_size_from_metadata(metadata); 
    312324  file->perms = nx_fs_get_file_perms_from_metadata(metadata); 
     
    678690} 
    679691 
    680 void nx_fs_get_occupation(U16 *files, U32 *used, U32 *free_pages, 
     692void nx_fs_get_occupation(U32 *files, U32 *used, U32 *free_pages, 
    681693                          U32 *wasted) { 
     694  U32 _files = 0, _used = 0, _free_pages = 0, _wasted = 0; 
     695  U32 i; 
     696 
     697  for (i=FS_PAGE_START; i<FS_PAGE_END; i++) { 
     698    if (nx_fs_page_has_magic(i)) { 
     699      volatile U32 *metadata = &(FLASH_BASE_PTR[i*EFC_PAGE_WORDS]); 
     700      size_t size; 
     701      U32 pages; 
     702 
     703      size = nx_fs_get_file_size_from_metadata(metadata); 
     704      pages = nx_fs_get_file_page_count(size); 
     705 
     706      _files++; 
     707      _used += size; 
     708      _wasted += pages * EFC_PAGE_BYTES - size - FS_FILE_METADATA_BYTES; 
     709 
     710      i += pages - 1; 
     711    } else { 
     712      _free_pages++; 
     713    } 
     714  } 
     715 
    682716  if (files) { 
     717    *files = _files; 
    683718  } 
    684719 
    685720  if (used) { 
     721    *used = _used; 
    686722  } 
    687723 
    688724  if (free_pages) { 
     725    *free_pages = _free_pages; 
    689726  } 
    690727 
    691728  if (wasted) { 
     729    *wasted = _wasted; 
    692730  } 
    693731} 
  • nxos/base/fs.h

    r581 r582  
    199199 * @param wasted The bytes lost by files page aligment. 
    200200 */ 
    201 void nx_fs_get_occupation(U16 *files, U32 *used, U32 *free_pages, 
     201void nx_fs_get_occupation(U32 *files, U32 *used, U32 *free_pages, 
    202202                          U32 *wasted); 
    203203