diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/libfs/src/imfs/memfile.c | 244 |
1 files changed, 118 insertions, 126 deletions
diff --git a/cpukit/libfs/src/imfs/memfile.c b/cpukit/libfs/src/imfs/memfile.c index 1fdb741167..563001a728 100644 --- a/cpukit/libfs/src/imfs/memfile.c +++ b/cpukit/libfs/src/imfs/memfile.c @@ -29,36 +29,36 @@ * Prototypes of private routines */ MEMFILE_STATIC int IMFS_memfile_extend( - IMFS_jnode_t *the_jnode, - bool zero_fill, - off_t new_length + IMFS_memfile_t *memfile, + bool zero_fill, + off_t new_length ); MEMFILE_STATIC int IMFS_memfile_addblock( - IMFS_jnode_t *the_jnode, - unsigned int block + IMFS_memfile_t *memfile, + unsigned int block ); MEMFILE_STATIC void IMFS_memfile_remove_block( - IMFS_jnode_t *the_jnode, - unsigned int block + IMFS_memfile_t *memfile, + unsigned int block ); MEMFILE_STATIC block_p *IMFS_memfile_get_block_pointer( - IMFS_jnode_t *the_jnode, + IMFS_memfile_t *memfile, unsigned int block, int malloc_it ); MEMFILE_STATIC ssize_t IMFS_memfile_read( - IMFS_jnode_t *the_jnode, + IMFS_file_t *file, off_t start, unsigned char *destination, unsigned int length ); ssize_t IMFS_memfile_write( /* cannot be static as used in imfs_fchmod.c */ - IMFS_jnode_t *the_jnode, + IMFS_memfile_t *memfile, off_t start, const unsigned char *source, unsigned int length @@ -70,50 +70,68 @@ void memfile_free_block( void *memory ); -int memfile_open( +int IMFS_linfile_open( rtems_libio_t *iop, const char *pathname, int oflag, mode_t mode ) { - IMFS_jnode_t *the_jnode; + IMFS_file_t *file; - the_jnode = iop->pathinfo.node_access; + file = iop->pathinfo.node_access; /* * Perform 'copy on write' for linear files */ - if ((iop->flags & LIBIO_FLAGS_WRITE) - && (IMFS_type( the_jnode ) == IMFS_LINEAR_FILE)) { - uint32_t count = the_jnode->info.linearfile.size; - const unsigned char *buffer = the_jnode->info.linearfile.direct; + if ((iop->flags & LIBIO_FLAGS_WRITE) != 0) { + uint32_t count = file->File.size; + const unsigned char *buffer = file->Linearfile.direct; - the_jnode->control = &IMFS_node_control_memfile; - the_jnode->info.file.size = 0; - the_jnode->info.file.indirect = 0; - the_jnode->info.file.doubly_indirect = 0; - the_jnode->info.file.triply_indirect = 0; + file->Node.control = &IMFS_node_control_memfile; + file->File.size = 0; + file->Memfile.indirect = 0; + file->Memfile.doubly_indirect = 0; + file->Memfile.triply_indirect = 0; if ((count != 0) - && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1)) + && (IMFS_memfile_write(&file->Memfile, 0, buffer, count) == -1)) return -1; } return 0; } -ssize_t memfile_read( +ssize_t IMFS_linfile_read( rtems_libio_t *iop, void *buffer, size_t count ) { - IMFS_jnode_t *the_jnode; - ssize_t status; + IMFS_file_t *file = IMFS_iop_to_file( iop ); + off_t start = iop->offset; + size_t size = file->File.size; + const unsigned char *data = file->Linearfile.direct; + + if (count > size - start) + count = size - start; + + IMFS_update_atime( &file->Node ); + iop->offset = start + count; + memcpy(buffer, &data[start], count); + + return (ssize_t) count; +} - the_jnode = iop->pathinfo.node_access; +ssize_t memfile_read( + rtems_libio_t *iop, + void *buffer, + size_t count +) +{ + IMFS_file_t *file = IMFS_iop_to_file( iop ); + ssize_t status; - status = IMFS_memfile_read( the_jnode, iop->offset, buffer, count ); + status = IMFS_memfile_read( file, iop->offset, buffer, count ); if ( status > 0 ) iop->offset += status; @@ -127,15 +145,13 @@ ssize_t memfile_write( size_t count ) { - IMFS_jnode_t *the_jnode; + IMFS_memfile_t *memfile = IMFS_iop_to_memfile( iop ); ssize_t status; - the_jnode = iop->pathinfo.node_access; - if ((iop->flags & LIBIO_FLAGS_APPEND) != 0) - iop->offset = the_jnode->info.file.size; + iop->offset = memfile->File.size; - status = IMFS_memfile_write( the_jnode, iop->offset, buffer, count ); + status = IMFS_memfile_write( memfile, iop->offset, buffer, count ); if ( status > 0 ) iop->offset += status; @@ -154,9 +170,7 @@ int memfile_ftruncate( off_t length ) { - IMFS_jnode_t *the_jnode; - - the_jnode = iop->pathinfo.node_access; + IMFS_memfile_t *memfile = IMFS_iop_to_memfile( iop ); /* * POSIX 1003.1b does not specify what happens if you truncate a file @@ -164,17 +178,17 @@ int memfile_ftruncate( * as an extend operation. */ - if ( length > the_jnode->info.file.size ) - return IMFS_memfile_extend( the_jnode, true, length ); + if ( length > memfile->File.size ) + return IMFS_memfile_extend( memfile, true, length ); /* * The in-memory files do not currently reclaim memory until the file is * deleted. So we leave the previously allocated blocks in place for * future use and just set the length. */ - the_jnode->info.file.size = length; + memfile->File.size = length; - IMFS_mtime_ctime_update(the_jnode); + IMFS_mtime_ctime_update( &memfile->File.Node ); return 0; } @@ -187,9 +201,9 @@ int memfile_ftruncate( * extend the file. */ MEMFILE_STATIC int IMFS_memfile_extend( - IMFS_jnode_t *the_jnode, - bool zero_fill, - off_t new_length + IMFS_memfile_t *memfile, + bool zero_fill, + off_t new_length ) { unsigned int block; @@ -200,8 +214,7 @@ MEMFILE_STATIC int IMFS_memfile_extend( /* * Perform internal consistency checks */ - IMFS_assert( the_jnode ); - IMFS_assert( IMFS_type( the_jnode ) == IMFS_MEMORY_FILE ); + IMFS_assert( memfile ); /* * Verify new file size is supported @@ -212,32 +225,32 @@ MEMFILE_STATIC int IMFS_memfile_extend( /* * Verify new file size is actually larger than current size */ - if ( new_length <= the_jnode->info.file.size ) + if ( new_length <= memfile->File.size ) return 0; /* * Calculate the number of range of blocks to allocate */ new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK; - old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; - offset = the_jnode->info.file.size - old_blocks * IMFS_MEMFILE_BYTES_PER_BLOCK; + old_blocks = memfile->File.size / IMFS_MEMFILE_BYTES_PER_BLOCK; + offset = memfile->File.size - old_blocks * IMFS_MEMFILE_BYTES_PER_BLOCK; /* * Now allocate each of those blocks. */ for ( block=old_blocks ; block<=new_blocks ; block++ ) { - if ( !IMFS_memfile_addblock( the_jnode, block ) ) { + if ( !IMFS_memfile_addblock( memfile, block ) ) { if ( zero_fill ) { size_t count = IMFS_MEMFILE_BYTES_PER_BLOCK - offset; block_p *block_ptr = - IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); + IMFS_memfile_get_block_pointer( memfile, block, 0 ); memset( &(*block_ptr) [offset], 0, count); offset = 0; } } else { for ( ; block>=old_blocks ; block-- ) { - IMFS_memfile_remove_block( the_jnode, block ); + IMFS_memfile_remove_block( memfile, block ); } rtems_set_errno_and_return_minus_one( ENOSPC ); } @@ -246,9 +259,10 @@ MEMFILE_STATIC int IMFS_memfile_extend( /* * Set the new length of the file. */ - the_jnode->info.file.size = new_length; + memfile->File.size = new_length; + + IMFS_mtime_ctime_update( &memfile->File.Node ); - IMFS_mtime_ctime_update(the_jnode); return 0; } @@ -258,20 +272,19 @@ MEMFILE_STATIC int IMFS_memfile_extend( * This routine adds a single block to the specified in-memory file. */ MEMFILE_STATIC int IMFS_memfile_addblock( - IMFS_jnode_t *the_jnode, - unsigned int block + IMFS_memfile_t *memfile, + unsigned int block ) { block_p memory; block_p *block_entry_ptr; - IMFS_assert( the_jnode ); - IMFS_assert( IMFS_type( the_jnode ) == IMFS_MEMORY_FILE ); + IMFS_assert( memfile ); /* * Obtain the pointer for the specified block number */ - block_entry_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 1 ); + block_entry_ptr = IMFS_memfile_get_block_pointer( memfile, block, 1 ); if ( !block_entry_ptr ) return 1; @@ -300,14 +313,14 @@ MEMFILE_STATIC int IMFS_memfile_addblock( * dangerous and the results unpredictable. */ MEMFILE_STATIC void IMFS_memfile_remove_block( - IMFS_jnode_t *the_jnode, - unsigned int block + IMFS_memfile_t *memfile, + unsigned int block ) { block_p *block_ptr; block_p ptr; - block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); + block_ptr = IMFS_memfile_get_block_pointer( memfile, block, 0 ); if ( block_ptr ) { ptr = *block_ptr; *block_ptr = 0; @@ -372,21 +385,22 @@ static void memfile_free_blocks_in_table( * Regardless until the IMFS implementation is proven, it * is better to stick to simple, easy to understand algorithms. */ -IMFS_jnode_t *IMFS_memfile_remove( +void IMFS_memfile_remove( IMFS_jnode_t *the_jnode ) { - IMFS_memfile_t *info; + IMFS_memfile_t *memfile; int i; int j; unsigned int to_free; block_p *p; + memfile = (IMFS_memfile_t *) the_jnode; + /* * Perform internal consistency checks */ - IMFS_assert( the_jnode ); - IMFS_assert( IMFS_type( the_jnode ) == IMFS_MEMORY_FILE ); + IMFS_assert( memfile ); /* * Eventually this could be set smarter at each call to @@ -400,26 +414,25 @@ IMFS_jnode_t *IMFS_memfile_remove( * + doubly indirect * + triply indirect */ - info = &the_jnode->info.file; - if ( info->indirect ) { - memfile_free_blocks_in_table( &info->indirect, to_free ); + if ( memfile->indirect ) { + memfile_free_blocks_in_table( &memfile->indirect, to_free ); } - if ( info->doubly_indirect ) { + if ( memfile->doubly_indirect ) { for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) { - if ( info->doubly_indirect[i] ) { + if ( memfile->doubly_indirect[i] ) { memfile_free_blocks_in_table( - (block_p **)&info->doubly_indirect[i], to_free ); + (block_p **)&memfile->doubly_indirect[i], to_free ); } } - memfile_free_blocks_in_table( &info->doubly_indirect, to_free ); + memfile_free_blocks_in_table( &memfile->doubly_indirect, to_free ); } - if ( info->triply_indirect ) { + if ( memfile->triply_indirect ) { for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) { - p = (block_p *) info->triply_indirect[i]; + p = (block_p *) memfile->triply_indirect[i]; if ( !p ) /* ensure we have a valid pointer */ break; for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) { @@ -428,13 +441,13 @@ IMFS_jnode_t *IMFS_memfile_remove( } } memfile_free_blocks_in_table( - (block_p **)&info->triply_indirect[i], to_free ); + (block_p **)&memfile->triply_indirect[i], to_free ); } memfile_free_blocks_in_table( - (block_p **)&info->triply_indirect, to_free ); + (block_p **)&memfile->triply_indirect, to_free ); } - return the_jnode; + IMFS_node_destroy_default( the_jnode ); } /* @@ -449,7 +462,7 @@ IMFS_jnode_t *IMFS_memfile_remove( * read). */ MEMFILE_STATIC ssize_t IMFS_memfile_read( - IMFS_jnode_t *the_jnode, + IMFS_file_t *file, off_t start, unsigned char *destination, unsigned int length @@ -469,9 +482,7 @@ MEMFILE_STATIC ssize_t IMFS_memfile_read( /* * Perform internal consistency checks */ - IMFS_assert( the_jnode ); - IMFS_assert( IMFS_type( the_jnode ) == IMFS_MEMORY_FILE || - IMFS_type( the_jnode ) == IMFS_LINEAR_FILE ); + IMFS_assert( file ); IMFS_assert( dest ); /* @@ -480,28 +491,13 @@ MEMFILE_STATIC ssize_t IMFS_memfile_read( */ my_length = length; - if ( IMFS_type( the_jnode ) == IMFS_LINEAR_FILE ) { - unsigned char *file_ptr; - - file_ptr = (unsigned char *)the_jnode->info.linearfile.direct; - - if (my_length > (the_jnode->info.linearfile.size - start)) - my_length = the_jnode->info.linearfile.size - start; - - memcpy(dest, &file_ptr[start], my_length); - - IMFS_update_atime( the_jnode ); - - return my_length; - } - /* * If the last byte we are supposed to read is past the end of this * in memory file, then shorten the length to read. */ last_byte = start + length; - if ( last_byte > the_jnode->info.file.size ) - my_length = the_jnode->info.file.size - start; + if ( last_byte > file->Memfile.File.size ) + my_length = file->Memfile.File.size - start; copied = 0; @@ -521,7 +517,7 @@ MEMFILE_STATIC ssize_t IMFS_memfile_read( to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset; if ( to_copy > my_length ) to_copy = my_length; - block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); + block_ptr = IMFS_memfile_get_block_pointer( &file->Memfile, block, 0 ); if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ start_offset ], to_copy ); @@ -536,7 +532,7 @@ MEMFILE_STATIC ssize_t IMFS_memfile_read( */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { - block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); + block_ptr = IMFS_memfile_get_block_pointer( &file->Memfile, block, 0 ); if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); @@ -552,14 +548,14 @@ MEMFILE_STATIC ssize_t IMFS_memfile_read( IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK ); if ( my_length ) { - block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); + block_ptr = IMFS_memfile_get_block_pointer( &file->Memfile, block, 0 ); if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ 0 ], my_length ); copied += my_length; } - IMFS_update_atime( the_jnode ); + IMFS_update_atime( &file->Node ); return copied; } @@ -568,10 +564,10 @@ MEMFILE_STATIC ssize_t IMFS_memfile_read( * IMFS_memfile_write * * This routine writes the specified data buffer into the in memory - * file pointed to by the_jnode. The file is extended as needed. + * file pointed to by memfile. The file is extended as needed. */ MEMFILE_STATIC ssize_t IMFS_memfile_write( - IMFS_jnode_t *the_jnode, + IMFS_memfile_t *memfile, off_t start, const unsigned char *source, unsigned int length @@ -593,8 +589,7 @@ MEMFILE_STATIC ssize_t IMFS_memfile_write( * Perform internal consistency checks */ IMFS_assert( source ); - IMFS_assert( the_jnode ); - IMFS_assert( IMFS_type( the_jnode ) == IMFS_MEMORY_FILE ); + IMFS_assert( memfile ); my_length = length; /* @@ -603,10 +598,10 @@ MEMFILE_STATIC ssize_t IMFS_memfile_write( */ last_byte = start + my_length; - if ( last_byte > the_jnode->info.file.size ) { - bool zero_fill = start > the_jnode->info.file.size; + if ( last_byte > memfile->File.size ) { + bool zero_fill = start > memfile->File.size; - status = IMFS_memfile_extend( the_jnode, zero_fill, last_byte ); + status = IMFS_memfile_extend( memfile, zero_fill, last_byte ); if ( status ) return status; } @@ -629,7 +624,7 @@ MEMFILE_STATIC ssize_t IMFS_memfile_write( to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset; if ( to_copy > my_length ) to_copy = my_length; - block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); + block_ptr = IMFS_memfile_get_block_pointer( memfile, block, 0 ); if ( !block_ptr ) return copied; #if 0 @@ -656,7 +651,7 @@ MEMFILE_STATIC ssize_t IMFS_memfile_write( to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { - block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); + block_ptr = IMFS_memfile_get_block_pointer( memfile, block, 0 ); if ( !block_ptr ) return copied; #if 0 @@ -676,7 +671,7 @@ MEMFILE_STATIC ssize_t IMFS_memfile_write( to_copy = my_length; if ( my_length ) { - block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); + block_ptr = IMFS_memfile_get_block_pointer( memfile, block, 0 ); if ( !block_ptr ) return copied; #if 0 @@ -687,7 +682,7 @@ MEMFILE_STATIC ssize_t IMFS_memfile_write( copied += to_copy; } - IMFS_mtime_ctime_update( the_jnode ); + IMFS_mtime_ctime_update( &memfile->File.Node ); return copied; } @@ -723,13 +718,12 @@ block_p *IMFS_memfile_get_block_pointer_DEBUG( #else block_p *IMFS_memfile_get_block_pointer( #endif - IMFS_jnode_t *the_jnode, + IMFS_memfile_t *memfile, unsigned int block, int malloc_it ) { unsigned int my_block; - IMFS_memfile_t *info; unsigned int singly; unsigned int doubly; unsigned int triply; @@ -740,17 +734,15 @@ block_p *IMFS_memfile_get_block_pointer( /* * Perform internal consistency checks */ - IMFS_assert( the_jnode ); - IMFS_assert( IMFS_type( the_jnode ) == IMFS_MEMORY_FILE ); + IMFS_assert( memfile ); - info = &the_jnode->info.file; my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { - p = info->indirect; + p = memfile->indirect; if ( malloc_it ) { @@ -758,15 +750,15 @@ block_p *IMFS_memfile_get_block_pointer( p = memfile_alloc_block(); if ( !p ) return 0; - info->indirect = p; + memfile->indirect = p; } - return &info->indirect[ my_block ]; + return &memfile->indirect[ my_block ]; } if ( !p ) return 0; - return &info->indirect[ my_block ]; + return &memfile->indirect[ my_block ]; } /* @@ -779,14 +771,14 @@ block_p *IMFS_memfile_get_block_pointer( singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; - p = info->doubly_indirect; + p = memfile->doubly_indirect; if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) return 0; - info->doubly_indirect = p; + memfile->doubly_indirect = p; } p1 = (block_p *)p[ doubly ]; @@ -821,14 +813,14 @@ block_p *IMFS_memfile_get_block_pointer( triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; doubly %= IMFS_MEMFILE_BLOCK_SLOTS; - p = info->triply_indirect; + p = memfile->triply_indirect; if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) return 0; - info->triply_indirect = p; + memfile->triply_indirect = p; } p1 = (block_p *) p[ triply ]; |