summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/dosfs/msdos_file.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-05-09 14:33:51 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-05-11 13:58:43 +0200
commit86ef0df976faf1b060347a07744814458aa42619 (patch)
treed001b836005d059b5aa11cf541093f5027c50d28 /cpukit/libfs/src/dosfs/msdos_file.c
parentlibblock: Add RTEMS_BLKIO_PURGEDEV (diff)
downloadrtems-86ef0df976faf1b060347a07744814458aa42619.tar.bz2
dosfs: Remove fat_file_datasync()
The fat_file_datasync() read every cluster of the file into the cache and then synchronized it step-by-step. For unmodified buffers this is a non-operation. For modified buffers this will wake-up the swapout task which performs then a single buffer write operation. This is usually quite inefficient. Firstly we do single buffer writes, secondly we may perform a lot of unnecessary read operations (for huge files this is really bad), and thirdly this leads likely to cache evictions. The synchronization procedure is replaced by a simple rtems_bdbuf_sync_dev(). This has the side-effect that also buffers not related to the file are synchronized, but since the modified list is normally short this should be acceptable.
Diffstat (limited to 'cpukit/libfs/src/dosfs/msdos_file.c')
-rw-r--r--cpukit/libfs/src/dosfs/msdos_file.c116
1 files changed, 35 insertions, 81 deletions
diff --git a/cpukit/libfs/src/dosfs/msdos_file.c b/cpukit/libfs/src/dosfs/msdos_file.c
index f68e44f948..176ec8e8db 100644
--- a/cpukit/libfs/src/dosfs/msdos_file.c
+++ b/cpukit/libfs/src/dosfs/msdos_file.c
@@ -27,30 +27,11 @@
#include "msdos.h"
-/* 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
- * size, first cluster number, write time and date fields of the file.
- *
- * PARAMETERS:
- * iop - file control block
- *
- * RETURNS:
- * RC_OK, if file closed successfully, or -1 if error occured (errno set
- * appropriately)
- */
-int
-msdos_file_close(rtems_libio_t *iop)
+static int
+msdos_file_update(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);
+ int rc = RC_OK;
+ fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
/*
* if fat-file descriptor is not marked as "removed", synchronize
@@ -61,25 +42,51 @@ msdos_file_close(rtems_libio_t *iop)
rc = msdos_set_first_cluster_num(iop->pathinfo.mt_entry, fat_fd);
if (rc != RC_OK)
{
- rtems_semaphore_release(fs_info->vol_sema);
return rc;
}
rc = msdos_set_file_size(iop->pathinfo.mt_entry, fat_fd);
if (rc != RC_OK)
{
- rtems_semaphore_release(fs_info->vol_sema);
return rc;
}
rc = msdos_set_dir_wrt_time_and_date(iop->pathinfo.mt_entry, fat_fd);
if (rc != RC_OK)
{
- rtems_semaphore_release(fs_info->vol_sema);
return rc;
}
}
+ return rc;
+}
+
+/* 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
+ * size, first cluster number, write time and date fields of the file.
+ *
+ * PARAMETERS:
+ * iop - file control block
+ *
+ * RETURNS:
+ * RC_OK, if file closed successfully, or -1 if error occured (errno set
+ * appropriately)
+ */
+int
+msdos_file_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;
+
+ 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 = msdos_file_update(iop);
+
rtems_semaphore_release(fs_info->vol_sema);
return rc;
}
@@ -276,67 +283,14 @@ msdos_file_sync(rtems_libio_t *iop)
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
- /* synchronize file data */
- rc = fat_file_datasync(iop->pathinfo.mt_entry, fat_fd);
+ rc = msdos_file_update(iop);
if (rc != RC_OK)
{
rtems_semaphore_release(fs_info->vol_sema);
return rc;
}
- /*
- * if fat-file descriptor is not marked "removed" - synchronize file
- * metadata
- */
- if (!FAT_FILE_IS_REMOVED(fat_fd))
- {
- rc = msdos_set_first_cluster_num(iop->pathinfo.mt_entry, fat_fd);
- if (rc != RC_OK)
- {
- rtems_semaphore_release(fs_info->vol_sema);
- return rc;
- }
- rc = msdos_set_file_size(iop->pathinfo.mt_entry, fat_fd);
- if (rc != RC_OK)
- {
- rtems_semaphore_release(fs_info->vol_sema);
- return rc;
- }
- rc = msdos_set_dir_wrt_time_and_date(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_file_datasync --
- * Synchronize file - synchronize only file data (metadata is letf intact).
- *
- * PARAMETERS:
- * iop - file control block
- *
- * RETURNS:
- * RC_OK on success, or -1 if error occured (errno set appropriately)
- */
-int
-msdos_file_datasync(rtems_libio_t *iop)
-{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
- msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
-
- 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);
-
- /* synchronize file data */
- fat_file_datasync(iop->pathinfo.mt_entry, fat_fd);
+ rc = msdos_sync_unprotected(fs_info);
rtems_semaphore_release(fs_info->vol_sema);
return RC_OK;