diff options
author | Chris Johns <chrisj@rtems.org> | 2010-02-26 05:54:59 +0000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2010-02-26 05:54:59 +0000 |
commit | 3cfa6368c3211eed83df08850f0af26481f161f6 (patch) | |
tree | 822cfa7d031cb1d644172cff41ab8f952c038a34 /cpukit/libfs/src/rfs/rtems-rfs-file.c | |
parent | combine all checks for missing MAC address (diff) | |
download | rtems-3cfa6368c3211eed83df08850f0af26481f161f6.tar.bz2 |
010-02-26 Chris Johns <chrisj@rtems.org>
* libfs/src/rfs/rtems-rfs-block.c: Reset a buffer handle after
moving down an indirection level.
* libfs/src/rfs/rtems-rfs-dir.c: Move directory entry validation
into a macro and use the macro. Fix the range check on the ino so
all inodes can be used.
* libfs/src/rfs/rtems-rfs-file-system.c,
libfs/src/rfs/rtems-rfs-file-system.h:: Add a version number to
the superblock. Use RTEMS_RFS_INODE_SIZE.
* libfs/src/rfs/rtems-rfs-file.c: Fix the size offset on partial
block lengths. Set the size in the file handle on a truncate to
0.
* libfs/src/rfs/rtems-rfs-format.c: Add a version number to
the superblock. Use RTEMS_RFS_INODE_SIZE. A better set of defaults
for small disks.
* libfs/src/rfs/rtems-rfs-inode.c: Use RTEMS_RFS_INODE_SIZE. Free
the allocated inode if it cannot be opened.
* libfs/src/rfs/rtems-rfs-inode.h: Add RTEMS_RFS_INODE_SIZE.
* libfs/src/rfs/rtems-rfs-rtems-file.c: Move some of the iop
acceses inside the fs lock.
* libfs/src/rfs/rtems-rfs-shell.c: Use RTEMS_RFS_INODE_SIZE.
Diffstat (limited to 'cpukit/libfs/src/rfs/rtems-rfs-file.c')
-rw-r--r-- | cpukit/libfs/src/rfs/rtems-rfs-file.c | 214 |
1 files changed, 111 insertions, 103 deletions
diff --git a/cpukit/libfs/src/rfs/rtems-rfs-file.c b/cpukit/libfs/src/rfs/rtems-rfs-file.c index 33c9196a39..f22f360af1 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-file.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-file.c @@ -275,7 +275,9 @@ rtems_rfs_file_io_start (rtems_rfs_file_handle* handle, return rc; } - if (read && rtems_rfs_block_map_last (rtems_rfs_file_map (handle))) + if (read + && rtems_rfs_block_map_last (rtems_rfs_file_map (handle)) + && rtems_rfs_block_map_size_offset (rtems_rfs_file_map (handle))) size = rtems_rfs_block_map_size_offset (rtems_rfs_file_map (handle)); else size = rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)); @@ -419,6 +421,7 @@ rtems_rfs_file_set_size (rtems_rfs_file_handle* handle, { rtems_rfs_block_map* map = rtems_rfs_file_map (handle); rtems_rfs_pos size; + int rc; if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO)) printf ("rtems-rfs: file-set-size: size=%Lu\n", new_size); @@ -427,131 +430,136 @@ rtems_rfs_file_set_size (rtems_rfs_file_handle* handle, * Short cut for the common truncate on open call. */ if (new_size == 0) - return rtems_rfs_block_map_free_all (rtems_rfs_file_fs (handle), map); - - size = rtems_rfs_file_size (handle); - - /* - * If the file is same size do nothing else grow or shrink it ? - */ - if (size != new_size) { - if (size < new_size) + rc = rtems_rfs_block_map_free_all (rtems_rfs_file_fs (handle), map); + if (rc > 0) + return rc; + } + else + { + size = rtems_rfs_file_size (handle); + + /* + * If the file is same size do nothing else grow or shrink it ? + */ + if (size != new_size) { - /* - * Grow. Fill with 0's. - */ - rtems_rfs_pos count; - uint32_t length; - bool read_block; - - count = new_size - size; - length = rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)); - read_block = false; - - while (count) + if (size < new_size) { - rtems_rfs_buffer_block block; - rtems_rfs_block_pos bpos; - uint8_t* dst; - int rc; - /* - * Get the block position for the current end of the file as seen by - * the map. If not found and the EOF grow the map then fill the block - * with 0. + * Grow. Fill with 0's. */ - rtems_rfs_block_size_get_bpos (rtems_rfs_block_map_size (map), &bpos); - rc = rtems_rfs_block_map_find (rtems_rfs_file_fs (handle), - map, &bpos, &block); - if (rc > 0) + rtems_rfs_pos count; + uint32_t length; + bool read_block; + + count = new_size - size; + length = rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)); + read_block = false; + + while (count) { + rtems_rfs_buffer_block block; + rtems_rfs_block_pos bpos; + uint8_t* dst; + /* - * Have we reached the EOF ? + * Get the block position for the current end of the file as seen by + * the map. If not found and the EOF grow the map then fill the block + * with 0. */ - if (rc != ENXIO) - return rc; + rtems_rfs_block_size_get_bpos (rtems_rfs_block_map_size (map), &bpos); + rc = rtems_rfs_block_map_find (rtems_rfs_file_fs (handle), + map, &bpos, &block); + if (rc > 0) + { + /* + * Have we reached the EOF ? + */ + if (rc != ENXIO) + return rc; + + rc = rtems_rfs_block_map_grow (rtems_rfs_file_fs (handle), + map, 1, &block); + if (rc > 0) + return rc; + } + + if (count < (length - bpos.boff)) + { + length = count + bpos.boff; + read_block = true; + rtems_rfs_block_map_set_size_offset (map, length); + } + else + { + rtems_rfs_block_map_set_size_offset (map, 0); + } - rc = rtems_rfs_block_map_grow (rtems_rfs_file_fs (handle), - map, 1, &block); + /* + * Only read the block if the length is not the block size. + */ + rc = rtems_rfs_buffer_handle_request (rtems_rfs_file_fs (handle), + rtems_rfs_file_buffer (handle), + block, read_block); if (rc > 0) return rc; - } - - if (count < (length - bpos.boff)) - { - length = count + bpos.boff; - read_block = true; - rtems_rfs_block_map_set_size_offset (map, length); - } - else - { - rtems_rfs_block_map_set_size_offset (map, 0); - } - /* - * Only read the block if the length is not the block size. - */ - rc = rtems_rfs_buffer_handle_request (rtems_rfs_file_fs (handle), - rtems_rfs_file_buffer (handle), - block, read_block); - if (rc > 0) - return rc; + dst = rtems_rfs_buffer_data (&handle->buffer); + memset (dst + bpos.boff, 0, length - bpos.boff); - dst = rtems_rfs_buffer_data (&handle->buffer); - memset (dst + bpos.boff, 0, length - bpos.boff); + rtems_rfs_buffer_mark_dirty (rtems_rfs_file_buffer (handle)); - rtems_rfs_buffer_mark_dirty (rtems_rfs_file_buffer (handle)); - - rc = rtems_rfs_buffer_handle_release (rtems_rfs_file_fs (handle), - rtems_rfs_file_buffer (handle)); - if (rc > 0) - return rc; + rc = rtems_rfs_buffer_handle_release (rtems_rfs_file_fs (handle), + rtems_rfs_file_buffer (handle)); + if (rc > 0) + return rc; - count -= length - bpos.boff; + count -= length - bpos.boff; + } } - } - else - { - /* - * Shrink - */ - rtems_rfs_block_no blocks; - uint32_t offset; + else + { + /* + * Shrink + */ + rtems_rfs_block_no blocks; + uint32_t offset; - blocks = - rtems_rfs_block_map_count (map) - - (((new_size - 1) / - rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle))) + 1); + blocks = + rtems_rfs_block_map_count (map) - + (((new_size - 1) / + rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle))) + 1); - offset = - new_size % rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)); + offset = + new_size % rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)); - if (blocks) - { - int rc; - rc = rtems_rfs_block_map_shrink (rtems_rfs_file_fs (handle), - rtems_rfs_file_map (handle), - blocks); - if (rc > 0) - return rc; - } + if (blocks) + { + int rc; + rc = rtems_rfs_block_map_shrink (rtems_rfs_file_fs (handle), + rtems_rfs_file_map (handle), + blocks); + if (rc > 0) + return rc; + } - rtems_rfs_block_map_set_size_offset (map, offset); + rtems_rfs_block_map_set_size_offset (map, offset); - if (rtems_rfs_block_pos_past_end (rtems_rfs_file_bpos (handle), - rtems_rfs_block_map_size (map))) - rtems_rfs_block_size_get_bpos (rtems_rfs_block_map_size (map), - rtems_rfs_file_bpos (handle)); + if (rtems_rfs_block_pos_past_end (rtems_rfs_file_bpos (handle), + rtems_rfs_block_map_size (map))) + rtems_rfs_block_size_get_bpos (rtems_rfs_block_map_size (map), + rtems_rfs_file_bpos (handle)); + } } - - handle->shared->size.count = rtems_rfs_block_map_count (map); - handle->shared->size.offset = rtems_rfs_block_map_size_offset (map); - - if (rtems_rfs_file_update_mtime (handle)) - handle->shared->mtime = time (NULL); } - + + handle->shared->size.count = rtems_rfs_block_map_count (map); + handle->shared->size.offset = rtems_rfs_block_map_size_offset (map); + + if (rtems_rfs_file_update_mtime (handle)) + handle->shared->mtime = time (NULL); + return 0; } |