From 0a127c5591ec0b3e3c58e84702328e15809605e2 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Mon, 11 Oct 2010 04:34:48 +0000 Subject: 2010-10-11 Chris Johns * libfs/src/rfs/rtems-rfs-trace.c, libfs/src/rfs/rtems-rfs-trace.h: Add inode-delete. * libfs/src/rfs/rtems-rfs-shell.c: Fix formatting. * libfs/src/rfs/rtems-rfs-rtems-dir.c: Use ssize_t. Fix spelling. * libfs/src/rfs/rtems-rfs-block.c: Fix rtems_rfs_block_get_bpos to return the position correctly. A bpos does not have any special processing. Do no reset the buffer handle when shrinking indirectly. * libfs/src/rfs/rtems-rfs-inode.c: Add trace. * libfs/src/rfs/rtems-rfs-format.c: Fix comments. * libfs/src/rfs/rtems-rfs-group.c: Limit the inodes to the blocks in a group so the accounting works. * libfs/src/rfs/rtems-rfs-dir.c: PR 1705. Fix handling the offsets when deleting an entry. * libfs/src/rfs/rtems-rfs-buffer.h: Remove rtems_rfs_buffer_handle_reset. It is not needed and dangerous. --- cpukit/libfs/src/rfs/rtems-rfs-block.c | 28 ++++++----------- cpukit/libfs/src/rfs/rtems-rfs-buffer.h | 23 ++++---------- cpukit/libfs/src/rfs/rtems-rfs-dir.c | 48 +++++++++++++++++++----------- cpukit/libfs/src/rfs/rtems-rfs-format.c | 5 ++-- cpukit/libfs/src/rfs/rtems-rfs-group.c | 9 ++++++ cpukit/libfs/src/rfs/rtems-rfs-inode.c | 6 ++++ cpukit/libfs/src/rfs/rtems-rfs-rtems-dir.c | 11 +++---- cpukit/libfs/src/rfs/rtems-rfs-shell.c | 37 +++++++++++------------ cpukit/libfs/src/rfs/rtems-rfs-trace.c | 1 + cpukit/libfs/src/rfs/rtems-rfs-trace.h | 35 ++++++++++++---------- 10 files changed, 106 insertions(+), 97 deletions(-) (limited to 'cpukit/libfs') diff --git a/cpukit/libfs/src/rfs/rtems-rfs-block.c b/cpukit/libfs/src/rfs/rtems-rfs-block.c index 5ffadcc284..776c7f314d 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-block.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-block.c @@ -46,33 +46,25 @@ #include void -rtems_rfs_block_get_bpos (rtems_rfs_file_system* fs, - rtems_rfs_pos pos, - rtems_rfs_block_pos* bpos) +rtems_rfs_block_get_bpos (rtems_rfs_file_system* fs, + rtems_rfs_pos pos, + rtems_rfs_block_pos* bpos) { bpos->bno = pos / rtems_rfs_fs_block_size (fs); bpos->boff = pos % rtems_rfs_fs_block_size (fs); } rtems_rfs_pos -rtems_rfs_block_get_pos (rtems_rfs_file_system* fs, - rtems_rfs_block_pos* bpos) +rtems_rfs_block_get_pos (rtems_rfs_file_system* fs, + rtems_rfs_block_pos* bpos) { - rtems_rfs_pos pos = 0; - if (bpos->bno) - { - pos = bpos->boff; - if (pos == 0) - pos = rtems_rfs_fs_block_size (fs); - pos += (bpos->bno - 1) * rtems_rfs_fs_block_size (fs); - } - return pos; + return (bpos->bno * rtems_rfs_fs_block_size (fs)) + bpos->boff; } void -rtems_rfs_block_get_block_size (rtems_rfs_file_system* fs, - rtems_rfs_pos pos, - rtems_rfs_block_size* size) +rtems_rfs_block_get_block_size (rtems_rfs_file_system* fs, + rtems_rfs_pos pos, + rtems_rfs_block_size* size) { if (pos == 0) rtems_rfs_block_set_size_zero (size); @@ -634,8 +626,6 @@ rtems_rfs_block_map_indirect_shrink (rtems_rfs_file_system* fs, int b; for (b = 0; b < RTEMS_RFS_INODE_BLOCKS; b++) map->blocks[b] = rtems_rfs_block_get_number (buffer, b); - - rtems_rfs_buffer_handle_reset (buffer); } else { diff --git a/cpukit/libfs/src/rfs/rtems-rfs-buffer.h b/cpukit/libfs/src/rfs/rtems-rfs-buffer.h index ccfc0ea887..e207f5c7d3 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-buffer.h +++ b/cpukit/libfs/src/rfs/rtems-rfs-buffer.h @@ -185,22 +185,6 @@ int rtems_rfs_buffer_handle_request (rtems_rfs_file_system* fs, int rtems_rfs_buffer_handle_release (rtems_rfs_file_system* fs, rtems_rfs_buffer_handle* handle); -/** - * Reset a handle. - * - * @param fs The file system data. - * @param handle The buffer handle to reset. - * @return int The error number (errno). No error if 0. - */ -static inline int -rtems_rfs_buffer_handle_reset (rtems_rfs_buffer_handle* handle) -{ - handle->dirty = false; - handle->bnum = 0; - handle->buffer = NULL; - return 0; -} - /** * Open a handle. * @@ -212,7 +196,9 @@ static inline int rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs, rtems_rfs_buffer_handle* handle) { - rtems_rfs_buffer_handle_reset (handle); + handle->dirty = false; + handle->bnum = 0; + handle->buffer = NULL; return 0; } @@ -228,6 +214,9 @@ rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs, rtems_rfs_buffer_handle* handle) { rtems_rfs_buffer_handle_release (fs, handle); + handle->dirty = false; + handle->bnum = 0; + handle->buffer = NULL; return 0; } diff --git a/cpukit/libfs/src/rfs/rtems-rfs-dir.c b/cpukit/libfs/src/rfs/rtems-rfs-dir.c index 3ed394609b..1f2e5fd518 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-dir.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-dir.c @@ -127,6 +127,10 @@ rtems_rfs_dir_lookup_ino (rtems_rfs_file_system* fs, { uint8_t* entry; + if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO)) + printf ("rtems-rfs: dir-lookup-ino: block read, ino=%" PRIu32 " bno=%" PRId32 "\n", + rtems_rfs_inode_ino (inode), map.bpos.bno); + rc = rtems_rfs_buffer_handle_request (fs, &entries, block, true); if (rc > 0) { @@ -171,8 +175,9 @@ rtems_rfs_dir_lookup_ino (rtems_rfs_file_system* fs, { if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO_CHECK)) printf ("rtems-rfs: dir-lookup-ino: " - "checking entry for ino %" PRId32 ": off=%04" PRIx32 " length:%d ino:%" PRId32 "\n", - rtems_rfs_inode_ino (inode), map.bpos.boff, + "checking entry for ino %" PRId32 ": bno=%04" PRIx32 "/off=%04" PRIx32 + " length:%d ino:%" PRId32 "\n", + rtems_rfs_inode_ino (inode), map.bpos.bno, map.bpos.boff, elength, rtems_rfs_dir_entry_ino (entry)); if (memcmp (entry + RTEMS_RFS_DIR_ENTRY_SIZE, name, length) == 0) @@ -414,7 +419,7 @@ rtems_rfs_dir_del_entry (rtems_rfs_file_system* fs, while (rc == 0) { uint8_t* entry; - int offset; + int eoffset; rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, true); if (rc > 0) @@ -425,11 +430,19 @@ rtems_rfs_dir_del_entry (rtems_rfs_file_system* fs, rtems_rfs_inode_ino (dir), rc, strerror (rc)); break; } + + /* + * If we are searching start at the beginning of the block. If not searching + * skip to the offset in the block. + */ + if (search) + eoffset = 0; + else + eoffset = offset % rtems_rfs_fs_block_size (fs); - entry = rtems_rfs_buffer_data (&buffer); - offset = 0; + entry = rtems_rfs_buffer_data (&buffer) + eoffset; - while (offset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE)) + while (eoffset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE)) { rtems_rfs_ino eino; int elength; @@ -444,8 +457,9 @@ rtems_rfs_dir_del_entry (rtems_rfs_file_system* fs, { if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY)) printf ("rtems-rfs: dir-del-entry: " - "bad length or ino for ino %" PRIu32 ": %u/%" PRId32 " @ %04x\n", - rtems_rfs_inode_ino (dir), elength, eino, offset); + "bad length or ino for ino %" PRIu32 ": %u/%" PRId32 + " @ %" PRIu32 ".%04x\n", + rtems_rfs_inode_ino (dir), elength, eino, block, eoffset); rc = EIO; break; } @@ -453,7 +467,7 @@ rtems_rfs_dir_del_entry (rtems_rfs_file_system* fs, if (ino == rtems_rfs_dir_entry_ino (entry)) { uint32_t remaining; - remaining = rtems_rfs_fs_block_size (fs) - (offset + elength); + remaining = rtems_rfs_fs_block_size (fs) - (eoffset + elength); memmove (entry, entry + elength, remaining); memset (entry + remaining, 0xff, elength); @@ -468,12 +482,13 @@ rtems_rfs_dir_del_entry (rtems_rfs_file_system* fs, if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY)) printf ("rtems-rfs: dir-del-entry: " - "last block free for ino %" PRIu32 ": elength=%i offset=%d last=%s\n", - ino, elength, offset, + "last block free for ino %" PRIu32 ": elength=%i block=%" PRIu32 + " offset=%d last=%s\n", + ino, elength, block, eoffset, rtems_rfs_block_map_last (&map) ? "yes" : "no"); if ((elength == RTEMS_RFS_DIR_ENTRY_EMPTY) && - (offset == 0) && rtems_rfs_block_map_last (&map)) + (eoffset == 0) && rtems_rfs_block_map_last (&map)) { rc = rtems_rfs_block_map_shrink (fs, &map, 1); if (rc > 0) @@ -497,8 +512,8 @@ rtems_rfs_dir_del_entry (rtems_rfs_file_system* fs, break; } - entry += elength; - offset += elength; + entry += elength; + eoffset += elength; } if (rc == 0) @@ -605,10 +620,7 @@ rtems_rfs_dir_read (rtems_rfs_file_system* fs, if (remaining <= RTEMS_RFS_DIR_ENTRY_SIZE) *length += remaining; - if (elength < RTEMS_RFS_DIR_ENTRY_SIZE) - elength = 0; - else - elength -= RTEMS_RFS_DIR_ENTRY_SIZE; + elength -= RTEMS_RFS_DIR_ENTRY_SIZE; if (elength > NAME_MAX) elength = NAME_MAX; diff --git a/cpukit/libfs/src/rfs/rtems-rfs-format.c b/cpukit/libfs/src/rfs/rtems-rfs-format.c index e92228f4da..8199466bfb 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-format.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-format.c @@ -84,8 +84,7 @@ rtems_rfs_inode_overhead (rtems_rfs_file_system* fs) rtems_rfs_fs_block_size (fs)); bits_per_block = rtems_rfs_bits_per_block (fs); /* - * There could be more bits that there are blocks, eg 512K disk with 512 - * blocks. + * There could be more bits than blocks, eg 512K disk with 512 blocks. */ if (bits_per_block > (rtems_rfs_fs_blocks (fs) - RTEMS_RFS_SUPERBLOCK_SIZE)) bits_per_block = rtems_rfs_fs_blocks (fs) - RTEMS_RFS_SUPERBLOCK_SIZE; @@ -353,7 +352,7 @@ rtems_rfs_write_group (rtems_rfs_file_system* fs, rtems_rfs_buffer_mark_dirty (&handle); /* - * Initialise the inode tables if rerquired to do so. + * Initialise the inode tables if required to do so. */ if (initialise_inodes) { diff --git a/cpukit/libfs/src/rfs/rtems-rfs-group.c b/cpukit/libfs/src/rfs/rtems-rfs-group.c index 40901bb1bf..a6c2fce1ba 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-group.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-group.c @@ -46,6 +46,15 @@ rtems_rfs_group_open (rtems_rfs_file_system* fs, if ((base + size) >= rtems_rfs_fs_blocks (fs)) size = rtems_rfs_fs_blocks (fs) - base; + + /* + * Limit the inodes to the same size as the blocks. This is what the + * format does and if this is not done the accounting of inodes does + * not work. If we are so pushed for inodes that this makes a difference + * the format configuration needs reviewing. + */ + if (inodes > size) + inodes = size; if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_OPEN)) printf ("rtems-rfs: group-open: base=%" PRId32 ", blocks=%zd inodes=%zd\n", diff --git a/cpukit/libfs/src/rfs/rtems-rfs-inode.c b/cpukit/libfs/src/rfs/rtems-rfs-inode.c index 030ee82102..608048e84b 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-inode.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-inode.c @@ -296,6 +296,12 @@ rtems_rfs_inode_delete (rtems_rfs_file_system* fs, rtems_rfs_inode_handle* handle) { int rc = 0; + + if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_DELETE)) + printf("rtems-rfs: inode-delete: ino:%" PRIu32 " loaded:%s\n", + rtems_rfs_inode_ino (handle), + rtems_rfs_inode_is_loaded (handle) ? "yes" : "no"); + if (rtems_rfs_inode_is_loaded (handle)) { rtems_rfs_block_map map; diff --git a/cpukit/libfs/src/rfs/rtems-rfs-rtems-dir.c b/cpukit/libfs/src/rfs/rtems-rfs-rtems-dir.c index ad7b65298a..e395a353e9 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-rtems-dir.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-rtems-dir.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -113,7 +114,7 @@ rtems_rfs_rtems_dir_read (rtems_libio_t* iop, rtems_rfs_ino ino = rtems_rfs_rtems_get_iop_ino (iop); rtems_rfs_inode_handle inode; struct dirent* dirent; - size_t bytes_transfered; + ssize_t bytes_transferred; int d; int rc; @@ -129,7 +130,7 @@ rtems_rfs_rtems_dir_read (rtems_libio_t* iop, return rtems_rfs_rtems_error ("dir_read: read inode", rc); } - bytes_transfered = 0; + bytes_transferred = 0; for (d = 0; d < count; d++, dirent++) { @@ -142,17 +143,17 @@ rtems_rfs_rtems_dir_read (rtems_libio_t* iop, } if (rc > 0) { - bytes_transfered = rtems_rfs_rtems_error ("dir_read: dir read", rc); + bytes_transferred = rtems_rfs_rtems_error ("dir_read: dir read", rc); break; } iop->offset += size; - bytes_transfered += sizeof (struct dirent); + bytes_transferred += sizeof (struct dirent); } rtems_rfs_inode_close (fs, &inode); rtems_rfs_rtems_unlock (fs); - return (ssize_t) bytes_transfered; + return bytes_transferred; } /** diff --git a/cpukit/libfs/src/rfs/rtems-rfs-shell.c b/cpukit/libfs/src/rfs/rtems-rfs-shell.c index a11b68cecf..63931752cf 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-shell.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-shell.c @@ -123,24 +123,24 @@ rtems_rfs_shell_data (rtems_rfs_file_system* fs, int argc, char *argv[]) printf ("RFS Filesystem Data\n"); printf (" flags: %08" PRIx32 "\n", fs->flags); #if 0 - printf (" device: %08lx\n", rtems_rfs_fs_device (fs)); + printf (" device: %08lx\n", rtems_rfs_fs_device (fs)); #endif - printf (" blocks: %zu\n", rtems_rfs_fs_blocks (fs)); - printf (" block size: %zu\n", rtems_rfs_fs_block_size (fs)); - printf (" size: %" PRIu64 "\n", rtems_rfs_fs_size (fs)); - printf (" media block size: %" PRIu32 "\n", rtems_rfs_fs_media_block_size (fs)); - printf (" media size: %" PRIu64 "\n", rtems_rfs_fs_media_size (fs)); - printf (" inodes: %" PRIu32 "\n", rtems_rfs_fs_inodes (fs)); - printf (" bad blocks: %" PRIu32 "\n", fs->bad_blocks); - printf (" max. name length: %" PRIu32 "\n", rtems_rfs_fs_max_name (fs)); - printf (" groups: %d\n", fs->group_count); - printf (" group blocks: %zd\n", fs->group_blocks); - printf (" group inodes: %zd\n", fs->group_inodes); - printf (" inodes per block: %zd\n", fs->inodes_per_block); - printf (" blocks per block: %zd\n", fs->blocks_per_block); - printf (" singly blocks: %zd\n", fs->block_map_singly_blocks); - printf (" doublly blocks: %zd\n", fs->block_map_doubly_blocks); - printf (" max. held buffers: %" PRId32 "\n", fs->max_held_buffers); + printf (" blocks: %zu\n", rtems_rfs_fs_blocks (fs)); + printf (" block size: %zu\n", rtems_rfs_fs_block_size (fs)); + printf (" size: %" PRIu64 "\n", rtems_rfs_fs_size (fs)); + printf (" media block size: %" PRIu32 "\n", rtems_rfs_fs_media_block_size (fs)); + printf (" media size: %" PRIu64 "\n", rtems_rfs_fs_media_size (fs)); + printf (" inodes: %" PRIu32 "\n", rtems_rfs_fs_inodes (fs)); + printf (" bad blocks: %" PRIu32 "\n", fs->bad_blocks); + printf (" max. name length: %" PRIu32 "\n", rtems_rfs_fs_max_name (fs)); + printf (" groups: %d\n", fs->group_count); + printf (" group blocks: %zd\n", fs->group_blocks); + printf (" group inodes: %zd\n", fs->group_inodes); + printf (" inodes per block: %zd\n", fs->inodes_per_block); + printf (" blocks per block: %zd\n", fs->blocks_per_block); + printf (" singly blocks: %zd\n", fs->block_map_singly_blocks); + printf (" doublly blocks: %zd\n", fs->block_map_doubly_blocks); + printf (" max. held buffers: %" PRId32 "\n", fs->max_held_buffers); rtems_rfs_shell_lock_rfs (fs); @@ -302,8 +302,7 @@ rtems_rfs_shell_inode (rtems_rfs_file_system* fs, int argc, char *argv[]) } } - if ((start < 0) || (end < 0) || - (start >= total) || (end >= total)) + if ((start >= total) || (end >= total)) { printf ("error: inode out of range (0->%" PRId32 ").\n", total - 1); return 1; diff --git a/cpukit/libfs/src/rfs/rtems-rfs-trace.c b/cpukit/libfs/src/rfs/rtems-rfs-trace.c index d85ceba5ee..d96a63673b 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-trace.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-trace.c @@ -78,6 +78,7 @@ rtems_rfs_trace_shell_command (int argc, char *argv[]) "inode-load", "inode-unload", "inode-create", + "inode-delete", "link", "unlink", "dir-lookup-ino", diff --git a/cpukit/libfs/src/rfs/rtems-rfs-trace.h b/cpukit/libfs/src/rfs/rtems-rfs-trace.h index 516bfe8e8f..05d9258c7d 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-trace.h +++ b/cpukit/libfs/src/rfs/rtems-rfs-trace.h @@ -28,7 +28,9 @@ /** * Is tracing enabled ? */ -#define RTEMS_RFS_TRACE 0 +#if !defined (RTEMS_RFS_TRACE) +#define RTEMS_RFS_TRACE 1 +#endif /** * The type of the mask. @@ -62,21 +64,22 @@ typedef uint64_t rtems_rfs_trace_mask; #define RTEMS_RFS_TRACE_INODE_LOAD (1ULL << 20) #define RTEMS_RFS_TRACE_INODE_UNLOAD (1ULL << 21) #define RTEMS_RFS_TRACE_INODE_CREATE (1ULL << 22) -#define RTEMS_RFS_TRACE_LINK (1ULL << 23) -#define RTEMS_RFS_TRACE_UNLINK (1ULL << 24) -#define RTEMS_RFS_TRACE_DIR_LOOKUP_INO (1ULL << 25) -#define RTEMS_RFS_TRACE_DIR_LOOKUP_INO_CHECK (1ULL << 26) -#define RTEMS_RFS_TRACE_DIR_LOOKUP_INO_FOUND (1ULL << 27) -#define RTEMS_RFS_TRACE_DIR_ADD_ENTRY (1ULL << 28) -#define RTEMS_RFS_TRACE_DIR_DEL_ENTRY (1ULL << 29) -#define RTEMS_RFS_TRACE_DIR_READ (1ULL << 30) -#define RTEMS_RFS_TRACE_DIR_EMPTY (1ULL << 31) -#define RTEMS_RFS_TRACE_SYMLINK (1ULL << 32) -#define RTEMS_RFS_TRACE_SYMLINK_READ (1ULL << 33) -#define RTEMS_RFS_TRACE_FILE_OPEN (1ULL << 34) -#define RTEMS_RFS_TRACE_FILE_CLOSE (1ULL << 35) -#define RTEMS_RFS_TRACE_FILE_IO (1ULL << 36) -#define RTEMS_RFS_TRACE_FILE_SET (1ULL << 37) +#define RTEMS_RFS_TRACE_INODE_DELETE (1ULL << 23) +#define RTEMS_RFS_TRACE_LINK (1ULL << 24) +#define RTEMS_RFS_TRACE_UNLINK (1ULL << 25) +#define RTEMS_RFS_TRACE_DIR_LOOKUP_INO (1ULL << 26) +#define RTEMS_RFS_TRACE_DIR_LOOKUP_INO_CHECK (1ULL << 27) +#define RTEMS_RFS_TRACE_DIR_LOOKUP_INO_FOUND (1ULL << 28) +#define RTEMS_RFS_TRACE_DIR_ADD_ENTRY (1ULL << 29) +#define RTEMS_RFS_TRACE_DIR_DEL_ENTRY (1ULL << 30) +#define RTEMS_RFS_TRACE_DIR_READ (1ULL << 31) +#define RTEMS_RFS_TRACE_DIR_EMPTY (1ULL << 32) +#define RTEMS_RFS_TRACE_SYMLINK (1ULL << 33) +#define RTEMS_RFS_TRACE_SYMLINK_READ (1ULL << 34) +#define RTEMS_RFS_TRACE_FILE_OPEN (1ULL << 35) +#define RTEMS_RFS_TRACE_FILE_CLOSE (1ULL << 36) +#define RTEMS_RFS_TRACE_FILE_IO (1ULL << 37) +#define RTEMS_RFS_TRACE_FILE_SET (1ULL << 38) /** * Call to check if this part is bring traced. If RTEMS_RFS_TRACE is defined to -- cgit v1.2.3