From a45dfa1447300c7955328de2478d5bba7ad87608 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 20 Feb 2015 09:42:15 +0100 Subject: 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 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 #include #include +#include #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 *** -- cgit v1.2.3