[PATCH 2/3] Filesystem: PR1871: Fix O_APPEND

sebastian.huber at embedded-brains.de sebastian.huber at embedded-brains.de
Mon May 7 15:09:05 UTC 2012


From: Sebastian Huber <sebastian.huber at embedded-brains.de>

---
 cpukit/libfs/src/dosfs/msdos.h               |   16 ------
 cpukit/libfs/src/dosfs/msdos_dir.c           |   64 --------------------------
 cpukit/libfs/src/dosfs/msdos_file.c          |   46 +-----------------
 cpukit/libfs/src/dosfs/msdos_handlers_dir.c  |    4 +-
 cpukit/libfs/src/dosfs/msdos_handlers_file.c |    2 +-
 cpukit/libfs/src/imfs/memfile.c              |    7 ++-
 cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c  |    3 +
 testsuites/fstests/fsrdwr/init.c             |   10 ++++-
 8 files changed, 22 insertions(+), 130 deletions(-)

diff --git a/cpukit/libfs/src/dosfs/msdos.h b/cpukit/libfs/src/dosfs/msdos.h
index a7aff1d..0696b8f 100644
--- a/cpukit/libfs/src/dosfs/msdos.h
+++ b/cpukit/libfs/src/dosfs/msdos.h
@@ -265,13 +265,6 @@ int msdos_initialize_support(
   const rtems_filesystem_file_handlers_r  *directory_handlers
 );
 
