RTEMS 6.3
Loading...
Searching...
No Matches
In-Memory File System Support

In-Memory File System Support. More...

Topics

 IMFS Device IO Handler

Files

file  cpukit/libfs/src/imfs/deviceio.c
 IMFS Device Node Handlers.
file  cpukit/libfs/src/imfs/imfs_add_node.c
 IMFS Add a Node.
file  cpukit/libfs/src/imfs/imfs_chown.c
 IMFS Change Owner.
file  cpukit/libfs/src/imfs/imfs_config.c
 IMFS Limits and Options.
file  cpukit/libfs/src/imfs/imfs_creat.c
 Create an IMFS Node.
file  cpukit/libfs/src/imfs/imfs_dir.c
file  cpukit/libfs/src/imfs/imfs_dir_default.c
file  cpukit/libfs/src/imfs/imfs_dir_minimal.c
file  cpukit/libfs/src/imfs/imfs_eval.c
 Evaluation IMFS Node Support.
file  cpukit/libfs/src/imfs/imfs_fchmod.c
 Change IMFS File Mode.
file  cpukit/libfs/src/imfs/imfs_fifo.c
 FIFO Support.
file  cpukit/libfs/src/imfs/imfs_fsunmount.c
 Unmount this Instance of IMFS.
file  cpukit/libfs/src/imfs/imfs_handlers_device.c
 Device Operations Table.
file  cpukit/libfs/src/imfs/imfs_initsupp.c
 IMFS Node Support.
file  cpukit/libfs/src/imfs/imfs_linfile.c
file  cpukit/libfs/src/imfs/imfs_load_tar.c
 RTEMS Load Tarfs.
file  cpukit/libfs/src/imfs/imfs_make_generic_node.c
 IMFS Make a Generic Node.
file  cpukit/libfs/src/imfs/imfs_memfile.c
 IMFS Memory File Handlers.
file  cpukit/libfs/src/imfs/imfs_mknod.c
 Create a IMFS Node.
file  cpukit/libfs/src/imfs/imfs_mount.c
 Mount an IMFS.
file  cpukit/libfs/src/imfs/imfs_node.c
 IMFS Node Support.
file  cpukit/libfs/src/imfs/imfs_node_destroy_default.c
 IMFS Default Node Destruction.
file  cpukit/libfs/src/imfs/imfs_rename.c
 IMFS Rename.
file  cpukit/libfs/src/imfs/imfs_rmnod.c
 IMFS Node Removal Handler.
file  cpukit/libfs/src/imfs/imfs_stat.c
 IMFS Stat.
file  cpukit/libfs/src/imfs/imfs_stat_file.c
file  cpukit/libfs/src/imfs/imfs_unmount.c
 Unmount an IMFS.
file  cpukit/libfs/src/imfs/imfs_utimens.c
 Set IMFS File Access and Modification Times.

Data Structures

struct  IMFS_jnode_tt
struct  IMFS_directory_t
struct  IMFS_device_t
struct  IMFS_filebase_t
struct  IMFS_memfile_t
struct  IMFS_linearfile_t
union  IMFS_file_t
struct  IMFS_fifo_t
struct  IMFS_generic_t
struct  IMFS_linearfile_context
struct  IMFS_mknod_controls
struct  IMFS_fs_info_t
struct  IMFS_mount_data

Macros

#define IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK   128
#define IMFS_MEMFILE_BYTES_PER_BLOCK   imfs_memfile_bytes_per_block
#define IMFS_MEMFILE_BLOCK_SLOTS   (IMFS_MEMFILE_BYTES_PER_BLOCK / sizeof(void *))
#define FIRST_INDIRECT   (0)
#define LAST_INDIRECT   (IMFS_MEMFILE_BLOCK_SLOTS - 1)
#define FIRST_DOUBLY_INDIRECT   (LAST_INDIRECT + 1)
#define LAST_DOUBLY_INDIRECT
#define FIRST_TRIPLY_INDIRECT   (LAST_DOUBLY_INDIRECT + 1)
#define LAST_TRIPLY_INDIRECT
#define IMFS_MEMFILE_MAXIMUM_SIZE   (LAST_TRIPLY_INDIRECT * IMFS_MEMFILE_BYTES_PER_BLOCK)
#define IMFS_NAME_MAX   _POSIX_NAME_MAX
#define IMFS_NODE_CONTROL_INITIALIZER(handlers, init, destroy)
 Initializer for an IMFS node control.
#define IMFS_NODE_INITIALIZER(node_control, name, namelen, mode)
 Initializer for an IMFS node.
#define IMFS_assert(_x)
#define IMFS_STAT_FMT_HARD_LINK   0

Typedefs

