summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/rfs/rtems-rfs-file.c
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2010-02-26 05:54:59 +0000
committerChris Johns <chrisj@rtems.org>2010-02-26 05:54:59 +0000
commit3cfa6368c3211eed83df08850f0af26481f161f6 (patch)
tree822cfa7d031cb1d644172cff41ab8f952c038a34 /cpukit/libfs/src/rfs/rtems-rfs-file.c
parent combine all checks for missing MAC address (diff)
downloadrtems-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.c214
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;
}