summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cpukit/libfs/src/dosfs/fat.c141
-rw-r--r--cpukit/libfs/src/dosfs/fat.h10
-rw-r--r--cpukit/libfs/src/dosfs/msdos.h2
-rw-r--r--cpukit/libfs/src/dosfs/msdos_file.c2
-rw-r--r--cpukit/libfs/src/dosfs/msdos_misc.c15
5 files changed, 84 insertions, 86 deletions
diff --git a/cpukit/libfs/src/dosfs/fat.c b/cpukit/libfs/src/dosfs/fat.c
index d40aaf04c5..c2c3e89b26 100644
--- a/cpukit/libfs/src/dosfs/fat.c
+++ b/cpukit/libfs/src/dosfs/fat.c
@@ -574,16 +574,12 @@ fat_init_volume_info(fat_fs_info_t *fs_info, const char *device)
return -1;
}
- vol->free_cls = FAT_GET_FSINFO_FREE_CLUSTER_COUNT(fs_info_sector);
- vol->next_cl = FAT_GET_FSINFO_NEXT_FREE_CLUSTER(fs_info_sector);
- rc = fat_fat32_update_fsinfo_sector(fs_info, FAT_UNDEFINED_VALUE,
- FAT_UNDEFINED_VALUE);
- if ( rc != RC_OK )
- {
- _fat_block_release(fs_info);
- close(vol->fd);
- return rc;
- }
+ vol->free_cls_in_fs_info =
+ FAT_GET_FSINFO_FREE_CLUSTER_COUNT(fs_info_sector);
+ vol->free_cls = vol->free_cls_in_fs_info;
+ vol->next_cl_in_fs_info =
+ FAT_GET_FSINFO_NEXT_FREE_CLUSTER(fs_info_sector);
+ vol->next_cl = vol->next_cl_in_fs_info;
}
}
}
@@ -645,6 +641,75 @@ fat_init_volume_info(fat_fs_info_t *fs_info, const char *device)
return RC_OK;
}
+/* fat_fat32_update_fsinfo_sector --
+ * Synchronize fsinfo sector for FAT32 volumes
+ *
+ * PARAMETERS:
+ * fs_info - FS info
+ *
+ * RETURNS:
+ * RC_OK on success, or -1 if error occured (errno set appropriately)
+ */
+static int
+fat_fat32_update_fsinfo_sector(fat_fs_info_t *fs_info)
+{
+ ssize_t ret1 = 0, ret2 = 0;
+
+ if (fs_info->vol.type == FAT_FAT32)
+ {
+ uint32_t free_count = fs_info->vol.free_cls;
+ uint32_t next_free = fs_info->vol.next_cl;
+
+ if (free_count != fs_info->vol.free_cls_in_fs_info)
+ {
+ uint32_t le_free_count = CT_LE_L(free_count);
+
+ fs_info->vol.free_cls_in_fs_info = free_count;
+
+ ret1 = _fat_block_write(fs_info,
+ fs_info->vol.info_sec,
+ FAT_FSINFO_FREE_CLUSTER_COUNT_OFFSET,
+ sizeof(le_free_count),
+ &le_free_count);
+ }
+
+ if (next_free != fs_info->vol.next_cl_in_fs_info)
+ {
+ uint32_t le_next_free = CT_LE_L(next_free);
+
+ fs_info->vol.next_cl_in_fs_info = next_free;
+
+ ret2 = _fat_block_write(fs_info,
+ fs_info->vol.info_sec,
+ FAT_FSINFO_NEXT_FREE_CLUSTER_OFFSET,
+ sizeof(le_next_free),
+ &le_next_free);
+ }
+ }
+
+ if ( (ret1 < 0) || (ret2 < 0) )
+ return -1;
+
+ return RC_OK;
+}
+
+int
+fat_sync(fat_fs_info_t *fs_info)
+{
+ int rc = RC_OK;
+
+ rc = fat_fat32_update_fsinfo_sector(fs_info);
+ if ( rc != RC_OK )
+ rc = -1;
+
+ fat_buf_release(fs_info);
+
+ if (rtems_bdbuf_syncdev(fs_info->vol.dd) != RTEMS_SUCCESSFUL)
+ rc = -1;
+
+ return rc;
+}
+
/* fat_shutdown_drive --
* Free all allocated resources and synchronize all necessary data
*
@@ -661,17 +726,8 @@ fat_shutdown_drive(fat_fs_info_t *fs_info)
int rc = RC_OK;
int i = 0;
- if (fs_info->vol.type & FAT_FAT32)
- {
- rc = fat_fat32_update_fsinfo_sector(fs_info, fs_info->vol.free_cls,
- fs_info->vol.next_cl);
- if ( rc != RC_OK )
- rc = -1;
- }
-
- fat_buf_release(fs_info);
-
- if (rtems_bdbuf_syncdev(fs_info->vol.dd) != RTEMS_SUCCESSFUL)
+ rc = fat_sync(fs_info);
+ if ( rc != RC_OK )
rc = -1;
for (i = 0; i < FAT_HASH_SIZE; i++)
@@ -849,46 +905,3 @@ fat_ino_is_unique(
return (ino >= fs_info->uino_base);
}
-
-/* fat_fat32_update_fsinfo_sector --
- * Synchronize fsinfo sector for FAT32 volumes
- *
- * PARAMETERS:
- * fs_info - FS info
- * free_count - count of free clusters
- * next_free - the next free cluster num
- *
- * RETURNS:
- * RC_OK on success, or -1 if error occured (errno set appropriately)
- */
-int
-fat_fat32_update_fsinfo_sector(
- fat_fs_info_t *fs_info,
- uint32_t free_count,
- uint32_t next_free
- )
-{
- ssize_t ret1 = 0, ret2 = 0;
- uint32_t le_free_count = 0;
- uint32_t le_next_free = 0;
-
- le_free_count = CT_LE_L(free_count);
- le_next_free = CT_LE_L(next_free);
-
- ret1 = _fat_block_write(fs_info,
- fs_info->vol.info_sec,
- FAT_FSINFO_FREE_CLUSTER_COUNT_OFFSET,
- 4,
- (char *)(&le_free_count));
-
- ret2 = _fat_block_write(fs_info,
- fs_info->vol.info_sec,
- FAT_FSINFO_NEXT_FREE_CLUSTER_OFFSET,
- 4,
- (char *)(&le_next_free));
-
- if ( (ret1 < 0) || (ret2 < 0) )
- return -1;
-
- return RC_OK;
-}
diff --git a/cpukit/libfs/src/dosfs/fat.h b/cpukit/libfs/src/dosfs/fat.h
index 3a9c9c6e46..260d8aafd9 100644
--- a/cpukit/libfs/src/dosfs/fat.h
+++ b/cpukit/libfs/src/dosfs/fat.h
@@ -313,7 +313,11 @@ typedef struct fat_vol_s
uint32_t rdir_cl; /* first cluster of the root directory */
uint16_t info_sec; /* FSInfo Sector Structure location */
uint32_t free_cls; /* last known free clusters count */
+ uint32_t free_cls_in_fs_info; /* last known free clusters count
+ in FS info sector */
uint32_t next_cl; /* next free cluster number */
+ uint32_t next_cl_in_fs_info; /* next free cluster number in FS
+ info sector */
uint8_t mirror; /* mirroring enabla/disable */
uint32_t afat_loc; /* active FAT location */
uint8_t afat; /* the number of active FAT */
@@ -500,11 +504,7 @@ fat_free_unique_ino(fat_fs_info_t *fs_info,
uint32_t ino);
int
-fat_fat32_update_fsinfo_sector(
- fat_fs_info_t *fs_info,
- uint32_t free_count,
- uint32_t next_free
- );
+fat_sync(fat_fs_info_t *fs_info);
#ifdef __cplusplus
}
diff --git a/cpukit/libfs/src/dosfs/msdos.h b/cpukit/libfs/src/dosfs/msdos.h
index f762656607..26bf906173 100644
--- a/cpukit/libfs/src/dosfs/msdos.h
+++ b/cpukit/libfs/src/dosfs/msdos.h
@@ -397,8 +397,6 @@ int msdos_get_dotdot_dir_info_cluster_num_and_offset(
char *dir_entry
);
-int msdos_sync_unprotected(msdos_fs_info_t *fs_info);
-
int msdos_sync(rtems_libio_t *iop);
#ifdef __cplusplus
diff --git a/cpukit/libfs/src/dosfs/msdos_file.c b/cpukit/libfs/src/dosfs/msdos_file.c
index 595bd3fabc..0406be0f58 100644
--- a/cpukit/libfs/src/dosfs/msdos_file.c
+++ b/cpukit/libfs/src/dosfs/msdos_file.c
@@ -290,7 +290,7 @@ msdos_file_sync(rtems_libio_t *iop)
return rc;
}
- rc = msdos_sync_unprotected(fs_info);
+ rc = fat_sync(&fs_info->fat);
rtems_semaphore_release(fs_info->vol_sema);
return RC_OK;
diff --git a/cpukit/libfs/src/dosfs/msdos_misc.c b/cpukit/libfs/src/dosfs/msdos_misc.c
index fade1e9030..f4de0d5915 100644
--- a/cpukit/libfs/src/dosfs/msdos_misc.c
+++ b/cpukit/libfs/src/dosfs/msdos_misc.c
@@ -1646,19 +1646,6 @@ int msdos_find_node_by_cluster_num_in_fat_file(
}
int
-msdos_sync_unprotected(msdos_fs_info_t *fs_info)
-{
- int rc = fat_buf_release(&fs_info->fat);
- rtems_status_code sc = rtems_bdbuf_syncdev(fs_info->fat.vol.dd);
- if (sc != RTEMS_SUCCESSFUL) {
- errno = EIO;
- rc = -1;
- }
-
- return rc;
-}
-
-int
msdos_sync(rtems_libio_t *iop)
{
int rc = RC_OK;
@@ -1670,7 +1657,7 @@ msdos_sync(rtems_libio_t *iop)
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
- rc = msdos_sync_unprotected(fs_info);
+ rc = fat_sync(&fs_info->fat);
rtems_semaphore_release(fs_info->vol_sema);
return rc;