typedef struct IMFS_jnode_tt IMFS_jnode_t
typedef uint8_t * block_p
typedef block_p * block_ptr

Functions

int IMFS_initialize (rtems_filesystem_mount_table_entry_t *mt_entry, const void *data)
int IMFS_initialize_support (rtems_filesystem_mount_table_entry_t *mt_entry, const void *data)
void IMFS_fsunmount (rtems_filesystem_mount_table_entry_t *mt_entry)
 Unmount this instance of IMFS.
int rtems_tarfs_load (const char *mountpoint, const void *tar_image, size_t tar_size)
 RTEMS load tarfs.
void IMFS_node_destroy (IMFS_jnode_t *node)
 Destroy an IMFS node.
int IMFS_node_clone (rtems_filesystem_location_info_t *loc)
 Clone an IMFS node.
void IMFS_node_free (const rtems_filesystem_location_info_t *loc)
 Free an IMFS node.
int IMFS_stat (const rtems_filesystem_location_info_t *loc, struct stat *buf)
 Perform a status processing for the IMFS.
int IMFS_stat_file (const rtems_filesystem_location_info_t *loc, struct stat *buf)
void IMFS_eval_path (rtems_filesystem_eval_path_context_t *ctx)
 IMFS evaluation node support.
void IMFS_eval_path_devfs (rtems_filesystem_eval_path_context_t *ctx)
 IMFS device filesystem evaluation node support.
int IMFS_link (const rtems_filesystem_location_info_t *parentloc, const rtems_filesystem_location_info_t *targetloc, const char *name, size_t namelen)
 Create a new IMFS link node.
int IMFS_chown (const rtems_filesystem_location_info_t *loc, uid_t owner, gid_t group)
 Change the owner of IMFS.
int IMFS_mknod (const rtems_filesystem_location_info_t *parentloc, const char *name, size_t namelen, mode_t mode, dev_t dev)
 Create an IMFS node.
IMFS_jnode_t * IMFS_initialize_node (IMFS_jnode_t *node, const IMFS_node_control *node_control, const char *name, size_t namelen, mode_t mode, void *arg)
IMFS_jnode_t * IMFS_create_node (const rtems_filesystem_location_info_t *parentloc, const IMFS_node_control *node_control, size_t node_size, const char *name, size_t namelen, mode_t mode, void *arg)
 Create an IMFS node.
int IMFS_add_node (const char *path, IMFS_jnode_t *node, void *arg)
 Adds an IMFS node.
int IMFS_make_node (const char *path, mode_t mode, const IMFS_node_control *node_control, size_t node_size, void *context)
int IMFS_make_linearfile (const char *path, mode_t mode, const void *data, size_t size)
 Makes a linear IMFS file.
int IMFS_mount (rtems_filesystem_mount_table_entry_t *mt_entry)
 Mount an IMFS.
int IMFS_unmount (rtems_filesystem_mount_table_entry_t *mt_entry)
 Unmount an IMFS.
int IMFS_utimens (const rtems_filesystem_location_info_t *loc, struct timespec times[2])
 Set IMFS file access and modification times.
int IMFS_fchmod (const rtems_filesystem_location_info_t *loc, mode_t mode)
 Change the IMFS file mode.
int IMFS_symlink (const rtems_filesystem_location_info_t *parentloc, const char *name, size_t namelen, const char *target)
 Create a new IMFS symbolic link node.
ssize_t IMFS_readlink (const rtems_filesystem_location_info_t *loc, char *buf, size_t bufsize)
 Put IMFS symbolic link into buffer.
int IMFS_rename (const rtems_filesystem_location_info_t *oldparentloc, const rtems_filesystem_location_info_t *oldloc, const rtems_filesystem_location_info_t *newparentloc, const char *name, size_t namelen)
 Rename the IMFS.
int IMFS_rmnod (const rtems_filesystem_location_info_t *parentloc, const rtems_filesystem_location_info_t *loc)
 IMFS node removal handler.

Variables

const int imfs_memfile_bytes_per_block
const IMFS_mknod_control IMFS_mknod_control_dir_default
const IMFS_mknod_control IMFS_mknod_control_dir_minimal
const IMFS_mknod_control IMFS_mknod_control_device
const IMFS_mknod_control IMFS_mknod_control_memfile
const IMFS_node_control IMFS_node_control_linfile
const IMFS_mknod_control IMFS_mknod_control_fifo
const IMFS_mknod_control IMFS_mknod_control_enosys
const rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS

IMFS Memory File Handlers

This section contains the set of handlers used to process operations on IMFS memory file nodes. The memory files are created in memory using malloc'ed memory. Thus any data stored in one of these files is lost at system shutdown unless special arrangements to copy the data to some type of non-volailte storage are made by the application.

