summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs
diff options
context:
space:
mode:
authorEric Norum <WENorum@lbl.gov>2005-02-08 17:12:54 +0000
committerEric Norum <WENorum@lbl.gov>2005-02-08 17:12:54 +0000
commit624867bc09632b9c98235073f9a1b4f130233c47 (patch)
tree3f2c55aaa075ed371dcc4059d6f673d801240d2a /cpukit/libfs
parent2005-02-08 Ralf Corsepius <ralf.corsepius@rtems.org> (diff)
downloadrtems-624867bc09632b9c98235073f9a1b4f130233c47.tar.bz2
Add copy-on-write semantics to rtems_tarfs_load().
Diffstat (limited to 'cpukit/libfs')
-rw-r--r--cpukit/libfs/Makefile.am2
-rw-r--r--cpukit/libfs/src/imfs/imfs.h15
-rw-r--r--cpukit/libfs/src/imfs/imfs_eval.c2
-rw-r--r--cpukit/libfs/src/imfs/imfs_fchmod.c19
-rw-r--r--cpukit/libfs/src/imfs/imfs_handlers_memfile.c17
-rw-r--r--cpukit/libfs/src/imfs/imfs_init.c1
-rw-r--r--cpukit/libfs/src/imfs/imfs_initsupp.c2
-rw-r--r--cpukit/libfs/src/imfs/imfs_load_tar.c42
-rw-r--r--cpukit/libfs/src/imfs/linearfile.c115
-rw-r--r--cpukit/libfs/src/imfs/memfile.c17
-rw-r--r--cpukit/libfs/src/imfs/miniimfs_init.c1
11 files changed, 25 insertions, 208 deletions
diff --git a/cpukit/libfs/Makefile.am b/cpukit/libfs/Makefile.am
index abd6b6d85f..6f43c25d41 100644
--- a/cpukit/libfs/Makefile.am
+++ b/cpukit/libfs/Makefile.am
@@ -21,7 +21,7 @@ libimfs_a_SOURCES += src/imfs/imfs_chown.c src/imfs/imfs_config.c \
src/imfs/imfs_mknod.c src/imfs/imfs_mount.c src/imfs/imfs_fchmod.c \
src/imfs/imfs_unlink.c src/imfs/imfs_unmount.c src/imfs/imfs_utime.c \
src/imfs/imfs_ntype.c src/imfs/imfs_stat.c src/imfs/imfs_getchild.c \
- src/imfs/memfile.c src/imfs/linearfile.c src/imfs/deviceio.c \
+ src/imfs/memfile.c src/imfs/deviceio.c \
src/imfs/imfs_handlers_device.c src/imfs/imfs_handlers_directory.c \
src/imfs/imfs_handlers_link.c src/imfs/imfs_handlers_memfile.c \
src/imfs/imfs_debug.c src/imfs/imfs_rmnod.c src/imfs/imfs_symlink.c \
diff --git a/cpukit/libfs/src/imfs/imfs.h b/cpukit/libfs/src/imfs/imfs.h
index 984a4b3736..0fefa5f56d 100644
--- a/cpukit/libfs/src/imfs/imfs.h
+++ b/cpukit/libfs/src/imfs/imfs.h
@@ -202,7 +202,6 @@ struct IMFS_jnode_tt {
typedef struct {
ino_t ino_count;
- rtems_filesystem_file_handlers_r *linearfile_handlers;
rtems_filesystem_file_handlers_r *memfile_handlers;
rtems_filesystem_file_handlers_r *directory_handlers;
} IMFS_fs_info_t;
@@ -237,7 +236,6 @@ typedef enum {
extern rtems_filesystem_file_handlers_r IMFS_directory_handlers;
extern rtems_filesystem_file_handlers_r IMFS_device_handlers;
extern rtems_filesystem_file_handlers_r IMFS_link_handlers;
-extern rtems_filesystem_file_handlers_r IMFS_linearfile_handlers;
extern rtems_filesystem_file_handlers_r IMFS_memfile_handlers;
extern rtems_filesystem_operations_table IMFS_ops;
extern rtems_filesystem_operations_table miniIMFS_ops;
@@ -258,7 +256,6 @@ int miniIMFS_initialize(
int IMFS_initialize_support(
rtems_filesystem_mount_table_entry_t *mt_entry,
rtems_filesystem_operations_table *op_table,
- rtems_filesystem_file_handlers_r *linearfile_handlers,
rtems_filesystem_file_handlers_r *memfile_handlers,
rtems_filesystem_file_handlers_r *directory_handlers
);
@@ -416,18 +413,6 @@ int imfs_dir_rmnod(
rtems_filesystem_location_info_t *pathloc /* IN */
);
-int linearfile_read(
- rtems_libio_t *iop, /* IN */
- void *buffer, /* IN */
- uint32_t count /* IN */
-);
-
-int linearfile_lseek(
- rtems_libio_t *iop, /* IN */
- off_t offset, /* IN */
- int whence /* IN */
-);
-
int memfile_open(
rtems_libio_t *iop, /* IN */
const char *pathname, /* IN */
diff --git a/cpukit/libfs/src/imfs/imfs_eval.c b/cpukit/libfs/src/imfs/imfs_eval.c
index b2bac3f4da..3d8df0b2e0 100644
--- a/cpukit/libfs/src/imfs/imfs_eval.c
+++ b/cpukit/libfs/src/imfs/imfs_eval.c
@@ -52,7 +52,7 @@ int IMFS_Set_handlers(
loc->handlers = &IMFS_link_handlers;
break;
case IMFS_LINEAR_FILE:
- loc->handlers = fs_info->linearfile_handlers;
+ loc->handlers = fs_info->memfile_handlers;
break;
case IMFS_MEMORY_FILE:
loc->handlers = fs_info->memfile_handlers;
diff --git a/cpukit/libfs/src/imfs/imfs_fchmod.c b/cpukit/libfs/src/imfs/imfs_fchmod.c
index 4d30b98781..55c1cfe42f 100644
--- a/cpukit/libfs/src/imfs/imfs_fchmod.c
+++ b/cpukit/libfs/src/imfs/imfs_fchmod.c
@@ -56,25 +56,6 @@ int IMFS_fchmod(
if ( mode & (~ (S_IRWXU | S_IRWXG | S_IRWXO ) ) )
rtems_set_errno_and_return_minus_one( EPERM );
- /*
- * If we make a linear-file writeable, construct a block file
- * from it first.
- */
- if ( (jnode->type == IMFS_LINEAR_FILE) &&
- (mode & (S_IWUSR | S_IWGRP | S_IWOTH)) )
- {
- uint32_t count = jnode->info.linearfile.size;
- const unsigned char *buffer = jnode->info.linearfile.direct;
-
- jnode->type = IMFS_MEMORY_FILE;
- jnode->info.file.size = 0;
- jnode->info.file.indirect = 0;
- jnode->info.file.doubly_indirect = 0;
- jnode->info.file.triply_indirect = 0;
- if (IMFS_memfile_write(jnode, 0, buffer, count) == -1)
- return(-1);
- }
-
jnode->st_mode &= ~(S_IRWXU | S_IRWXG | S_IRWXO);
jnode->st_mode |= mode;
diff --git a/cpukit/libfs/src/imfs/imfs_handlers_memfile.c b/cpukit/libfs/src/imfs/imfs_handlers_memfile.c
index 1764544e69..1db049b504 100644
--- a/cpukit/libfs/src/imfs/imfs_handlers_memfile.c
+++ b/cpukit/libfs/src/imfs/imfs_handlers_memfile.c
@@ -23,23 +23,6 @@
* Set of operations handlers for operations on memfile entities.
*/
-rtems_filesystem_file_handlers_r IMFS_linearfile_handlers = {
- memfile_open,
- memfile_close,
- memfile_read,
- NULL, /* write */
- memfile_ioctl,
- memfile_lseek,
- IMFS_stat,
- IMFS_fchmod,
- NULL, /* ftruncate */
- NULL, /* fpathconf */
- IMFS_fdatasync, /* fsync */
- IMFS_fdatasync,
- IMFS_fcntl,
- memfile_rmnod
-};
-
rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
memfile_open,
memfile_close,
diff --git a/cpukit/libfs/src/imfs/imfs_init.c b/cpukit/libfs/src/imfs/imfs_init.c
index 6582e72614..4ed08bd500 100644
--- a/cpukit/libfs/src/imfs/imfs_init.c
+++ b/cpukit/libfs/src/imfs/imfs_init.c
@@ -63,7 +63,6 @@ int IMFS_initialize(
return IMFS_initialize_support(
temp_mt_entry,
&IMFS_ops,
- &IMFS_linearfile_handlers,
&IMFS_memfile_handlers,
&IMFS_directory_handlers
);
diff --git a/cpukit/libfs/src/imfs/imfs_initsupp.c b/cpukit/libfs/src/imfs/imfs_initsupp.c
index 070434343e..6cfae62438 100644
--- a/cpukit/libfs/src/imfs/imfs_initsupp.c
+++ b/cpukit/libfs/src/imfs/imfs_initsupp.c
@@ -37,7 +37,6 @@
int IMFS_initialize_support(
rtems_filesystem_mount_table_entry_t *temp_mt_entry,
rtems_filesystem_operations_table *op_table,
- rtems_filesystem_file_handlers_r *linearfile_handlers,
rtems_filesystem_file_handlers_r *memfile_handlers,
rtems_filesystem_file_handlers_r *directory_handlers
)
@@ -78,7 +77,6 @@ int IMFS_initialize_support(
*/
fs_info->ino_count = 1;
- fs_info->linearfile_handlers = linearfile_handlers;
fs_info->memfile_handlers = memfile_handlers;
fs_info->directory_handlers = directory_handlers;
diff --git a/cpukit/libfs/src/imfs/imfs_load_tar.c b/cpukit/libfs/src/imfs/imfs_load_tar.c
index 8e47881930..b206547fb7 100644
--- a/cpukit/libfs/src/imfs/imfs_load_tar.c
+++ b/cpukit/libfs/src/imfs/imfs_load_tar.c
@@ -25,6 +25,7 @@
#include <rtems/chain.h>
#include <rtems/imfs.h>
#include <rtems/untar.h>
+#include <rtems/tar.h>
/**************************************************************************
* TAR file format:
@@ -141,10 +142,9 @@ rtems_tarfs_load(char *mountpoint,
mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO);
}
/******************************************************************
- * Create a LINEAR_FILE node if no user write permission.
+ * Create a LINEAR_FILE node
*****************************************************************/
- else if ((linkflag == REGTYPE) &&
- ((file_mode & 0200) == 0000))
+ else if (linkflag == REGTYPE)
{
const char *name;
@@ -152,9 +152,9 @@ rtems_tarfs_load(char *mountpoint,
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0)
{
node = IMFS_create_node(&loc,
- IMFS_LINEAR_FILE, (char *)name,
- (S_IRUSR | S_IRGRP | S_IROTH) | S_IFREG,
- NULL);
+ IMFS_LINEAR_FILE, (char *)name,
+ (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
+ NULL);
node->info.linearfile.size = file_size;
node->info.linearfile.direct = &tar_image[offset];
}
@@ -162,36 +162,6 @@ rtems_tarfs_load(char *mountpoint,
nblocks = (((file_size) + 511) & ~511) / 512;
offset += 512 * nblocks;
}
- /******************************************************************
- * Create a regular MEMORY_FILE if write permission exists.
- *****************************************************************/
- else if ((linkflag == REGTYPE) &&
- ((file_mode & 0200) == 0200))
- {
- int fd;
- int n, left, ptr;
-
- strcpy(full_filename, mountpoint);
- if (full_filename[strlen(full_filename)-1] != '/')
- strcat(full_filename, "/");
- strcat(full_filename, filename);
-
- fd = creat(full_filename, S_IRUSR|S_IWUSR | S_IRGRP|S_IWGRP);
- if (fd != -1)
- {
- left = file_size;
- ptr = offset;
- while ((n = write(fd, &tar_image[ptr], left)) > 0)
- {
- left -= n;
- ptr += n;
- }
- close(fd);
- }
-
- nblocks = (((file_size) + 511) & ~511) / 512;
- offset += 512 * nblocks;
- }
}
return(status);
diff --git a/cpukit/libfs/src/imfs/linearfile.c b/cpukit/libfs/src/imfs/linearfile.c
deleted file mode 100644
index 1fc0db3ae7..0000000000
--- a/cpukit/libfs/src/imfs/linearfile.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * IMFS Linear File Handlers
- *
- * This file contains the set of handlers used to process operations on
- * IMFS linear memory file nodes. Linear memory files are contiguous
- * blocks of memory created from a TAR or other filesystem image.
- * The blocks are nonwriteable and nonresizeable.
- *
- * COPYRIGHT (c) 1989-1999.
- * On-Line Applications Research Corporation (OAR).
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.com/license/LICENSE.
- *
- * $Id$
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <assert.h>
-#include <string.h>
-#include <errno.h>
-
-#include <rtems.h>
-#include <rtems/libio.h>
-#include "imfs.h"
-#include <rtems/libio_.h>
-#include <rtems/seterr.h>
-
-/*
- * linearfile_read
- *
- * This routine processes the read() system call.
- */
-
-int linearfile_read(
- rtems_libio_t *iop,
- void *buffer,
- uint32_t count
-)
-{
- IMFS_jnode_t *the_jnode;
- unsigned char *dest;
- unsigned char *file_ptr;
- int file_offset;
-
-
- the_jnode = iop->file_info;
-
- /*
- * Perform internal consistency checks
- */
-
- assert( the_jnode );
- if ( !the_jnode )
- rtems_set_errno_and_return_minus_one( EIO );
-
- assert( the_jnode->type == IMFS_LINEAR_FILE );
- if ( the_jnode->type != IMFS_LINEAR_FILE )
- rtems_set_errno_and_return_minus_one( EIO );
-
- /*
- * Error checks on arguments
- */
-
- dest = (unsigned char *)buffer;
- assert( dest );
- if ( !dest )
- rtems_set_errno_and_return_minus_one( EINVAL );
-
- /*
- * Perform a simple memory copy.
- */
-
- if (count == 0)
- return(0);
-
- the_jnode = iop->file_info;
- file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
- file_offset = (unsigned long)iop->offset;
-
- if (count > (the_jnode->info.linearfile.size - file_offset))
- count = the_jnode->info.linearfile.size - file_offset;
-
- memcpy(dest, &file_ptr[file_offset], count);
-
- return(count);
-}
-
-
-/*
- * linearfile_lseek
- *
- * This routine processes the lseek() system call.
- */
-
-int linearfile_lseek(
- rtems_libio_t *iop,
- off_t offset,
- int whence
-)
-{
- IMFS_jnode_t *the_jnode;
-
- the_jnode = iop->file_info;
-
- if (iop->offset > the_jnode->info.linearfile.size)
- iop->offset = the_jnode->info.linearfile.size;
-
- return iop->offset;
-}
diff --git a/cpukit/libfs/src/imfs/memfile.c b/cpukit/libfs/src/imfs/memfile.c
index 1a68531c38..4b4dc8ccce 100644
--- a/cpukit/libfs/src/imfs/memfile.c
+++ b/cpukit/libfs/src/imfs/memfile.c
@@ -99,6 +99,23 @@ int memfile_open(
the_jnode = iop->file_info;
+ /*
+ * Perform 'copy on write' for linear files
+ */
+ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
+ && (the_jnode->type == IMFS_LINEAR_FILE)) {
+ uint32_t count = the_jnode->info.linearfile.size;
+ const unsigned char *buffer = the_jnode->info.linearfile.direct;
+
+ the_jnode->type = IMFS_MEMORY_FILE;
+ 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;
+ if ((count != 0)
+ && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
+ return -1;
+ }
if (iop->flags & LIBIO_FLAGS_APPEND)
iop->offset = the_jnode->info.file.size;
diff --git a/cpukit/libfs/src/imfs/miniimfs_init.c b/cpukit/libfs/src/imfs/miniimfs_init.c
index cf4492541b..fdf2310cf3 100644
--- a/cpukit/libfs/src/imfs/miniimfs_init.c
+++ b/cpukit/libfs/src/imfs/miniimfs_init.c
@@ -63,7 +63,6 @@ int miniIMFS_initialize(
return IMFS_initialize_support(
temp_mt_entry,
&miniIMFS_ops,
- &rtems_filesystem_null_handlers, /* for linearfiles */
&rtems_filesystem_null_handlers, /* for memfiles */
&rtems_filesystem_null_handlers /* for directories */
);