mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-11-09 08:37:58 +08:00
libblock: Add sparse disk
This commit is contained in:
1 parent
c18e0ba127
commit
7fab7fc0cf
11 files changed
+1008
No files matched your search
@@ -124,6 +124,7 @@ include_rtems_HEADERS += libblock/include/rtems/flashdisk.h
|
||||
include_rtems_HEADERS += libblock/include/rtems/ramdisk.h
|
||||
include_rtems_HEADERS += libblock/include/rtems/nvdisk.h
|
||||
include_rtems_HEADERS += libblock/include/rtems/nvdisk-sram.h
|
||||
include_rtems_HEADERS += libblock/include/rtems/sparse-disk.h
|
||||
include_rtems_HEADERS += libblock/include/rtems/ide_part_table.h
|
||||
include_rtems_HEADERS += libblock/include/rtems/bdpart.h
|
||||
include_rtems_HEADERS += libblock/include/rtems/media.h
|
||||
|
||||
@@ -31,6 +31,7 @@ libblock_a_SOURCES = src/bdbuf.c \
|
||||
src/media-server.c \
|
||||
src/media-desc.c \
|
||||
src/media-dev-ident.c \
|
||||
src/sparse-disk.c \
|
||||
include/rtems/bdbuf.h include/rtems/blkdev.h \
|
||||
include/rtems/diskdevs.h include/rtems/flashdisk.h \
|
||||
include/rtems/ramdisk.h include/rtems/nvdisk.h include/rtems/nvdisk-sram.h \
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @ingroup rtems_sparse_disk
|
||||
*
|
||||
* @brief Sparse disk block device API.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2012 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Obere Lagerstr. 30
|
||||
* 82178 Puchheim
|
||||
* Germany
|
||||
* <rtems@embedded-brains.de>
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef SPARSE_DISK_H
|
||||
#define SPARSE_DISK_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <rtems.h>
|
||||
#include <rtems/diskdevs.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/**
|
||||
* @defgroup rtems_sparse_disk Sparse Disk Device
|
||||
*
|
||||
* @ingroup rtems_blkdev
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
rtems_blkdev_bnum block;
|
||||
void *data;
|
||||
} rtems_sparse_disk_key;
|
||||
|
||||
typedef struct rtems_sparse_disk rtems_sparse_disk;
|
||||
|
||||
typedef void (*rtems_sparse_disk_delete_handler)(rtems_sparse_disk *sparse_disk);
|
||||
|
||||
struct rtems_sparse_disk {
|
||||
rtems_id mutex;
|
||||
rtems_blkdev_bnum blocks_with_buffer;
|
||||
size_t used_count;
|
||||
uint32_t media_block_size;
|
||||
rtems_sparse_disk_delete_handler delete_handler;
|
||||
uint8_t fill_pattern;
|
||||
rtems_sparse_disk_key *key_table;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Creates and registers a sparse disk.
|
||||
*
|
||||
* @param[in] device_file_name The device file name path.
|
||||
* @param[in] media_block_size The media block size in bytes.
|
||||
* @param[in] blocks_with_buffer Blocks of the device with a buffer. Other
|
||||
* blocks can store only fill pattern value bytes.
|
||||
* @param[in] block_count The media block count of the device. It is the sum
|
||||
* of blocks with buffer and blocks that contain only fill pattern value bytes.
|
||||
* @param[in] fill_pattern The fill pattern specifies the byte value of blocks
|
||||
* without a buffer. It is also the initial value for blocks with a buffer.
|
||||
*
|
||||
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||
* @retval RTEMS_INVALID_NUMBER Media block size or media block count is not
|
||||
* positive. The blocks with buffer count is greater than the media block count.
|
||||
* @retval RTEMS_NO_MEMORY Not enough memory.
|
||||
* @retval RTEMS_TOO_MANY Cannot create semaphore.
|
||||
* @retval RTEMS_UNSATISFIED Cannot create generic device node.
|
||||
*
|
||||
* @see rtems_sparse_disk_register().
|
||||
*/
|
||||
rtems_status_code rtems_sparse_disk_create_and_register(
|
||||
const char *device_file_name,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum blocks_with_buffer,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
uint8_t fill_pattern
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Frees a sparse disk.
|
||||
*
|
||||
* Calls free() on the sparse disk pointer.
|
||||
*/
|
||||
void rtems_sparse_disk_free( rtems_sparse_disk *sparse_disk );
|
||||
|
||||
/**
|
||||
* @brief Initializes and registers a sparse disk.
|
||||
*
|
||||
* This will create one semaphore for mutual exclusion.
|
||||
*
|
||||
* @param[in] device_file_name The device file name path.
|
||||
* @param[in, out] sparse_disk The sparse disk.
|
||||
* @param[in] media_block_size The media block size in bytes.
|
||||
* @param[in] blocks_with_buffer Blocks of the device with a buffer. Other
|
||||
* blocks can store only fill pattern value bytes.
|
||||
* @param[in] block_count The media block count of the device. It is the sum
|
||||
* of blocks with buffer and blocks that contain only fill pattern value bytes.
|
||||
* @param[in] fill_pattern The fill pattern specifies the byte value of blocks
|
||||
* without a buffer. It is also the initial value for blocks with a buffer.
|
||||
* @param[in] sparse_disk_delete The sparse disk delete handler.
|
||||
*
|
||||
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||
* @retval RTEMS_INVALID_NUMBER Media block size or media block count is not
|
||||
* positive. The blocks with buffer count is greater than the media block count.
|
||||
* @retval RTEMS_INVALID_ADDRESS Invalid sparse disk address.
|
||||
* @retval RTEMS_TOO_MANY Cannot create semaphore.
|
||||
* @retval RTEMS_UNSATISFIED Cannot create generic device node.
|
||||
*/
|
||||
rtems_status_code rtems_sparse_disk_register(
|
||||
const char *device_file_name,
|
||||
rtems_sparse_disk *sparse_disk,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum blocks_with_buffer,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
uint8_t fill_pattern,
|
||||
rtems_sparse_disk_delete_handler sparse_disk_delete
|
||||
);
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* SPARSE_DISK_H */
|
||||
File diff suppressed because it is too large.
Load diff
@@ -272,6 +272,10 @@ $(PROJECT_INCLUDE)/rtems/nvdisk-sram.h: libblock/include/rtems/nvdisk-sram.h $(P
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/nvdisk-sram.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/nvdisk-sram.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/sparse-disk.h: libblock/include/rtems/sparse-disk.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/sparse-disk.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/sparse-disk.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/ide_part_table.h: libblock/include/rtems/ide_part_table.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/ide_part_table.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/ide_part_table.h
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
ACLOCAL_AMFLAGS = -I ../aclocal
|
||||
|
||||
SUBDIRS = POSIX
|
||||
SUBDIRS += sparsedisk01
|
||||
SUBDIRS += block16
|
||||
SUBDIRS += block15
|
||||
SUBDIRS += block14
|
||||
|
||||
@@ -43,6 +43,7 @@ AM_CONDITIONAL(HAS_POSIX,test x"${rtems_cv_RTEMS_POSIX_API}" = x"yes")
|
||||
|
||||
# Explicitly list all Makefiles here
|
||||
AC_CONFIG_FILES([Makefile
|
||||
sparsedisk01/Makefile
|
||||
block16/Makefile
|
||||
mghttpd01/Makefile
|
||||
block15/Makefile
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
rtems_tests_PROGRAMS = sparsedisk01
|
||||
sparsedisk01_SOURCES = init.c
|
||||
|
||||
dist_rtems_tests_DATA = sparsedisk01.scn sparsedisk01.doc
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
|
||||
include $(top_srcdir)/../automake/compile.am
|
||||
include $(top_srcdir)/../automake/leaf.am
|
||||
|
||||
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
|
||||
|
||||
LINK_OBJS = $(sparsedisk01_OBJECTS)
|
||||
LINK_LIBS = $(sparsedisk01_LDLIBS)
|
||||
|
||||
sparsedisk01$(EXEEXT): $(sparsedisk01_OBJECTS) $(sparsedisk01_DEPENDENCIES)
|
||||
@rm -f sparsedisk01$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,12 @@
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: sparsedisk01
|
||||
|
||||
directives:
|
||||
|
||||
- rtems_sparse_disk_create()
|
||||
- rtems_sparse_disk_register()
|
||||
|
||||
concepts:
|
||||
|
||||
- Ensures that the sparse disk works.
|
||||
@@ -0,0 +1,2 @@
|
||||
*** TEST SPARSEDISK 1 ***
|
||||
*** END OF TEST SPARSEDISK 1 ***
|
||||
Reference in new issue
Block a user