ssize_t IMFS_memfile_write (IMFS_memfile_t *memfile, off_t start, const unsigned char *source, unsigned int length)

IMFS Device Node Handlers

This section contains the set of handlers used to map operations on IMFS device nodes onto calls to the RTEMS Classic API IO Manager.

int device_open (rtems_libio_t *iop, const char *pathname, int oflag, mode_t mode)
int device_close (rtems_libio_t *iop)
ssize_t device_read (rtems_libio_t *iop, void *buffer, size_t count)
ssize_t device_write (rtems_libio_t *iop, const void *buffer, size_t count)
int device_ioctl (rtems_libio_t *iop, ioctl_command_t command, void *buffer)
int device_ftruncate (rtems_libio_t *iop, off_t length)

Detailed Description

In-Memory File System Support.

Macro Definition Documentation

◆ IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK

#define IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK   128

IMFS "memfile" information

The data structure for the in-memory "memfiles" is based on classic UNIX.

block_ptr is a pointer to a block of IMFS_MEMFILE_BYTES_PER_BLOCK in length which could be data or a table of pointers to blocks.

Setting IMFS_MEMFILE_BYTES_PER_BLOCK to different values has a significant impact on the maximum file size supported as well as the amount of memory wasted due to internal file fragmentation. The following is a list of maximum file sizes based on various settings

max_filesize with blocks of 16 is 1,328
max_filesize with blocks of 32 is 18,656
max_filesize with blocks of 64 is 279,488
max_filesize with blocks of 128 is 4,329,344
max_filesize with blocks of 256 is 68,173,568
max_filesize with blocks of 512 is 1,082,195,456

◆ IMFS_NODE_CONTROL_INITIALIZER

#define IMFS_NODE_CONTROL_INITIALIZER ( handlers,
init,
destroy )
Value:
{ \
( handlers ), \
( init ), \
( destroy ) \
}
IMFS_jnode_t * IMFS_node_remove_default(IMFS_jnode_t *node)
Returns the node and does nothing else.
Definition imfs_node.c:118

Initializer for an IMFS node control.

Parameters
handlersThe file system node handlers.
initThe node initialization method.
destroyThe node destruction method.

◆ IMFS_NODE_INITIALIZER

#define IMFS_NODE_INITIALIZER ( node_control,
name,
namelen,
mode )
Value:
{ \
{ NULL, NULL }, \
NULL, \
( name ), \
( namelen ), \
( mode ), \
0, \
0, \
0, \
0, \
0, \
0, \
0, \
( node_control ) \
}

Initializer for an IMFS node.

Initialize the node control with IMFS_NODE_CONTROL_INITIALIZER().

Parameters
node_controlThe node control of the IMFS node.
nameThe name of the IMFS node.
namelenThe length of the name of the IMFS node.
modeThe mode of the IMFS node.
See also
IMFS_node_preinitialize().

◆ LAST_DOUBLY_INDIRECT

#define LAST_DOUBLY_INDIRECT
Value:
(LAST_INDIRECT + \
(IMFS_MEMFILE_BLOCK_SLOTS * IMFS_MEMFILE_BLOCK_SLOTS))

◆ LAST_TRIPLY_INDIRECT

#define LAST_TRIPLY_INDIRECT
Value:
(LAST_DOUBLY_INDIRECT +\
(IMFS_MEMFILE_BLOCK_SLOTS * \
IMFS_MEMFILE_BLOCK_SLOTS * IMFS_MEMFILE_BLOCK_SLOTS))

Function Documentation

◆ IMFS_add_node()

int IMFS_add_node ( const char * path,
IMFS_jnode_t * node,
void * arg )

Adds an IMFS node.

Initialize the node with IMFS_NODE_INITIALIZER(), IMFS_node_preinitialize(), IMFS_GENERIC_NODE_INITIALIZER(), or IMFS_generic_node_preinitialize().

Parameters
pathThe path of parent directories for the IMFS node to add.
nodeThe IMFS node to add.
argThe argument passed to the node initialization method.
Return values
0Successful operation.
-1An error occurred. The errno indicates the error.

◆ IMFS_chown()

int IMFS_chown ( const rtems_filesystem_location_info_t * loc,
uid_t owner,
gid_t group )
extern

Change the owner of IMFS.

This routine is the implementation of the chown() system call for the IMFS.

◆ IMFS_create_node()

IMFS_jnode_t * IMFS_create_node ( const rtems_filesystem_location_info_t * parentloc,
const IMFS_node_control * node_control,
size_t node_size,
const char * name,
size_t namelen,
mode_t mode,
void * arg )
extern

Create an IMFS node.

Create an IMFS filesystem node of an arbitrary type that is NOT the root directory node.

