[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