Documentation. Changed integer types to match block device types.

Added const qualifier whenever possible.  Added
rtems_fsmount_create_mount_point() prototype.
This commit is contained in:
Thomas Doerfler
2009-05-05 12:57:16 +00:00
parent d8602eb655
commit d0c3b38bed
4 changed files with 264 additions and 77 deletions

View File

@@ -1,6 +1,7 @@
/** /**
* @file rtems/ramdisk.h * @file
* RAM disk block device implementation *
* RAM disk block device.
*/ */
/* /*
@@ -21,33 +22,70 @@
extern "C" { extern "C" {
#endif #endif
/* RAM disk configuration table entry */ /**
* @defgroup rtems_ramdisk RAM Disk Device
*
* @ingroup rtems_blkdev
*
* @{
*/
/**
* RAM disk configuration table entry.
*/
typedef struct rtems_ramdisk_config { typedef struct rtems_ramdisk_config {
int block_size; /* RAM disk block size */ /**
int block_num; /* Number of blocks on this RAM disk */ * RAM disk block size (must be a power of two).
void *location; /* RAM disk permanent location (out of RTEMS controlled */
memory), or NULL if RAM disk memory should be uint32_t block_size;
allocated dynamically */
/**
* Number of blocks on this RAM disk.
*/
rtems_blkdev_bnum block_num;
/**
* RAM disk location or @c NULL if RAM disk memory should be allocated
* dynamically.
*/
void *location;
} rtems_ramdisk_config; } rtems_ramdisk_config;
/* If application want to use RAM disk, it should specify configuration of /**
* available RAM disks. * External reference to the RAM disk configuration table describing each RAM
* The following is definitions for RAM disk configuration table * disk in the system.
*
* The configuration table is provided by the application.
*/
extern rtems_ramdisk_config rtems_ramdisk_configuration [];
/**
* External reference the size of the RAM disk configuration table
* @ref rtems_ramdisk_configuration.
*
* The configuration table size is provided by the application.
*/ */
extern rtems_ramdisk_config rtems_ramdisk_configuration[];
extern size_t rtems_ramdisk_configuration_size; extern size_t rtems_ramdisk_configuration_size;
/* ramdisk_initialize -- /**
* RAM disk driver initialization entry point. * RAM disk driver initialization entry point.
*/ */
rtems_device_driver rtems_device_driver ramdisk_initialize(
ramdisk_initialize( rtems_device_major_number major,
rtems_device_major_number major, rtems_device_minor_number minor,
rtems_device_minor_number minor, void *arg
void *arg); );
/**
* RAM disk driver table entry.
*/
#define RAMDISK_DRIVER_TABLE_ENTRY \ #define RAMDISK_DRIVER_TABLE_ENTRY \
{ ramdisk_initialize, RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES } { \
.initialization_entry = ramdisk_initialize, \
RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES \
}
/** @} */
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -1,5 +1,10 @@
/* ramdisk.c -- RAM disk block device implementation /**
* @file
* *
* RAM disk block device.
*/
/*
* Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia * Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia
* Author: Victor V. Vengerov <vvv@oktet.ru> * Author: Victor V. Vengerov <vvv@oktet.ru>
* *
@@ -18,9 +23,9 @@
#include <string.h> #include <string.h>
#include <inttypes.h> #include <inttypes.h>
#include "rtems/blkdev.h" #include <rtems/blkdev.h>
#include "rtems/diskdevs.h" #include <rtems/diskdevs.h>
#include "rtems/ramdisk.h" #include <rtems/ramdisk.h>
/** /**
* Control tracing. It can be compiled out of the code for small * Control tracing. It can be compiled out of the code for small
@@ -30,23 +35,22 @@
#define RTEMS_RAMDISK_TRACE 0 #define RTEMS_RAMDISK_TRACE 0
#endif #endif
#define RAMDISK_DEVICE_BASE_NAME "/dev/ramdisk" #define RAMDISK_DEVICE_BASE_NAME "/dev/rd"
/* Internal RAM disk descriptor */ /* Internal RAM disk descriptor */
struct ramdisk { struct ramdisk {
int block_size; /* RAM disk block size */ uint32_t block_size; /* RAM disk block size */
int block_num; /* Number of blocks on this RAM disk */ rtems_blkdev_bnum block_num; /* Number of blocks on this RAM disk */
void *area; /* RAM disk memory area */ void *area; /* RAM disk memory area */
bool initialized;/* RAM disk is initialized */ bool initialized; /* RAM disk is initialized */
bool malloced; /* != 0, if memory allocated by malloc for this bool malloced; /* != 0, if memory allocated by malloc for this RAM disk */
RAM disk */
#if RTEMS_RAMDISK_TRACE #if RTEMS_RAMDISK_TRACE
int info_level; /* Trace level */ int info_level; /* Trace level */
#endif #endif
}; };
static struct ramdisk *ramdisk; static struct ramdisk *ramdisk;
static uint32_t nramdisks; static uint32_t nramdisks;
#if RTEMS_RAMDISK_TRACE #if RTEMS_RAMDISK_TRACE
/** /**
@@ -242,8 +246,8 @@ ramdisk_initialize(
for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++) for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++)
{ {
dev_t dev = rtems_filesystem_make_dev_t(major, i); dev_t dev = rtems_filesystem_make_dev_t(major, i);
char name[sizeof(RAMDISK_DEVICE_BASE_NAME "0123456789")]; char name [] = RAMDISK_DEVICE_BASE_NAME "a";
snprintf(name, sizeof(name), RAMDISK_DEVICE_BASE_NAME "%" PRIu32, i); name [sizeof(RAMDISK_DEVICE_BASE_NAME)] += i;
r->block_size = c->block_size; r->block_size = c->block_size;
r->block_num = c->block_num; r->block_num = c->block_num;
if (c->location == NULL) if (c->location == NULL)

View File

@@ -1,3 +1,9 @@
/**
* @file
*
* File system mount functions.
*/
/*===============================================================*\ /*===============================================================*\
| Project: RTEMS fsmount | | Project: RTEMS fsmount |
+-----------------------------------------------------------------+ +-----------------------------------------------------------------+
@@ -38,7 +44,7 @@
/*=========================================================================*\ /*=========================================================================*\
| Function: | | Function: |
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
int rtems_fsmount_create_mountpoint int rtems_fsmount_create_mount_point
( (
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\
| Purpose: | | Purpose: |
@@ -113,9 +119,9 @@ int rtems_fsmount
+---------------------------------------------------------------------------+ +---------------------------------------------------------------------------+
| Input Parameters: | | Input Parameters: |
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
const fstab_t *fstab_ptr, const rtems_fstab_entry *fstab_ptr,
int fstab_count, size_t fstab_count,
int *fail_idx size_t *fail_idx
) )
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\
| Return Value: | | Return Value: |
@@ -124,7 +130,7 @@ int rtems_fsmount
{ {
int rc = 0; int rc = 0;
int tmp_rc; int tmp_rc;
int fstab_idx = 0; size_t fstab_idx = 0;
rtems_filesystem_mount_table_entry_t *tmp_mt_entry; rtems_filesystem_mount_table_entry_t *tmp_mt_entry;
bool terminate = false; bool terminate = false;
@@ -138,7 +144,7 @@ int rtems_fsmount
* create mount point * create mount point
*/ */
if (tmp_rc == 0) { if (tmp_rc == 0) {
tmp_rc = rtems_fsmount_create_mountpoint(fstab_ptr->mount_point); tmp_rc = rtems_fsmount_create_mount_point(fstab_ptr->mount_point);
if (tmp_rc != 0) { if (tmp_rc != 0) {
if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNTPNT_CRTERR)) { if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNTPNT_CRTERR)) {
fprintf(stdout,"fsmount: creation of mount point \"%s\" failed: %s\n", fprintf(stdout,"fsmount: creation of mount point \"%s\" failed: %s\n",
@@ -154,13 +160,13 @@ int rtems_fsmount
/* /*
* mount device to given mount point * mount device to given mount point
*/ */
if (tmp_rc == RTEMS_SUCCESSFUL) { if (tmp_rc == 0) {
tmp_rc = mount(&tmp_mt_entry, tmp_rc = mount(&tmp_mt_entry,
fstab_ptr->fs_ops, fstab_ptr->fs_ops,
fstab_ptr->mount_options, fstab_ptr->mount_options,
fstab_ptr->dev, fstab_ptr->dev,
fstab_ptr->mount_point); fstab_ptr->mount_point);
if (tmp_rc != RTEMS_SUCCESSFUL) { if (tmp_rc != 0) {
if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNT_FAILED)) { if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNT_FAILED)) {
fprintf(stdout,"fsmount: mounting of \"%s\" to" fprintf(stdout,"fsmount: mounting of \"%s\" to"
" \"%s\" failed: %s\n", " \"%s\" failed: %s\n",

View File

@@ -1,3 +1,9 @@
/**
* @file
*
* File system mount functions.
*/
/*===============================================================*\ /*===============================================================*\
| Project: RTEMS fsmount | | Project: RTEMS fsmount |
+-----------------------------------------------------------------+ +-----------------------------------------------------------------+
@@ -33,46 +39,179 @@
extern "C" { extern "C" {
#endif #endif
/* /**
* bits to define, what errors will cause reporting (via printf) and * @defgroup rtems_fstab File System Mount Support
* abort of mount processing *
* Use a combination of these bits * @{
* for the fields "report_reasons" and "abort_reasons"
*/ */
#define FSMOUNT_MNT_OK 0x0001 /* mounted ok */
#define FSMOUNT_MNTPNT_CRTERR 0x0002 /* cannot create mount point */
#define FSMOUNT_MNT_FAILED 0x0004 /* mounting failed */
/**
* File system mount report and abort condition flags.
*
* The flags define, which conditions will cause a report during the mount
* process (via printf()) or abort the mount process.
*
* @see rtems_fstab_entry and rtems_fsmount().
*/
typedef enum {
/**
* No conditions.
*/
RTEMS_FSTAB_NONE = 0U,
/**
* Complete mount process was successful.
*/
RTEMS_FSTAB_OK = 0x1U,
/**
* Mount point creation failed.
*/
RTEMS_FSTAB_ERROR_MOUNT_POINT = 0x2U,
/**
* File system mount failed.
*/
RTEMS_FSTAB_ERROR_MOUNT = 0x4U,
/**
* Something failed.
*/
RTEMS_FSTAB_ERROR = RTEMS_FSTAB_ERROR_MOUNT_POINT | RTEMS_FSTAB_ERROR_MOUNT,
/**
* Any condition.
*/
RTEMS_FSTAB_ANY = RTEMS_FSTAB_OK | RTEMS_FSTAB_ERROR
} rtems_fstab_conditions;
/**
* File system table entry.
*/
typedef struct { typedef struct {
char *dev; /**
char *mount_point; * Device file path.
rtems_filesystem_operations_table *fs_ops; */
const char *dev;
/**
* Mount point path.
*/
const char *mount_point;
/**
* File system operations.
*/
const rtems_filesystem_operations_table *fs_ops;
/**
* File system mount options.
*/
rtems_filesystem_options_t mount_options; rtems_filesystem_options_t mount_options;
uint16_t report_reasons;
uint16_t abort_reasons;
} fstab_t;
/**
* Report @ref rtems_fstab_conditions "condition flags".
*/
uint16_t report_reasons;
/*=========================================================================*\ /**
| Function: | * Abort @ref rtems_fstab_conditions "condition flags".
\*-------------------------------------------------------------------------*/ */
int rtems_fsmount uint16_t abort_reasons;
( } rtems_fstab_entry;
/*-------------------------------------------------------------------------*\
| Purpose: | /**
| This function will create the mount points listed and mount the file | * Creates the mount point with path @a mount_point.
| systems listed in the calling parameters | *
+---------------------------------------------------------------------------+ * On success, zero is returned. On error, -1 is returned, and @c errno is set
| Input Parameters: | * appropriately.
\*-------------------------------------------------------------------------*/ *
const fstab_t *fstab_ptr, /* Ptr to filesystem mount table */ * @see rtems_fsmount().
int fstab_count, /* number of entries in mount table*/ */
int *fail_idx /* return: index of failed entry */ int rtems_fsmount_create_mount_point( const char *mount_point);
);
/*-------------------------------------------------------------------------*\ /**
| Return Value: | * Mounts the file systems listed in the file system mount table @a fstab of
| 0, if success, -1 and errno if failed | * size @a size.
\*=========================================================================*/ *
* Each file system will be mounted according to its table entry parameters.
* In case of an abort condition the corresponding table index will be reported
* in @a abort_index. The pointer @a abort_index may be @c NULL. The mount
* point paths will be created with rtems_fsmount_create_mount_point() and need
* not exist beforehand.
*
* On success, zero is returned. On error, -1 is returned, and @c errno is set
* appropriately.
*
* @see rtems_bdpart_register_from_disk().
*
* The following example code tries to mount a FAT file system within a SD
* Card. Some cards do not have a partition table so at first it tries to find
* a file system inside the hole disk. If this is successful the mount process
* will be aborted because the @ref RTEMS_FSTAB_OK condition is true. If this
* did not work it tries to mount the file system inside the first partition.
* If this fails the mount process will not be aborted (this is already the
* last entry), but the last error status will be returned.
*
* @code
* #include <stdio.h>
* #include <string.h>
* #include <errno.h>
*
* #include <rtems.h>
* #include <rtems/bdpart.h>
* #include <rtems/dosfs.h>
* #include <rtems/error.h>
* #include <rtems/fsmount.h>
*
* static const rtems_fstab_entry fstab [] = {
* {
* .dev = "/dev/sd-card-a",
* .mount_point = "/mnt",
* .fs_ops = &msdos_ops,
* .mount_options = RTEMS_FILESYSTEM_READ_WRITE,
* .report_reasons = RTEMS_FSTAB_ANY,
* .abort_reasons = RTEMS_FSTAB_OK
* }, {
* .dev = "/dev/sd-card-a1",
* .mount_point = "/mnt",
* .fs_ops = &msdos_ops,
* .mount_options = RTEMS_FILESYSTEM_READ_WRITE,
* .report_reasons = RTEMS_FSTAB_ANY,
* .abort_reasons = RTEMS_FSTAB_NONE
* }
* };
*
* static void my_mount(void)
* {
* rtems_status_code sc = RTEMS_SUCCESSFUL;
* int rv = 0;
* size_t abort_index = 0;
*
* sc = rtems_bdpart_register_from_disk("/dev/sd-card-a");
* if (sc != RTEMS_SUCCESSFUL) {
* printf("read partition table failed: %s\n", rtems_status_text(sc));
* }
*
* rv = rtems_fsmount(fstab, sizeof(fstab) / sizeof(fstab [0]), &abort_index);
* if (rv != 0) {
* printf("mount failed: %s\n", strerror(errno));
* }
* printf("mount aborted at %zu\n", abort_index);
* }
* @endcode
*/
int rtems_fsmount( const rtems_fstab_entry *fstab, size_t size, size_t *abort_index);
/** @} */
typedef rtems_fstab_entry fstab_t;
#define FSMOUNT_MNT_OK RTEMS_FSTAB_OK
#define FSMOUNT_MNTPNT_CRTERR RTEMS_FSTAB_ERROR_MOUNT_POINT
#define FSMOUNT_MNT_FAILED RTEMS_FSTAB_ERROR_MOUNT
#ifdef __cplusplus #ifdef __cplusplus
} }