summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-12-13 16:15:25 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-02-02 15:01:22 +0100
commit3b77417ba7a6ad6cb6bbfaeccc4cfd0cd7198489 (patch)
tree1daaeda170261ef780e22e6bfd2545d8c423b68d
parentJFFS2: Use self-contained recursive mutex (diff)
downloadrtems-3b77417ba7a6ad6cb6bbfaeccc4cfd0cd7198489.tar.bz2
dosfs: Use self-contained recursive mutex
Update #2843.
-rwxr-xr-xcpukit/include/rtems/confdefs.h7
-rw-r--r--cpukit/libfs/src/dosfs/msdos.h21
-rw-r--r--cpukit/libfs/src/dosfs/msdos_dir.c26
-rw-r--r--cpukit/libfs/src/dosfs/msdos_file.c46
-rw-r--r--cpukit/libfs/src/dosfs/msdos_fsunmount.c2
-rw-r--r--cpukit/libfs/src/dosfs/msdos_init.c16
-rw-r--r--cpukit/libfs/src/dosfs/msdos_initsupp.c17
-rw-r--r--cpukit/libfs/src/dosfs/msdos_misc.c8
-rw-r--r--cpukit/libfs/src/dosfs/msdos_statvfs.c10
9 files changed, 43 insertions, 110 deletions
diff --git a/cpukit/include/rtems/confdefs.h b/cpukit/include/rtems/confdefs.h
index affd49728c..f988ea9592 100755
--- a/cpukit/include/rtems/confdefs.h
+++ b/cpukit/include/rtems/confdefs.h
@@ -417,14 +417,8 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
#if !defined(CONFIGURE_FILESYSTEM_ENTRY_DOSFS) && \
defined(CONFIGURE_FILESYSTEM_DOSFS)
#include <rtems/dosfs.h>
- #if !defined(CONFIGURE_MAXIMUM_DOSFS_MOUNTS)
- #define CONFIGURE_MAXIMUM_DOSFS_MOUNTS 1
- #endif
#define CONFIGURE_FILESYSTEM_ENTRY_DOSFS \
{ RTEMS_FILESYSTEM_TYPE_DOSFS, rtems_dosfs_initialize }
- #define _CONFIGURE_SEMAPHORES_FOR_DOSFS CONFIGURE_MAXIMUM_DOSFS_MOUNTS
-#else
- #define _CONFIGURE_SEMAPHORES_FOR_DOSFS 0
#endif
/**
@@ -460,7 +454,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
#define _CONFIGURE_SEMAPHORES_FOR_FILE_SYSTEMS \
(_CONFIGURE_SEMAPHORES_FOR_FIFOS + \
_CONFIGURE_SEMAPHORES_FOR_NFS + \
- _CONFIGURE_SEMAPHORES_FOR_DOSFS + \
_CONFIGURE_SEMAPHORES_FOR_RFS)
#ifdef CONFIGURE_INIT
diff --git a/cpukit/libfs/src/dosfs/msdos.h b/cpukit/libfs/src/dosfs/msdos.h
index abfede8203..ea94954cac 100644
--- a/cpukit/libfs/src/dosfs/msdos.h
+++ b/cpukit/libfs/src/dosfs/msdos.h
@@ -24,6 +24,7 @@
#include <rtems.h>
#include <rtems/libio_.h>
#include <rtems/dosfs.h>
+#include <rtems/thread.h>
#include "fat.h"
#include "fat_file.h"
@@ -62,11 +63,7 @@ typedef struct msdos_fs_info_s
* nodes of file
* type
*/
- rtems_id vol_sema; /*
- * semaphore
- * associated with
- * the volume
- */
+ rtems_recursive_mutex vol_mutex;
uint8_t *cl_buf; /*
* just placeholder
* for anything
@@ -75,16 +72,22 @@ typedef struct msdos_fs_info_s
rtems_dosfs_convert_control *converter;
} msdos_fs_info_t;
+RTEMS_INLINE_ROUTINE void msdos_fs_lock(msdos_fs_info_t *fs_info)
+{
+ rtems_recursive_mutex_lock(&fs_info->vol_mutex);
+}
+
+RTEMS_INLINE_ROUTINE void msdos_fs_unlock(msdos_fs_info_t *fs_info)
+{
+ rtems_recursive_mutex_unlock(&fs_info->vol_mutex);
+}
+
/* a set of routines that handle the nodes which are directories */
extern const rtems_filesystem_file_handlers_r msdos_dir_handlers;
/* a set of routines that handle the nodes which are files */
extern const rtems_filesystem_file_handlers_r msdos_file_handlers;
-/* Volume semaphore timeout value. This value can be changed to a number
- * of ticks to help debugging or if you need such a */
-#define MSDOS_VOLUME_SEMAPHORE_TIMEOUT RTEMS_NO_TIMEOUT
-
/*
* Macros for fetching fields from 32 bytes long FAT Directory Entry
* Structure
diff --git a/cpukit/libfs/src/dosfs/msdos_dir.c b/cpukit/libfs/src/dosfs/msdos_dir.c
index e07c723e83..535d5f56f0 100644
--- a/cpukit/libfs/src/dosfs/msdos_dir.c
+++ b/cpukit/libfs/src/dosfs/msdos_dir.c
@@ -65,7 +65,6 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
{
int rc = RC_OK;
int eno = 0;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
rtems_dosfs_convert_control *converter = fs_info->converter;
const rtems_dosfs_convert_handler *convert_handler = converter->handler;
@@ -87,10 +86,7 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
int lfn_entries = 0;
bool is_first_entry;
- 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);
+ msdos_fs_lock(fs_info);
/*
* cast start and count - protect against using sizes that are not exact
@@ -123,7 +119,7 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
bts2rd, fs_info->cl_buf);
if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
rtems_set_errno_and_return_minus_one(EIO);
}
@@ -137,7 +133,7 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
if ((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
MSDOS_THIS_DIR_ENTRY_AND_REST_EMPTY)
{
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return cmpltd;
}
@@ -252,7 +248,7 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
j * bts2rd, &cur_cln);
if (rc != RC_OK)
{
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return rc;
}
@@ -262,7 +258,7 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
rc = fat_file_open(&fs_info->fat, &dir_pos, &tmp_fat_fd);
if (rc != RC_OK)
{
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return rc;
}
@@ -336,7 +332,7 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
rc = fat_file_close(&fs_info->fat, tmp_fat_fd);
if (rc != RC_OK)
{
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return rc;
}
}
@@ -348,7 +344,7 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
j++;
}
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return cmpltd;
}
@@ -382,14 +378,10 @@ msdos_dir_stat(
struct stat *buf
)
{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->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);
+ msdos_fs_lock(fs_info);
buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
buf->st_ino = fat_fd->ino;
@@ -402,7 +394,7 @@ msdos_dir_stat(
buf->st_ctime = fat_fd->ctime;
buf->st_mtime = fat_fd->mtime;
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return RC_OK;
}
diff --git a/cpukit/libfs/src/dosfs/msdos_file.c b/cpukit/libfs/src/dosfs/msdos_file.c
index d150a1ff22..d7b170a01a 100644
--- a/cpukit/libfs/src/dosfs/msdos_file.c
+++ b/cpukit/libfs/src/dosfs/msdos_file.c
@@ -47,21 +47,17 @@ ssize_t
msdos_file_read(rtems_libio_t *iop, void *buffer, size_t count)
{
ssize_t ret = 0;
- 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);
+ msdos_fs_lock(fs_info);
ret = fat_file_read(&fs_info->fat, fat_fd, iop->offset, count,
buffer);
if (ret > 0)
iop->offset += ret;
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return ret;
}
@@ -82,14 +78,10 @@ ssize_t
msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
{
ssize_t ret = 0;
- 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);
+ msdos_fs_lock(fs_info);
if (rtems_libio_iop_is_append(iop))
iop->offset = fat_fd->fat_file_size;
@@ -98,7 +90,7 @@ msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
buffer);
if (ret < 0)
{
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return -1;
}
@@ -113,7 +105,7 @@ msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
if (ret > 0)
fat_file_set_ctime_mtime(fat_fd, time(NULL));
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return ret;
}
@@ -132,15 +124,11 @@ msdos_file_stat(
struct stat *buf
)
{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->node_access;
uint32_t cl_mask = fs_info->fat.vol.bpc - 1;
- 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);
+ msdos_fs_lock(fs_info);
buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
buf->st_ino = fat_fd->ino;
@@ -154,7 +142,7 @@ msdos_file_stat(
buf->st_ctime = fat_fd->ctime;
buf->st_mtime = fat_fd->mtime;
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return RC_OK;
}
@@ -172,15 +160,11 @@ int
msdos_file_ftruncate(rtems_libio_t *iop, off_t length)
{
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;
uint32_t old_length;
- 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);
+ msdos_fs_lock(fs_info);
old_length = fat_fd->fat_file_size;
if (length < old_length) {
@@ -206,7 +190,7 @@ msdos_file_ftruncate(rtems_libio_t *iop, off_t length)
fat_file_set_ctime_mtime(fat_fd, time(NULL));
}
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return rc;
}
@@ -225,27 +209,21 @@ int
msdos_file_sync(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);
+ msdos_fs_lock(fs_info);
rc = fat_file_update(&fs_info->fat, fat_fd);
if (rc != RC_OK)
{
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return rc;
}
rc = fat_sync(&fs_info->fat);
- rtems_semaphore_release(fs_info->vol_sema);
- if ( rc != 0 )
- rtems_set_errno_and_return_minus_one(EIO);
+ msdos_fs_unlock(fs_info);
return RC_OK;
}
diff --git a/cpukit/libfs/src/dosfs/msdos_fsunmount.c b/cpukit/libfs/src/dosfs/msdos_fsunmount.c
index e3cef45824..6b44ab0fdb 100644
--- a/cpukit/libfs/src/dosfs/msdos_fsunmount.c
+++ b/cpukit/libfs/src/dosfs/msdos_fsunmount.c
@@ -54,7 +54,7 @@ msdos_shut_down(rtems_filesystem_mount_table_entry_t *temp_mt_entry)
fat_shutdown_drive(&fs_info->fat);
- rtems_semaphore_delete(fs_info->vol_sema);
+ rtems_recursive_mutex_destroy(&fs_info->vol_mutex);
(*converter->handler->destroy)( converter );
free(fs_info->cl_buf);
free(temp_mt_entry->fs_info);
diff --git a/cpukit/libfs/src/dosfs/msdos_init.c b/cpukit/libfs/src/dosfs/msdos_init.c
index 59afaf15ef..6ae77c86ae 100644
--- a/cpukit/libfs/src/dosfs/msdos_init.c
+++ b/cpukit/libfs/src/dosfs/msdos_init.c
@@ -75,24 +75,12 @@ const rtems_filesystem_operations_table msdos_ops = {
void msdos_lock(const rtems_filesystem_mount_table_entry_t *mt_entry)
{
- msdos_fs_info_t *fs_info = mt_entry->fs_info;
- rtems_status_code sc = rtems_semaphore_obtain(
- fs_info->vol_sema,
- RTEMS_WAIT,
- RTEMS_NO_TIMEOUT
- );
- if (sc != RTEMS_SUCCESSFUL) {
- rtems_fatal_error_occurred(0xdeadbeef);
- }
+ msdos_fs_lock(mt_entry->fs_info);
}
void msdos_unlock(const rtems_filesystem_mount_table_entry_t *mt_entry)
{
- msdos_fs_info_t *fs_info = mt_entry->fs_info;
- rtems_status_code sc = rtems_semaphore_release(fs_info->vol_sema);
- if (sc != RTEMS_SUCCESSFUL) {
- rtems_fatal_error_occurred(0xdeadbeef);
- }
+ msdos_fs_unlock(mt_entry->fs_info);
}
/* msdos_initialize --
diff --git a/cpukit/libfs/src/dosfs/msdos_initsupp.c b/cpukit/libfs/src/dosfs/msdos_initsupp.c
index b43e61dde0..a8451615d2 100644
--- a/cpukit/libfs/src/dosfs/msdos_initsupp.c
+++ b/cpukit/libfs/src/dosfs/msdos_initsupp.c
@@ -57,7 +57,6 @@ msdos_initialize_support(
)
{
int rc = RC_OK;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = NULL;
fat_file_fd_t *fat_fd = NULL;
fat_dir_pos_t root_pos;
@@ -133,20 +132,8 @@ msdos_initialize_support(
rtems_set_errno_and_return_minus_one(ENOMEM);
}
- sc = rtems_semaphore_create(3,
- 1,
- RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY |
- RTEMS_INHERIT_PRIORITY,
- 0,
- &fs_info->vol_sema);
- if (sc != RTEMS_SUCCESSFUL)
- {
- fat_file_close(&fs_info->fat, fat_fd);
- fat_shutdown_drive(&fs_info->fat);
- free(fs_info->cl_buf);
- free(fs_info);
- rtems_set_errno_and_return_minus_one( EIO );
- }
+ rtems_recursive_mutex_init(&fs_info->vol_mutex,
+ RTEMS_FILESYSTEM_TYPE_DOSFS);
temp_mt_entry->mt_fs_root->location.node_access = fat_fd;
temp_mt_entry->mt_fs_root->location.handlers = directory_handlers;
diff --git a/cpukit/libfs/src/dosfs/msdos_misc.c b/cpukit/libfs/src/dosfs/msdos_misc.c
index 24eb2d11e0..20fcbb3b75 100644
--- a/cpukit/libfs/src/dosfs/msdos_misc.c
+++ b/cpukit/libfs/src/dosfs/msdos_misc.c
@@ -2072,16 +2072,12 @@ int
msdos_sync(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);
+ msdos_fs_lock(fs_info);
rc = fat_sync(&fs_info->fat);
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return rc;
}
diff --git a/cpukit/libfs/src/dosfs/msdos_statvfs.c b/cpukit/libfs/src/dosfs/msdos_statvfs.c
index 99f200f3b7..a9e61c568f 100644
--- a/cpukit/libfs/src/dosfs/msdos_statvfs.c
+++ b/cpukit/libfs/src/dosfs/msdos_statvfs.c
@@ -24,12 +24,8 @@ int msdos_statvfs(
{
msdos_fs_info_t *fs_info = root_loc->mt_entry->fs_info;
fat_vol_t *vol = &fs_info->fat.vol;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- 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);
+ msdos_fs_lock(fs_info);
sb->f_bsize = FAT_SECTOR512_SIZE;
sb->f_frsize = vol->bpc;
@@ -54,7 +50,7 @@ int msdos_statvfs(
rc = fat_get_fat_cluster(&fs_info->fat, cur_cl, &value);
if (rc != RC_OK)
{
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return rc;
}
@@ -71,6 +67,6 @@ int msdos_statvfs(
sb->f_bavail = vol->free_cls;
}
- rtems_semaphore_release(fs_info->vol_sema);
+ msdos_fs_unlock(fs_info);
return RC_OK;
}