[rtems commit] IMFS: Fix copy on write for linfiles

Sebastian Huber sebh at rtems.org
Fri Feb 20 08:42:56 UTC 2015


Module:    rtems
Branch:    master
Commit:    a45dfa1447300c7955328de2478d5bba7ad87608
Changeset: http://git.rtems.org/rtems/commit/?id=a45dfa1447300c7955328de2478d5bba7ad87608

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Feb 20 09:42:15 2015 +0100

IMFS: Fix copy on write for linfiles

---

 cpukit/libfs/src/imfs/imfs_linfile.c |  3 ++
 testsuites/libtests/tar02/init.c     | 71 +++++++++++++++++++++++++++++++++---
 testsuites/libtests/tar02/tar02.scn  |  1 +
 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 8a14866..5840c16 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 8d790f6..23c1187 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 e7a9165..d1e4c81 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 ***



More information about the vc mailing list