From eb649786c8528f349a39b35ae2965e3f874e2088 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Thu, 8 Oct 2009 07:07:36 +0000 Subject: 2009-10-08 Chris Johns * 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. --- cpukit/libblock/src/ramdisk.c | 52 +++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 31 deletions(-) (limited to 'cpukit/libblock/src/ramdisk.c') diff --git a/cpukit/libblock/src/ramdisk.c b/cpukit/libblock/src/ramdisk.c index faa5fef57b..98180923a7 100644 --- a/cpukit/libblock/src/ramdisk.c +++ b/cpukit/libblock/src/ramdisk.c @@ -41,7 +41,7 @@ /* Internal RAM disk descriptor */ struct ramdisk { - uint32_t block_size; /* RAM disk block size */ + uint32_t block_size; /* RAM disk block size, the media size */ rtems_blkdev_bnum block_num; /* Number of blocks on this RAM disk */ void *area; /* RAM disk memory area */ bool initialized; /* RAM disk is initialized */ @@ -94,28 +94,23 @@ rtems_ramdisk_printf (struct ramdisk *rd, const char *format, ...) static int ramdisk_read(struct ramdisk *rd, rtems_blkdev_request *req) { - char *from; + uint8_t *from = rd->area; uint32_t i; rtems_blkdev_sg_buffer *sg; - uint32_t remains; #if RTEMS_RAMDISK_TRACE - rtems_ramdisk_printf (rd, "ramdisk read: start=%d, blocks=%d remains=%d", - req->bufs[0].block, req->bufnum, - rd->block_size * req->count); + rtems_ramdisk_printf (rd, "ramdisk read: start=%d, blocks=%d", + req->bufs[0].block, req->bufnum); #endif - remains = rd->block_size * req->bufnum; - sg = req->bufs; - for (i = 0; (remains > 0) && (i < req->bufnum); i++, sg++) + for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++) { - uint32_t count = sg->length; - from = ((char *)rd->area + (sg->block * rd->block_size)); - if (count > remains) - count = remains; - memcpy(sg->buffer, from, count); - remains -= count; - from += count; +#if RTEMS_RAMDISK_TRACE + rtems_ramdisk_printf (rd, "ramdisk read: buf=%d block=%d length=%d off=%d addr=%p", + i, sg->block, sg->length, sg->block * rd->block_size, + from + (sg->block * rd->block_size)); +#endif + memcpy(sg->buffer, from + (sg->block * rd->block_size), sg->length); } req->req_done(req->done_arg, RTEMS_SUCCESSFUL, 0); return 0; @@ -135,27 +130,22 @@ ramdisk_read(struct ramdisk *rd, rtems_blkdev_request *req) static int ramdisk_write(struct ramdisk *rd, rtems_blkdev_request *req) { - char *to; + uint8_t *to = rd->area; uint32_t i; rtems_blkdev_sg_buffer *sg; - uint32_t remains; #if RTEMS_RAMDISK_TRACE - rtems_ramdisk_printf (rd, "ramdisk write: start=%d, blocks=%d remains=%d", - req->bufs[0].block, req->bufnum, - rd->block_size * req->bufnum); + rtems_ramdisk_printf (rd, "ramdisk write: start=%d, blocks=%d", + req->bufs[0].block, req->bufnum); #endif - remains = rd->block_size * req->bufnum; - sg = req->bufs; - for (i = 0; (remains > 0) && (i < req->bufnum); i++, sg++) + for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++) { - uint32_t count = sg->length; - to = ((char *)rd->area + (sg->block * rd->block_size)); - if (count > remains) - count = remains; - memcpy(to, sg->buffer, count); - remains -= count; - to += count; +#if RTEMS_RAMDISK_TRACE + rtems_ramdisk_printf (rd, "ramdisk write: buf=%d block=%d length=%d off=%d addr=%p", + i, sg->block, sg->length, sg->block * rd->block_size, + to + (sg->block * rd->block_size)); +#endif + memcpy(to + (sg->block * rd->block_size), sg->buffer, sg->length); } req->req_done(req->done_arg, RTEMS_SUCCESSFUL, 0); return 0; -- cgit v1.2.3