diff options
author | Chris Johns <chrisj@rtems.org> | 2009-10-08 07:07:36 +0000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2009-10-08 07:07:36 +0000 |
commit | eb649786c8528f349a39b35ae2965e3f874e2088 (patch) | |
tree | 194f40f18f42b9f12ee58df2bee39b0e7d7a4cc3 /cpukit/libfs/src/dosfs/fat.c | |
parent | Regenerate (diff) | |
download | rtems-eb649786c8528f349a39b35ae2965e3f874e2088.tar.bz2 |
2009-10-08 Chris Johns <chrisj@rtems.org>
* Makefile.am, preinstall.am: Added statvfs.h.
* libcsupport/Makefile.am: Add statvfs.c.
* libcsupport/include/sys/statvfs.h, libcsupport/src/statvfs.c:
New.
* libcsupport/include/rtems/libio.h: Add a file system handler for
the statvfs call.
* libfs/src/devfs/devfs_init.c, libfs/src/dosfs/msdos_init.c,
libfs/src/imfs/imfs_init.c, libfs/src/nfsclient/src/nfs.c: Set the
statvfs handler to NULL.
* include/rtems/fs.h: Add a second node access field for the RFS
file system to hold a directory offset while the existing field
holds the inode number. This save a rescan of the directory when
working with directories.
* libblock/include/rtems/bdbuf.h: Added references and user fields
to the buffer descriptor.
* libblock/src/bdbuf.c: Added dynamic buffer support for different
block sizes. Fixed a number of bugs.
* libblock/src/blkdev.c: Release the disk device on an error.
* libblock/src/diskdevs.c: Set the block size to the media block
size during initialisation of the disk device.
* libblock/src/flashdisk.c, libblock/src/nvdisk.c,
libblock/src/ramdisk.c: Updated the drivers to handle variable
block sizes.
* libfs/src/dosfs/fat.c, libfs/src/dosfs/fat.h: Release any
buffers when an error occurs. The FAT buffer layer hangs onto a
single buffer while mounted. This should be fixed.
* sapi/inline/rtems/chain.inl: Added rtems_chain_set_off_chain,
rtems_chain_is_node_off_chain, and rtems_chain_previous.
* score/inline/rtems/score/chain.inl: Added _Chain_Set_off_chain,
and _Chain_Is_node_off_chain.
* libmisc/shell/main_ln.c, libmisc/shell/main_mknod.c,
libmisc/shell/mknod-pack_dev.c, libmisc/shell/mknod-pack_dev.h:
New shell commands.
* libmisc/Makefile.am, libmisc/shell/shellconfig.h: Added ln and
mknod commands.
* libmisc/shell/hexdump-display.c: Fixed the reopen bug which
showed up as a free with a bad pointer.
* libmisc/shell/main_mount.c: List the user adding file system
when listing the available file systems to mount.
* libmisc/shell/utils-cp.c: Remove the fixed static copy buffer
and use a large dynamic buffer.
* score/inline/rtems/score/address.inl, score/src/coremsgsubmit.c,
score/src/objectallocate.c, score/src/objectfree.c: Remove
warnings.
Diffstat (limited to 'cpukit/libfs/src/dosfs/fat.c')
-rw-r--r-- | cpukit/libfs/src/dosfs/fat.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/cpukit/libfs/src/dosfs/fat.c b/cpukit/libfs/src/dosfs/fat.c index 26682dc6dd..0c30053a72 100644 --- a/cpukit/libfs/src/dosfs/fat.c +++ b/cpukit/libfs/src/dosfs/fat.c @@ -264,6 +264,24 @@ _fat_block_write( return cmpltd; } +/* _fat_block_release -- + * This function works around the hack that hold a bdbuf and does + * not release it. + * + * PARAMETERS: + * mt_entry - mount table entry + * + * RETURNS: + * 0 on success, or -1 if error occured and errno set appropriately + */ +int +_fat_block_release( + rtems_filesystem_mount_table_entry_t *mt_entry) +{ + fat_fs_info_t *fs_info = mt_entry->fs_info; + return fat_buf_release(fs_info); +} + /* fat_cluster_read -- * wrapper for reading a whole cluster at once * @@ -504,6 +522,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry) if (FAT_GET_FSINFO_LEAD_SIGNATURE(fs_info_sector) != FAT_FSINFO_LEAD_SIGNATURE_VALUE) { + _fat_block_release(mt_entry); rtems_disk_release(vol->dd); rtems_set_errno_and_return_minus_one( EINVAL ); } @@ -513,6 +532,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry) FAT_USEFUL_INFO_SIZE, fs_info_sector); if ( ret < 0 ) { + _fat_block_release(mt_entry); rtems_disk_release(vol->dd); return -1; } @@ -523,6 +543,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry) 0xFFFFFFFF); if ( rc != RC_OK ) { + _fat_block_release(mt_entry); rtems_disk_release(vol->dd); return rc; } @@ -537,6 +558,9 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry) vol->free_cls = 0xFFFFFFFF; vol->next_cl = 0xFFFFFFFF; } + + _fat_block_release(mt_entry); + vol->afat_loc = vol->fat_loc + vol->fat_length * vol->afat; /* set up collection of fat-files fd */ |