summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-02-20 09:42:15 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-02-20 09:42:15 +0100
commita45dfa1447300c7955328de2478d5bba7ad87608 (patch)
treecaf4e5cfb924351134b8d0ab15ddcda7f0fc2bd2
parent5eb27ce4095c85451964db5f83d10df12ab037db (diff)
downloadrtems-a45dfa1447300c7955328de2478d5bba7ad87608.tar.bz2
IMFS: Fix copy on write for linfiles
-rw-r--r--cpukit/libfs/src/imfs/imfs_linfile.c3
-rw-r--r--testsuites/libtests/tar02/init.c71
-rw-r--r--testsuites/libtests/tar02/tar02.scn1
3 files changed, 70 insertions, 5 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_linfile.c b/cpukit/libfs/src/imfs/imfs_linfile.c
index 8a1486600b..5840c16d98 100644
--- a/cpukit/libfs/src/imfs/imfs_linfile.c
+++ b/cpukit/libfs/src/imfs/imfs_linfile.c
@@ -63,6 +63,9 @@ static int IMFS_linfile_open(
file->Memfile.indirect = 0;
file->Memfile.doubly_indirect = 0;
file->Memfile.triply_indirect = 0;
+
+ IMFS_Set_handlers( &iop->pathinfo );
+
if ((count != 0)
&& (IMFS_memfile_write(&file->Memfile, 0, buffer, count) == -1))
return -1;
diff --git a/testsuites/libtests/tar02/init.c b/testsuites/libtests/tar02/init.c
index 8d790f6e61..23c1187034 100644
--- a/testsuites/libtests/tar02/init.c
+++ b/testsuites/libtests/tar02/init.c
@@ -22,6 +22,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
+#include <string.h>
#include "initial_filesystem_tar.h"
@@ -34,10 +35,67 @@ void test_tarfs_load(void);
#define TARFILE_START initial_filesystem_tar
#define TARFILE_SIZE initial_filesystem_tar_size
+static const char file[] = "/home/test_file";
+
+static const char content_0[] =
+ "This is a test of loading an RTEMS filesystem from an\n"
+ "initial tar image.\n";
+
+static const char content_1[] =
+ "This is a test of loading an RTEMS filesystem from an\n"
+ "initial tar image.\n"
+ "And some other stuff.\n";
+
+static char buf[sizeof(content_1) - 1];
+
+static void check_file(
+ const char *file,
+ const char *expected_content,
+ char *buf,
+ size_t size
+)
+{
+ int fd;
+ ssize_t n;
+ int rv;
+
+ fd = open(file, O_RDONLY);
+ rtems_test_assert(fd >= 0);
+
+ n = read(fd, buf, size);
+ rtems_test_assert(n == (ssize_t) size);
+
+ rtems_test_assert(memcmp(expected_content, buf, size) == 0);
+
+ rv = close(fd);
+ rtems_test_assert(rv == 0);
+}
+
+static void write_file(
+ const char *file,
+ const char *content,
+ size_t size
+)
+{
+ int fd;
+ ssize_t n;
+ int rv;
+
+ fd = open(file, O_WRONLY);
+ rtems_test_assert(fd >= 0);
+
+ n = write(fd, content, size);
+ rtems_test_assert(n == (ssize_t) size);
+
+ rv = close(fd);
+ rtems_test_assert(rv == 0);
+}
+
+/* FIXME */
void test_cat(
- char *file,
- int offset_arg,
- int length
+ const char *file,
+ int offset_arg,
+ int length
);
void test_tarfs_load(void)
@@ -54,8 +112,11 @@ void test_tarfs_load(void)
/******************/
printf( "========= /home/test_file =========\n" );
- test_cat( "/home/test_file", 0, 0 );
-
+ test_cat(&file[0], 0, 0);
+ check_file(&file[0], &content_0[0], &buf[0], sizeof(content_0) - 1);
+ write_file(&file[0], &content_1[0], sizeof(content_1) - 1);
+ check_file(&file[0], &content_1[0], &buf[0], sizeof(content_1) - 1);
+
/******************/
printf( "========= /symlink =========\n" );
test_cat( "/symlink", 0, 0 );
diff --git a/testsuites/libtests/tar02/tar02.scn b/testsuites/libtests/tar02/tar02.scn
index e7a9165220..d1e4c81502 100644
--- a/testsuites/libtests/tar02/tar02.scn
+++ b/testsuites/libtests/tar02/tar02.scn
@@ -7,5 +7,6 @@ initial tar image.
========= /symlink =========
(0)This is a test of loading an RTEMS filesystem from an
initial tar image.
+And some other stuff.
*** END OF TEST TAR 2 ***