-int msdos_file_open(
-  rtems_libio_t *iop,             /* IN  */
-  const char    *pathname,        /* IN  */
-  int            oflag,           /* IN  */
-  mode_t         mode             /* IN  */
-);
-
 int msdos_file_close(rtems_libio_t *iop /* IN  */);
 
 ssize_t msdos_file_read(
@@ -301,15 +294,6 @@ int msdos_file_sync(rtems_libio_t *iop);
 
 int msdos_file_datasync(rtems_libio_t *iop);
 
-int msdos_dir_open(
-  rtems_libio_t *iop,             /* IN  */
-  const char    *pathname,        /* IN  */
-  int            oflag,           /* IN  */
-  mode_t         mode             /* IN  */
-);
-
-int msdos_dir_close(rtems_libio_t *iop /* IN  */);
-
 ssize_t msdos_dir_read(
   rtems_libio_t *iop,              /* IN  */
   void          *buffer,           /* IN  */
diff --git a/cpukit/libfs/src/dosfs/msdos_dir.c b/cpukit/libfs/src/dosfs/msdos_dir.c
index be6b5a9..38ea667 100644
--- a/cpukit/libfs/src/dosfs/msdos_dir.c
+++ b/cpukit/libfs/src/dosfs/msdos_dir.c
@@ -30,70 +30,6 @@
 
 #include "msdos.h"
 
-/* msdos_dir_open --
- *     Open fat-file which correspondes to the directory being opened and
- *     set offset field of file control block to zero.
- */
-int
-msdos_dir_open(rtems_libio_t *iop, const char *pathname, int oflag,
-               mode_t mode)
-{
-    int                rc = RC_OK;
-    rtems_status_code  sc = RTEMS_SUCCESSFUL;
-    msdos_fs_info_t   *fs_info = iop->pathinfo.mt_entry->fs_info;
-    fat_file_fd_t     *fat_fd = iop->pathinfo.node_access;
-
-    sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
-                                MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
-    if (sc != RTEMS_SUCCESSFUL)
-        rtems_set_errno_and_return_minus_one( EIO );
-
-    rc = fat_file_reopen(fat_fd);
-    if (rc != RC_OK)
-    {
-        rtems_semaphore_release(fs_info->vol_sema);
-        return rc;
-    }
-
-    iop->offset = 0;
-    rtems_semaphore_release(fs_info->vol_sema);
-    return RC_OK;
-}
-
-/* msdos_dir_close --
- *     Close  fat-file which correspondes to the directory being closed
- *
- * PARAMETERS:
- *     iop - file control block
- *
- * RETURNS:
- *     RC_OK, if directory closed successfully, or -1 if error occured (errno
- *     set apropriately.
- */
-int
-msdos_dir_close(rtems_libio_t *iop)
-{
-    int                rc = RC_OK;
-    rtems_status_code  sc = RTEMS_SUCCESSFUL;
-    msdos_fs_info_t   *fs_info = iop->pathinfo.mt_entry->fs_info;
-    fat_file_fd_t     *fat_fd = iop->pathinfo.node_access;
-
-    sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
-                                MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
-    if (sc != RTEMS_SUCCESSFUL)
-        rtems_set_errno_and_return_minus_one( EIO );
-
-    rc = fat_file_close(iop->pathinfo.mt_entry, fat_fd);
-    if (rc != RC_OK)
-    {
-        rtems_semaphore_release(fs_info->vol_sema);
-        return rc;
-    }
-
-    rtems_semaphore_release(fs_info->vol_sema);
-    return RC_OK;
-}
-
 /*  msdos_format_dirent_with_dot --
  *      This routine convert a (short) MSDOS filename as present on disk
  *      (fixed 8+3 characters, filled with blanks, without separator dot)
diff --git a/cpukit/libfs/src/dosfs/msdos_file.c b/cpukit/libfs/src/dosfs/msdos_file.c
index c2db196..6eb9b79 100644
--- a/cpukit/libfs/src/dosfs/msdos_file.c
+++ b/cpukit/libfs/src/dosfs/msdos_file.c
@@ -27,47 +27,6 @@
 
 #include "msdos.h"
 
-/* msdos_file_open --
- *     Open fat-file which correspondes to the file
- *
- * PARAMETERS:
- *     iop        - file control block
- *     pathname   - name
- *     flag       - flags
- *     mode       - mode
- *
- * RETURNS:
- *     RC_OK, if file opened successfully, or -1 if error occured
- *     and errno set appropriately
- */
-int
-msdos_file_open(rtems_libio_t *iop, const char *pathname, int oflag,
-                mode_t mode)
-{
-    int                rc = RC_OK;
-    rtems_status_code  sc = RTEMS_SUCCESSFUL;
-    msdos_fs_info_t   *fs_info = iop->pathinfo.mt_entry->fs_info;
-    fat_file_fd_t     *fat_fd = iop->pathinfo.node_access;
-
-    sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
-                                MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
-    if (sc != RTEMS_SUCCESSFUL)
-        rtems_set_errno_and_return_minus_one(EIO);
-
-    rc = fat_file_reopen(fat_fd);
-    if (rc != RC_OK)
-    {
-        rtems_semaphore_release(fs_info->vol_sema);
-        return rc;
-    }
-
-    if (iop->flags & LIBIO_FLAGS_APPEND)
-        iop->offset = fat_fd->fat_file_size;
-
-    rtems_semaphore_release(fs_info->vol_sema);
-    return RC_OK;
-}
-
 /* msdos_file_close --
  *     Close fat-file which correspondes to the file. If fat-file descriptor
  *     which correspondes to the file is not marked "removed", synchronize
@@ -121,8 +80,6 @@ msdos_file_close(rtems_libio_t *iop)
         }
     }
 
-    rc = fat_file_close(iop->pathinfo.mt_entry, fat_fd);
-
     rtems_semaphore_release(fs_info->vol_sema);
     return rc;
 }
@@ -186,6 +143,9 @@ msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
     if (sc != RTEMS_SUCCESSFUL)
         rtems_set_errno_and_return_minus_one(EIO);
 
+    if ((iop->flags & LIBIO_FLAGS_APPEND) != 0)
+        iop->offset = fat_fd->fat_file_size;
+
     ret = fat_file_write(iop->pathinfo.mt_entry, fat_fd, iop->offset, count,
                          buffer);
     if (ret < 0)
diff --git a/cpukit/libfs/src/dosfs/msdos_handlers_dir.c b/cpukit/libfs/src/dosfs/msdos_handlers_dir.c
index eeaa77d..8c7dcdc 100644
--- a/cpukit/libfs/src/dosfs/msdos_handlers_dir.c
+++ b/cpukit/libfs/src/dosfs/msdos_handlers_dir.c
@@ -19,8 +19,8 @@
 #include "msdos.h"
 
 const rtems_filesystem_file_handlers_r msdos_dir_handlers = {
-    msdos_dir_open,
-    msdos_dir_close,
+    rtems_filesystem_default_open,
+    rtems_filesystem_default_close,
     msdos_dir_read,
     rtems_filesystem_default_write,
     rtems_filesystem_default_ioctl,
diff --git a/cpukit/libfs/src/dosfs/msdos_handlers_file.c b/cpukit/libfs/src/dosfs/msdos_handlers_file.c
index e68a09f..12cdaa0 100644
--- a/cpukit/libfs/src/dosfs/msdos_handlers_file.c
+++ b/cpukit/libfs/src/dosfs/msdos_handlers_file.c
@@ -19,7 +19,7 @@
 #include "msdos.h"
 
 const rtems_filesystem_file_handlers_r msdos_file_handlers = {
-    msdos_file_open,
+    rtems_filesystem_default_open,
     msdos_file_close,
     msdos_file_read,
     msdos_file_write,
diff --git a/cpukit/libfs/src/imfs/memfile.c b/cpukit/libfs/src/imfs/memfile.c
index 64679df..d836172 100644
--- a/cpukit/libfs/src/imfs/memfile.c
+++ b/cpukit/libfs/src/imfs/memfile.c
@@ -92,7 +92,7 @@ int memfile_open(
   /*
    * Perform 'copy on write' for linear files
    */
-  if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
+  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;
@@ -106,8 +106,6 @@ int memfile_open(
      && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
         return -1;
   }
-  if (iop->flags & LIBIO_FLAGS_APPEND)
-    iop->offset = the_jnode->info.file.size;
 
   return 0;
 }
@@ -146,6 +144,9 @@ ssize_t memfile_write(
 
   the_jnode = iop->pathinfo.node_access;
 
+  if ((iop->flags & LIBIO_FLAGS_APPEND) != 0)
+    iop->offset = the_jnode->info.file.size;
+
   status = IMFS_memfile_write( the_jnode, iop->offset, buffer, count );
 
   return status;
diff --git a/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c b/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c
index c189269..1f7a315 100644
--- a/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c
+++ b/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c
@@ -194,6 +194,9 @@ rtems_rfs_rtems_file_write (rtems_libio_t* iop,
 
   rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
 
+  if ((iop->flags & LIBIO_FLAGS_APPEND) != 0)
+    iop->offset = rtems_rfs_file_size (file);
+
   pos = iop->offset;
 
   /*
diff --git a/testsuites/fstests/fsrdwr/init.c b/testsuites/fstests/fsrdwr/init.c
index 8b40f07..bfaa8ab 100644
--- a/testsuites/fstests/fsrdwr/init.c
+++ b/testsuites/fstests/fsrdwr/init.c
@@ -112,6 +112,12 @@ read_write_test (void)
   rtems_test_assert (n == len);
   pos = lseek (fd, 0, SEEK_CUR);
   rtems_test_assert (pos == 2 * len);
+  pos = lseek (fd, 0, SEEK_SET);
+  rtems_test_assert (pos == 0);
+  n = write (fd, databuf, len);
+  rtems_test_assert (n == len);
+  pos = lseek (fd, 0, SEEK_CUR);
+  rtems_test_assert (pos == 3 * len);
   status = close (fd);
   rtems_test_assert (status == 0);
 
@@ -123,7 +129,9 @@ read_write_test (void)
   n = read (fd, readbuf, len);
   rtems_test_assert (n == len);
   rtems_test_assert (!strncmp (databuf, readbuf, len));
-
+  n = read (fd, readbuf, len);
+  rtems_test_assert (n == len);
+  rtems_test_assert (!strncmp (databuf, readbuf, len));
   n = read (fd, readbuf, len);
   rtems_test_assert (n == len);
   rtems_test_assert (!strncmp (databuf, readbuf, len));
-- 
1.6.4.2




More information about the devel mailing list