From afaa753b5a28a9f516244b134b77caf07092b1ec Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Fri, 9 Dec 2011 07:12:27 +0000 Subject: 2011-12-09 Chris Johns PR 1968/filesystem * libfs/src/rfs/rtems-rfs-file.c: Fix to the seek bug where a seek to 0 after reading the end of the file did not point to the correct block. * libfs/src/rfs/rtems-rfs-rtems.h, libfs/src/rfs/rtems-rfs-trace.c: Fix the trace flags. Used to fix the bug. --- cpukit/ChangeLog | 10 +++++ cpukit/libfs/src/rfs/rtems-rfs-file.c | 73 ++++++++++++++++++++++++++-------- cpukit/libfs/src/rfs/rtems-rfs-rtems.h | 19 ++++----- cpukit/libfs/src/rfs/rtems-rfs-trace.c | 7 ++-- 4 files changed, 80 insertions(+), 29 deletions(-) (limited to 'cpukit') diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index f25da85d7f..4a779b2e53 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,13 @@ +2011-12-09 Chris Johns + + PR 1968/filesystem + * libfs/src/rfs/rtems-rfs-file.c: Fix to the seek bug where a seek + to 0 after reading the end of the file did not point to the + correct block. + * libfs/src/rfs/rtems-rfs-rtems.h, + libfs/src/rfs/rtems-rfs-trace.c: Fix the trace flags. Used to fix + the bug. + 2011-12-07 Ralf Corsépius PR 1983/networking diff --git a/cpukit/libfs/src/rfs/rtems-rfs-file.c b/cpukit/libfs/src/rfs/rtems-rfs-file.c index 777726a23a..b7a79ae392 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-file.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-file.c @@ -424,7 +424,44 @@ rtems_rfs_file_seek (rtems_rfs_file_handle* handle, */ if (pos < rtems_rfs_file_shared_get_size (rtems_rfs_file_fs (handle), handle->shared)) + { rtems_rfs_file_set_bpos (handle, pos); + + /* + * If the file has a block check if it maps to the current position and it + * does not release it. That will force us to get the block at the new + * position when the I/O starts. + */ + if (rtems_rfs_buffer_handle_has_block (&handle->buffer)) + { + rtems_rfs_buffer_block block; + int rc; + + rc = rtems_rfs_block_map_find (rtems_rfs_file_fs (handle), + rtems_rfs_file_map (handle), + rtems_rfs_file_bpos (handle), + &block); + if (rc > 0) + return rc; + if (rtems_rfs_buffer_bnum (&handle->buffer) != block) + { + rc = rtems_rfs_buffer_handle_release (rtems_rfs_file_fs (handle), + rtems_rfs_file_buffer (handle)); + if (rc > 0) + return rc; + } + } + } + else + { + /* + * The seek is outside the current file so release any buffer. A write will + * extend the file. + */ + int rc = rtems_rfs_file_io_release (handle); + if (rc > 0) + return rc; + } *new_pos = pos; return 0; @@ -441,23 +478,25 @@ rtems_rfs_file_set_size (rtems_rfs_file_handle* handle, if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO)) printf ("rtems-rfs: file-set-size: size=%" PRIu64 "\n", new_size); + size = rtems_rfs_file_size (handle); + /* - * Short cut for the common truncate on open call. + * If the file is same size do nothing else grow or shrink it ? + * + * If the file does not change size do not update the times. */ - if (new_size == 0) - { - rc = rtems_rfs_block_map_free_all (rtems_rfs_file_fs (handle), map); - if (rc > 0) - return rc; - } - else + if (size != new_size) { - size = rtems_rfs_file_size (handle); - /* - * If the file is same size do nothing else grow or shrink it ? + * Short cut for the common truncate on open call. */ - if (size != new_size) + if (new_size == 0) + { + rc = rtems_rfs_block_map_free_all (rtems_rfs_file_fs (handle), map); + if (rc > 0) + return rc; + } + else { if (size < new_size) { @@ -567,13 +606,13 @@ rtems_rfs_file_set_size (rtems_rfs_file_handle* handle, 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); + 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); + if (rtems_rfs_file_update_mtime (handle)) + handle->shared->mtime = time (NULL); + } return 0; } diff --git a/cpukit/libfs/src/rfs/rtems-rfs-rtems.h b/cpukit/libfs/src/rfs/rtems-rfs-rtems.h index 3415d0abfb..608ab0f089 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-rtems.h +++ b/cpukit/libfs/src/rfs/rtems-rfs-rtems.h @@ -25,12 +25,12 @@ #include /** - * RTEMS RFS RTEMS Error Enable. Set to 1 to printing of errors. Default is off. + * RTEMS RFS RTEMS Error Enable. Set to 1 for printing of errors. Default is off. */ #define RTEMS_RFS_RTEMS_ERROR 0 /** - * RTEMS RFS RTEMS Trace Enable. Set to 1 to printing of errors. Default is off. + * RTEMS RFS RTEMS Trace Enable. Set to 1 for printing of errors. Default is off. */ #define RTEMS_RFS_RTEMS_TRACE 0 @@ -72,13 +72,14 @@ int rtems_rfs_rtems_error (const char* mesg, int error); #define RTEMS_RFS_RTEMS_DEBUG_READLINK (1 << 9) #define RTEMS_RFS_RTEMS_DEBUG_FCHMOD (1 << 10) #define RTEMS_RFS_RTEMS_DEBUG_STAT (1 << 11) -#define RTEMS_RFS_RTEMS_DEBUG_DIR_RMNOD (1 << 12) -#define RTEMS_RFS_RTEMS_DEBUG_FILE_OPEN (1 << 13) -#define RTEMS_RFS_RTEMS_DEBUG_FILE_CLOSE (1 << 14) -#define RTEMS_RFS_RTEMS_DEBUG_FILE_READ (1 << 15) -#define RTEMS_RFS_RTEMS_DEBUG_FILE_WRITE (1 << 16) -#define RTEMS_RFS_RTEMS_DEBUG_FILE_LSEEK (1 << 17) -#define RTEMS_RFS_RTEMS_DEBUG_FILE_FTRUNC (1 << 18) +#define RTEMS_RFS_RTEMS_DEBUG_RENAME (1 << 12) +#define RTEMS_RFS_RTEMS_DEBUG_DIR_RMNOD (1 << 13) +#define RTEMS_RFS_RTEMS_DEBUG_FILE_OPEN (1 << 14) +#define RTEMS_RFS_RTEMS_DEBUG_FILE_CLOSE (1 << 15) +#define RTEMS_RFS_RTEMS_DEBUG_FILE_READ (1 << 16) +#define RTEMS_RFS_RTEMS_DEBUG_FILE_WRITE (1 << 17) +#define RTEMS_RFS_RTEMS_DEBUG_FILE_LSEEK (1 << 18) +#define RTEMS_RFS_RTEMS_DEBUG_FILE_FTRUNC (1 << 19) /** * Call to check if this part is bring traced. If RTEMS_RFS_RTEMS_TRACE is diff --git a/cpukit/libfs/src/rfs/rtems-rfs-trace.c b/cpukit/libfs/src/rfs/rtems-rfs-trace.c index d96a63673b..525098c703 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-trace.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-trace.c @@ -92,7 +92,8 @@ rtems_rfs_trace_shell_command (int argc, char *argv[]) "symlink-read", "file-open", "file-close", - "file-io" + "file-io", + "file-set" }; rtems_rfs_trace_mask set_value = 0; @@ -140,9 +141,9 @@ rtems_rfs_trace_shell_command (int argc, char *argv[]) if (strcmp (argv[arg], table[t]) == 0) { if (set) - set_value = 1 << t; + set_value = 1ULL << t; else - clear_value = 1 << t; + clear_value = 1ULL << t; break; } } -- cgit v1.2.3