◆ IMFS_link()

int IMFS_link ( const rtems_filesystem_location_info_t * parentloc,
const rtems_filesystem_location_info_t * targetloc,
const char * name,
size_t namelen )
extern

Create a new IMFS link node.

The following rouine creates a new link node under parent with the name given in name. The link node is set to point to the node at to_loc.

◆ IMFS_make_linearfile()

int IMFS_make_linearfile ( const char * path,
mode_t mode,
const void * data,
size_t size )
extern

Makes a linear IMFS file.

Parameters
pathThe path to the new linear IMFS file.
modeThe file mode permissions. S_IFREG is set by the function.
dataThe begin of linear file data area.
sizeThe size of the linear file data area in bytes.
Return values
0Successful operation.
-1An error occurred. The errno indicates the error.

◆ IMFS_mknod()

int IMFS_mknod ( const rtems_filesystem_location_info_t * parentloc,
const char * name,
size_t namelen,
mode_t mode,
dev_t dev )
extern

Create an IMFS node.

Routine to create a node in the IMFS file system.

◆ IMFS_readlink()

ssize_t IMFS_readlink ( const rtems_filesystem_location_info_t * loc,
char * buf,
size_t bufsize )
extern

Put IMFS symbolic link into buffer.

The following rouine puts the symbolic links destination name into buff.

◆ IMFS_rename()

int IMFS_rename ( const rtems_filesystem_location_info_t * oldparentloc,
const rtems_filesystem_location_info_t * oldloc,
const rtems_filesystem_location_info_t * newparentloc,
const char * name,
size_t namelen )
extern

Rename the IMFS.

The following rouine creates a new link node under parent with the name given in name and removes the old.

◆ IMFS_rmnod()

int IMFS_rmnod ( const rtems_filesystem_location_info_t * parentloc,
const rtems_filesystem_location_info_t * loc )
extern

IMFS node removal handler.

This file contains the handler used to remove a node when a file type does not require special actions.

◆ IMFS_stat()

int IMFS_stat ( const rtems_filesystem_location_info_t * loc,
struct stat * buf )
extern

Perform a status processing for the IMFS.

This routine provides a stat for the IMFS file system.

◆ IMFS_symlink()

int IMFS_symlink ( const rtems_filesystem_location_info_t * parentloc,
const char * name,
size_t namelen,
const char * target )
extern

Create a new IMFS symbolic link node.

The following rouine creates a new symbolic link node under parent with the name given in name. The node is set to point to the node at to_loc.

◆ IMFS_utimens()

int IMFS_utimens ( const rtems_filesystem_location_info_t * loc,
struct timespec times[2] )
extern

Set IMFS file access and modification times.

This routine is the implementation of the utime() system call for the IMFS.

◆ rtems_tarfs_load()

int rtems_tarfs_load ( const char * mountpoint,
const void * tar_image,
size_t tar_size )
extern

RTEMS load tarfs.

This file implements the "mount" procedure for tar-based IMFS extensions. The TAR is not actually mounted under the IMFS. Directories from the TAR file are created as usual in the IMFS. File entries are created as IMFS_LINEAR_FILE nodes with their nods pointing to addresses in the TAR image.

Here we create the mountpoint directory and load the tarfs at that node. Once the IMFS has been mounted, we work through the tar image and perform as follows:

  • For directories, simply call mkdir(). The IMFS creates nodes as needed.
  • For files, we make our own calls to IMFS eval_for_make and create_node.

TAR file format:

Offset Length Contents
0 100 bytes File name ('\0' terminated, 99 maxmum length)
100 8 bytes File mode (in octal ascii)
108 8 bytes User ID (in octal ascii)
116 8 bytes Group ID (in octal ascii)
124 12 bytes File size (s) (in octal ascii)
136 12 bytes Modify time (in octal ascii)
148 8 bytes Header checksum (in octal ascii)
156 1 bytes Link flag
157 100 bytes Linkname ('\0' terminated, 99 maxmum length)
257 8 bytes Magic PAX ("ustar\0" + 2 bytes padding)
257 8 bytes Magic GNU tar ("ustar \0")
265 32 bytes User name ('\0' terminated, 31 maxmum length)
297 32 bytes Group name ('\0' terminated, 31 maxmum length)
329 8 bytes Major device ID (in octal ascii)
337 8 bytes Minor device ID (in octal ascii)
345 167 bytes Padding
512 (s+p) bytes File contents (s+p) := (((s) + 511) & ~511),
round up to 512 bytes
unsigned p
Definition tte.h:17

Checksum:

int i, sum;
char *header = tar_header_pointer;
sum = 0;
for (i = 0; i < 512; i++)
sum += 0xFF & header[i];