summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2015-04-12 14:24:05 -0600
committerGregory Nutt <gnutt@nuttx.org>2015-04-12 14:24:05 -0600
commit2678f4cf2c559c4068091b26df140ce33f1157c3 (patch)
tree91cc7f664c429c0327fdf2c543b162c3636bb0e1
parentb1d0a50fc390f7cb6f7b53eafbbef85377d0901d (diff)
downloadpx4-nuttx-2678f4cf2c559c4068091b26df140ce33f1157c3.tar.gz
px4-nuttx-2678f4cf2c559c4068091b26df140ce33f1157c3.tar.bz2
px4-nuttx-2678f4cf2c559c4068091b26df140ce33f1157c3.zip
FAT: Fix misthink when CONFIG_ENDIAN_BIG=y. From Lwazi Dube
-rw-r--r--nuttx/fs/fat/fs_fat32util.c143
1 files changed, 82 insertions, 61 deletions
diff --git a/nuttx/fs/fat/fs_fat32util.c b/nuttx/fs/fat/fs_fat32util.c
index 61972d87b..a0f6b0ebf 100644
--- a/nuttx/fs/fat/fs_fat32util.c
+++ b/nuttx/fs/fat/fs_fat32util.c
@@ -1,7 +1,7 @@
/****************************************************************************
* fs/fat/fs_fat32util.c
*
- * Copyright (C) 2007-2009, 2011, 2013 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007-2009, 2011, 2013, 2015 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* References:
@@ -90,7 +90,8 @@
/****************************************************************************
* Name: fat_checkfsinfo
*
- * Desciption: Read the FAT32 FSINFO sector
+ * Description:
+ * Read the FAT32 FSINFO sector
*
****************************************************************************/
@@ -118,7 +119,8 @@ static int fat_checkfsinfo(struct fat_mountpt_s *fs)
/****************************************************************************
* Name: fat_checkbootrecord
*
- * Desciption: Read a sector and verify that it is a a FAT boot record.
+ * Description:
+ * Read a sector and verify that it is a a FAT boot record.
*
****************************************************************************/
@@ -263,8 +265,8 @@ static int fat_checkbootrecord(struct fat_mountpt_s *fs)
return -EINVAL;
}
- /* We have what appears to be a valid FAT filesystem! Save a few more things
- * from the boot record that we will need later.
+ /* We have what appears to be a valid FAT filesystem! Save a few more
+ * things from the boot record that we will need later.
*/
fs->fs_fatbase += fs->fs_fatresvdseccount;
@@ -294,15 +296,9 @@ static int fat_checkbootrecord(struct fat_mountpt_s *fs)
uint16_t fat_getuint16(uint8_t *ptr)
{
-#ifdef CONFIG_ENDIAN_BIG
- /* The bytes always have to be swapped if the target is big-endian */
-
- return ((uint16_t)ptr[0] << 8) | ptr[1];
-#else
/* Byte-by-byte transfer is still necessary if the address is un-aligned */
return ((uint16_t)ptr[1] << 8) | ptr[0];
-#endif
}
/****************************************************************************
@@ -311,15 +307,9 @@ uint16_t fat_getuint16(uint8_t *ptr)
uint32_t fat_getuint32(uint8_t *ptr)
{
-#ifdef CONFIG_ENDIAN_BIG
- /* The bytes always have to be swapped if the target is big-endian */
-
- return ((uint32_t)fat_getuint16(&ptr[0]) << 16) | fat_getuint16(&ptr[2]);
-#else
/* Byte-by-byte transfer is still necessary if the address is un-aligned */
return ((uint32_t)fat_getuint16(&ptr[2]) << 16) | fat_getuint16(&ptr[0]);
-#endif
}
/****************************************************************************
@@ -329,11 +319,13 @@ uint32_t fat_getuint32(uint8_t *ptr)
void fat_putuint16(uint8_t *ptr, uint16_t value16)
{
uint8_t *val = (uint8_t*)&value16;
+
#ifdef CONFIG_ENDIAN_BIG
/* The bytes always have to be swapped if the target is big-endian */
ptr[0] = val[1];
ptr[1] = val[0];
+
#else
/* Byte-by-byte transfer is still necessary if the address is un-aligned */
@@ -355,6 +347,7 @@ void fat_putuint32(uint8_t *ptr, uint32_t value32)
fat_putuint16(&ptr[0], val[1]);
fat_putuint16(&ptr[2], val[0]);
+
#else
/* Byte-by-byte transfer is still necessary if the address is un-aligned */
@@ -393,8 +386,9 @@ void fat_semgive(struct fat_mountpt_s *fs)
/****************************************************************************
* Name: fat_systime2fattime
*
- * Desciption: Get the system time convert to a time and and date suitble
- * for writing into the FAT FS.
+ * Description:
+ * Get the system time convert to a time and and date suitable for
+ * writing into the FAT FS.
*
* TIME in LS 16-bits:
* Bits 0:4 = 2 second count (0-29 representing 0-58 seconds)
@@ -449,13 +443,15 @@ uint32_t fat_systime2fattime(void)
}
}
#endif
+
return 0;
}
/****************************************************************************
* Name: fat_fattime2systime
*
- * Desciption: Convert FAT data and time to a system time_t
+ * Description:
+ * Convert FAT data and time to a system time_t
*
* 16-bit FAT time:
* Bits 0:4 = 2 second count (0-29 representing 0-58 seconds)
@@ -500,9 +496,10 @@ time_t fat_fattime2systime(uint16_t fattime, uint16_t fatdate)
/****************************************************************************
* Name: fat_mount
*
- * Desciption: This function is called only when the mountpoint is first
- * established. It initializes the mountpoint structure and verifies
- * that a valid FAT32 filesystem is provided by the block driver.
+ * Description:
+ * This function is called only when the mountpoint is first established.
+ * It initializes the mountpoint structure and verifies that a valid FAT32
+ * filesystem is provided by the block driver.
*
* The caller should hold the mountpoint semaphore
*
@@ -684,7 +681,8 @@ int fat_mount(struct fat_mountpt_s *fs, bool writeable)
/****************************************************************************
* Name: fat_checkmount
*
- * Desciption: Check if the mountpoint is still valid.
+ * Description:
+ * Check if the mountpoint is still valid.
*
* The caller should hold the mountpoint semaphore
*
@@ -727,7 +725,8 @@ int fat_checkmount(struct fat_mountpt_s *fs)
/****************************************************************************
* Name: fat_hwread
*
- * Desciption: Read the specified sector into the sector buffer
+ * Description:
+ * Read the specified sector into the sector buffer
*
****************************************************************************/
@@ -752,13 +751,15 @@ int fat_hwread(struct fat_mountpt_s *fs, uint8_t *buffer, off_t sector,
}
}
}
+
return ret;
}
/****************************************************************************
* Name: fat_hwwrite
*
- * Desciption: Write the sector buffer to the specified sector
+ * Description:
+ * Write the sector buffer to the specified sector
*
****************************************************************************/
@@ -784,13 +785,15 @@ int fat_hwwrite(struct fat_mountpt_s *fs, uint8_t *buffer, off_t sector,
}
}
}
+
return ret;
}
/****************************************************************************
* Name: fat_cluster2sector
*
- * Desciption: Convert a cluster number to a start sector number
+ * Description:
+ * Convert a cluster number to a start sector number
*
****************************************************************************/
@@ -807,7 +810,8 @@ off_t fat_cluster2sector(struct fat_mountpt_s *fs, uint32_t cluster )
/****************************************************************************
* Name: fat_getcluster
*
- * Desciption: Get the next cluster start from the FAT.
+ * Description:
+ * Get the next cluster start from the FAT.
*
* Return: <0: error, 0:cluster unassigned, >=0: start sector of cluster
*
@@ -941,18 +945,20 @@ off_t fat_getcluster(struct fat_mountpt_s *fs, uint32_t clusterno)
/****************************************************************************
* Name: fat_putcluster
*
- * Desciption: Write a new cluster into the FAT
+ * Description:
+ * Write a new cluster into the FAT
*
****************************************************************************/
-int fat_putcluster(struct fat_mountpt_s *fs, uint32_t clusterno, off_t nextcluster)
+int fat_putcluster(struct fat_mountpt_s *fs, uint32_t clusterno,
+ off_t nextcluster)
{
/* Verify that the cluster number is within range. Zero erases the cluster. */
if (clusterno == 0 || (clusterno >= 2 && clusterno < fs->fs_nclusters))
{
/* Okay.. Write the next cluster into the FAT. The way we will do
- * this depends on the type of FAT filesystm we are dealing with.
+ * this depends on the type of FAT filesystem we are dealing with.
*/
switch (fs->fs_type)
@@ -1085,7 +1091,7 @@ int fat_putcluster(struct fat_mountpt_s *fs, uint32_t clusterno, off_t nextclust
break;
default:
- return -EINVAL;
+ return -EINVAL;
}
/* Mark the modified sector as "dirty" and return success */
@@ -1100,7 +1106,8 @@ int fat_putcluster(struct fat_mountpt_s *fs, uint32_t clusterno, off_t nextclust
/****************************************************************************
* Name: fat_removechain
*
- * Desciption: Remove an entire chain of clusters, starting with 'cluster'
+ * Description:
+ * Remove an entire chain of clusters, starting with 'cluster'
*
****************************************************************************/
@@ -1149,10 +1156,12 @@ int fat_removechain(struct fat_mountpt_s *fs, uint32_t cluster)
/****************************************************************************
* Name: fat_extendchain
*
- * Desciption: Add a new cluster to the chain following cluster (if cluster
- * is non-NULL). if cluster is zero, then a new chain is created.
+ * Description:
+ * Add a new cluster to the chain following cluster (if cluster is non-
+ * NULL). if cluster is zero, then a new chain is created.
*
- * Return: <0:error, 0: no free cluster, >=2: new cluster number
+ * Return:
+ * <0:error, 0: no free cluster, >=2: new cluster number
*
****************************************************************************/
@@ -1175,6 +1184,7 @@ int32_t fat_extendchain(struct fat_mountpt_s *fs, uint32_t cluster)
if (startcluster == 0 || startcluster >= fs->fs_nclusters)
{
/* But it is bad.. we have to start at the beginning */
+
startcluster = 1;
}
}
@@ -1309,9 +1319,10 @@ int32_t fat_extendchain(struct fat_mountpt_s *fs, uint32_t cluster)
/****************************************************************************
* Name: fat_nextdirentry
*
- * Desciption: Read the next directory entry from the sector in cache,
- * reading the next sector(s) in the cluster as necessary. This function
- * must return -ENOSPC if it fails because there are no further entries
+ * Description:
+ * Read the next directory entry from the sector in cache, reading the
+ * next sector(s) in the cluster as necessary. This function must
+ * return -ENOSPC if it fails because there are no further entries
* available in the directory.
*
****************************************************************************/
@@ -1348,8 +1359,8 @@ int fat_nextdirentry(struct fat_mountpt_s *fs, struct fs_fatdir_s *dir)
if (ndx >= fs->fs_rootentcnt)
{
- /* When we index past this count, we have examined all of the entries in
- * the root directory.
+ /* When we index past this count, we have examined all of the
+ * entries in the root directory.
*/
return -ENOSPC;
@@ -1403,11 +1414,13 @@ int fat_nextdirentry(struct fat_mountpt_s *fs, struct fs_fatdir_s *dir)
/****************************************************************************
* Name: fat_dirtruncate
*
- * Desciption: Truncate an existing file to zero length
+ * Description:
+ * Truncate an existing file to zero length
*
- * Assumptions: The caller holds mountpoint semaphore, fs_buffer holds
- * the directory entry, the directory entry sector (fd_sector) is
- * currently in the sector cache.
+ * Assumptions:
+ * The caller holds mountpoint semaphore, fs_buffer holds the directory
+ * entry, the directory entry sector (fd_sector) is currently in the
+ * sector cache.
*
****************************************************************************/
@@ -1452,11 +1465,11 @@ int fat_dirtruncate(struct fat_mountpt_s *fs, struct fat_dirinfo_s *dirinfo)
savesector = fs->fs_currentsector;
ret = fat_removechain(fs, startcluster);
if (ret < 0)
- {
- return ret;
- }
+ {
+ return ret;
+ }
- /* Setup FSINFO to resuse this cluster next */
+ /* Setup FSINFO to reuse this cluster next */
fs->fs_fsinextfree = startcluster - 1;
@@ -1468,7 +1481,8 @@ int fat_dirtruncate(struct fat_mountpt_s *fs, struct fat_dirinfo_s *dirinfo)
/****************************************************************************
* Name: fat_fscacheflush
*
- * Desciption: Flush any dirty sector if fs_buffer as necessary
+ * Description:
+ * Flush any dirty sector if fs_buffer as necessary
*
****************************************************************************/
@@ -1513,14 +1527,16 @@ int fat_fscacheflush(struct fat_mountpt_s *fs)
fs->fs_dirty = false;
}
+
return OK;
}
/****************************************************************************
* Name: fat_fscacheread
*
- * Desciption: Read the specified sector into the sector cache, flushing any
- * existing dirty sectors as necessary.
+ * Description:
+ * Read the specified sector into the sector cache, flushing any existing
+ * dirty sectors as necessary.
*
****************************************************************************/
@@ -1558,13 +1574,14 @@ int fat_fscacheread(struct fat_mountpt_s *fs, off_t sector)
fs->fs_currentsector = sector;
}
- return OK;
+ return OK;
}
/****************************************************************************
* Name: fat_ffcacheflush
*
- * Desciption: Flush any dirty sectors as necessary
+ * Description:
+ * Flush any dirty sectors as necessary
*
****************************************************************************/
@@ -1598,8 +1615,9 @@ int fat_ffcacheflush(struct fat_mountpt_s *fs, struct fat_file_s *ff)
/****************************************************************************
* Name: fat_ffcacheread
*
- * Desciption: Read the specified sector into the sector cache, flushing any
- * existing dirty sectors as necessary.
+ * Description:
+ * Read the specified sector into the sector cache, flushing any existing
+ * dirty sectors as necessary.
*
****************************************************************************/
@@ -1644,7 +1662,8 @@ int fat_ffcacheread(struct fat_mountpt_s *fs, struct fat_file_s *ff, off_t secto
/****************************************************************************
* Name: fat_ffcacheread
*
- * Desciption: Invalidate the current file buffer contents
+ * Description:
+ * Invalidate the current file buffer contents
*
****************************************************************************/
@@ -1676,8 +1695,9 @@ int fat_ffcacheinvalidate(struct fat_mountpt_s *fs, struct fat_file_s *ff)
/****************************************************************************
* Name: fat_updatefsinfo
*
- * Desciption: Flush evertyhing buffered for the mountpoint and update
- * the FSINFO sector, if appropriate
+ * Description:
+ * Flush everything buffered for the mountpoint and update the FSINFO
+ * sector, if appropriate
*
****************************************************************************/
@@ -1725,7 +1745,8 @@ int fat_updatefsinfo(struct fat_mountpt_s *fs)
/****************************************************************************
* Name: fat_nfreeclusters
*
- * Desciption: Get the number of free clusters
+ * Description:
+ * Get the number of free clusters
*
****************************************************************************/
@@ -1830,7 +1851,7 @@ int fat_nfreeclusters(struct fat_mountpt_s *fs, off_t *pfreeclusters)
/****************************************************************************
* Name: fat_nfreeclusters
*
- * Desciption:
+ * Description:
* Given the file position, set the correct current sector to access.
*
****************************************************************************/