forked from Imagelibrary/rtems
Added initial cut at miniIMFS which leaves out memfile and directory
readdir support. The next step is to add a mount table and configure either the miniIMFS or the full IMFS at the application level.
This commit is contained in:
@@ -306,7 +306,7 @@ typedef struct {
|
|||||||
* Structure for a mount table entry.
|
* Structure for a mount table entry.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct rtems_filesystem_mount_table_entry_tt{
|
struct rtems_filesystem_mount_table_entry_tt {
|
||||||
Chain_Node Node;
|
Chain_Node Node;
|
||||||
rtems_filesystem_location_info_t mt_point_node;
|
rtems_filesystem_location_info_t mt_point_node;
|
||||||
rtems_filesystem_location_info_t mt_fs_root;
|
rtems_filesystem_location_info_t mt_fs_root;
|
||||||
|
|||||||
@@ -52,6 +52,13 @@ void rtems_filesystem_initialize( void )
|
|||||||
|
|
||||||
init_fs_mount_table();
|
init_fs_mount_table();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mount the first filesystem.
|
||||||
|
*
|
||||||
|
* NOTE: XXX This really needs to be read from a table of filesystems
|
||||||
|
* to mount initially and the miniIMFS needs to be shaken out.
|
||||||
|
*/
|
||||||
|
|
||||||
status = mount(
|
status = mount(
|
||||||
&first_entry,
|
&first_entry,
|
||||||
&IMFS_ops,
|
&IMFS_ops,
|
||||||
|
|||||||
@@ -183,7 +183,9 @@ struct IMFS_jnode_tt {
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ino_t ino_count;
|
ino_t ino_count;
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers;
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers;
|
||||||
} IMFS_fs_info_t;
|
} IMFS_fs_info_t;
|
||||||
|
|
||||||
#define increment_and_check_linkcounts( _fs_info ) \
|
#define increment_and_check_linkcounts( _fs_info ) \
|
||||||
@@ -214,6 +216,7 @@ extern rtems_filesystem_file_handlers_r IMFS_device_handlers;
|
|||||||
extern rtems_filesystem_file_handlers_r IMFS_memfile_handlers;
|
extern rtems_filesystem_file_handlers_r IMFS_memfile_handlers;
|
||||||
extern rtems_filesystem_file_handlers_r IMFS_directory_handlers;
|
extern rtems_filesystem_file_handlers_r IMFS_directory_handlers;
|
||||||
extern rtems_filesystem_operations_table IMFS_ops;
|
extern rtems_filesystem_operations_table IMFS_ops;
|
||||||
|
extern rtems_filesystem_operations_table miniIMFS_ops;
|
||||||
extern rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS;
|
extern rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -224,6 +227,17 @@ int IMFS_initialize(
|
|||||||
rtems_filesystem_mount_table_entry_t *mt_entry
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
);
|
);
|
||||||
|
|
||||||
|
int miniIMFS_initialize(
|
||||||
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
|
);
|
||||||
|
|
||||||
|
int IMFS_initialize_support(
|
||||||
|
rtems_filesystem_mount_table_entry_t *mt_entry,
|
||||||
|
rtems_filesystem_operations_table *op_table,
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers,
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers
|
||||||
|
);
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
int IMFS_fsunmount(
|
||||||
rtems_filesystem_mount_table_entry_t *mt_entry
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -32,11 +32,13 @@ int IMFS_Set_handlers(
|
|||||||
rtems_filesystem_location_info_t *loc
|
rtems_filesystem_location_info_t *loc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_jnode_t *node = loc->node_access;
|
IMFS_jnode_t *node = loc->node_access;
|
||||||
|
IMFS_fs_info_t *fs_info;
|
||||||
|
|
||||||
|
fs_info = loc->mt_entry->fs_info;
|
||||||
switch( node->type ) {
|
switch( node->type ) {
|
||||||
case IMFS_DIRECTORY:
|
case IMFS_DIRECTORY:
|
||||||
loc->handlers = &IMFS_directory_handlers;
|
loc->handlers = fs_info->directory_handlers;
|
||||||
break;
|
break;
|
||||||
case IMFS_DEVICE:
|
case IMFS_DEVICE:
|
||||||
loc->handlers = &IMFS_device_handlers;
|
loc->handlers = &IMFS_device_handlers;
|
||||||
@@ -46,7 +48,7 @@ int IMFS_Set_handlers(
|
|||||||
loc->handlers = &rtems_filesystem_null_handlers;
|
loc->handlers = &rtems_filesystem_null_handlers;
|
||||||
break;
|
break;
|
||||||
case IMFS_MEMORY_FILE:
|
case IMFS_MEMORY_FILE:
|
||||||
loc->handlers = &IMFS_memfile_handlers;
|
loc->handlers = fs_info->memfile_handlers;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,65 +35,3 @@ int IMFS_freenodinfo(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IMFS_freenod
|
|
||||||
*
|
|
||||||
* The following routine frees a node if possible.
|
|
||||||
*
|
|
||||||
* The routine returns 0 if the node was not freed and 1 if it was.
|
|
||||||
*
|
|
||||||
* NOTE: This routine is for INTERNAL IMFS use only.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int IMFS_freenod(
|
|
||||||
rtems_filesystem_location_info_t *pathloc
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *the_jnode;
|
|
||||||
|
|
||||||
the_jnode = pathloc->node_access;
|
|
||||||
|
|
||||||
if ( the_jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove a node that still has children
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( ! Chain_Is_empty( &the_jnode->info.directory.Entries ) )
|
|
||||||
return ENOTEMPTY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove the file system root node.
|
|
||||||
*/
|
|
||||||
if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access )
|
|
||||||
return EBUSY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove a mountpoint.
|
|
||||||
*/
|
|
||||||
if ( the_jnode->info.directory.mt_fs != NULL )
|
|
||||||
return EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !rtems_libio_is_file_open( the_jnode ) &&
|
|
||||||
(the_jnode->st_nlink < 1) ) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Is the rtems_filesystem_current is this node?
|
|
||||||
*/
|
|
||||||
if ( rtems_filesystem_current.node_access == pathloc->node_access ) {
|
|
||||||
rtems_filesystem_current.node_access = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Free memory associated with a memory file.
|
|
||||||
*/
|
|
||||||
if ( the_jnode->type == IMFS_MEMORY_FILE )
|
|
||||||
IMFS_memfile_remove( the_jnode );
|
|
||||||
|
|
||||||
free( the_jnode );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|||||||
90
c/src/exec/libfs/src/imfs/imfs_fsunmount.c
Normal file
90
c/src/exec/libfs/src/imfs/imfs_fsunmount.c
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* IMFS Initialization
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1998.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* Copyright assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.OARcorp.com/rtems/license.html.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h> /* for mkdir */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "imfs.h"
|
||||||
|
#include "libio_.h"
|
||||||
|
|
||||||
|
#if defined(IMFS_DEBUG)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IMFS_fsunmount
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define jnode_get_control( jnode ) \
|
||||||
|
(&jnode->info.directory.Entries)
|
||||||
|
|
||||||
|
#define jnode_has_no_children( jnode ) \
|
||||||
|
Chain_Is_empty( jnode_get_control( jnode ) )
|
||||||
|
|
||||||
|
#define jnode_has_children( jnode ) \
|
||||||
|
( ! jnode_has_no_children( jnode ) )
|
||||||
|
|
||||||
|
#define jnode_get_first_child( jnode ) \
|
||||||
|
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
||||||
|
|
||||||
|
|
||||||
|
int IMFS_fsunmount(
|
||||||
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IMFS_jnode_t *jnode;
|
||||||
|
IMFS_jnode_t *next;
|
||||||
|
rtems_filesystem_location_info_t loc;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
||||||
|
* associated memory space
|
||||||
|
*/
|
||||||
|
|
||||||
|
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
||||||
|
|
||||||
|
do {
|
||||||
|
next = jnode->Parent;
|
||||||
|
loc.node_access = (void *)jnode;
|
||||||
|
|
||||||
|
if ( jnode->type != IMFS_DIRECTORY ) {
|
||||||
|
result = IMFS_unlink( &loc );
|
||||||
|
if (result != 0)
|
||||||
|
return -1;
|
||||||
|
jnode = next;
|
||||||
|
} else if ( jnode_has_no_children( jnode ) ) {
|
||||||
|
result = IMFS_unlink( &loc );
|
||||||
|
if (result != 0)
|
||||||
|
return -1;
|
||||||
|
jnode = next;
|
||||||
|
}
|
||||||
|
if ( jnode != NULL ) {
|
||||||
|
if ( jnode->type == IMFS_DIRECTORY ) {
|
||||||
|
if ( jnode_has_children( jnode ) )
|
||||||
|
jnode = jnode_get_first_child( jnode );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (jnode != NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMFS file system operations table
|
* IMFS file system operations table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ rtems_filesystem_operations_table IMFS_ops = {
|
|||||||
IMFS_initialize,
|
IMFS_initialize,
|
||||||
IMFS_unmount,
|
IMFS_unmount,
|
||||||
IMFS_fsunmount,
|
IMFS_fsunmount,
|
||||||
IMFS_utime,
|
IMFS_utime,
|
||||||
IMFS_evaluate_link,
|
IMFS_evaluate_link,
|
||||||
IMFS_symlink,
|
IMFS_symlink,
|
||||||
IMFS_readlink
|
IMFS_readlink
|
||||||
@@ -58,101 +58,11 @@ int IMFS_initialize(
|
|||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_fs_info_t *fs_info;
|
IMFS_initialize_support(
|
||||||
IMFS_jnode_t *jnode;
|
temp_mt_entry,
|
||||||
|
&IMFS_ops,
|
||||||
/*
|
&IMFS_memfile_handlers,
|
||||||
* Create the root node
|
&IMFS_directory_handlers
|
||||||
*/
|
);
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.node_access = IMFS_create_node(
|
|
||||||
NULL,
|
|
||||||
IMFS_DIRECTORY,
|
|
||||||
"",
|
|
||||||
( S_IRWXO | S_IRWXG| S_IRWXU ),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.handlers = &IMFS_directory_handlers;
|
|
||||||
temp_mt_entry->mt_fs_root.ops = &IMFS_ops;
|
|
||||||
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create custom file system data.
|
|
||||||
*/
|
|
||||||
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
|
|
||||||
if ( !fs_info ){
|
|
||||||
free(temp_mt_entry->mt_fs_root.node_access);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
temp_mt_entry->fs_info = fs_info;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set st_ino for the root to 1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
fs_info->ino_count = 1;
|
|
||||||
|
|
||||||
jnode = temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
jnode->st_ino = fs_info->ino_count;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define jnode_get_control( jnode ) \
|
|
||||||
(&jnode->info.directory.Entries)
|
|
||||||
|
|
||||||
#define jnode_has_no_children( jnode ) \
|
|
||||||
Chain_Is_empty( jnode_get_control( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_has_children( jnode ) \
|
|
||||||
( ! jnode_has_no_children( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_get_first_child( jnode ) \
|
|
||||||
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
|
||||||
|
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *jnode;
|
|
||||||
IMFS_jnode_t *next;
|
|
||||||
rtems_filesystem_location_info_t loc;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
|
||||||
* associated memory space
|
|
||||||
*/
|
|
||||||
|
|
||||||
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
|
|
||||||
do {
|
|
||||||
next = jnode->Parent;
|
|
||||||
loc.node_access = (void *)jnode;
|
|
||||||
|
|
||||||
if ( jnode->type != IMFS_DIRECTORY ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
} else if ( jnode_has_no_children( jnode ) ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
}
|
|
||||||
if ( jnode != NULL ) {
|
|
||||||
if ( jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
if ( jnode_has_children( jnode ) )
|
|
||||||
jnode = jnode_get_first_child( jnode );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (jnode != NULL);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,36 +26,15 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* IMFS file system operations table
|
|
||||||
*/
|
|
||||||
|
|
||||||
rtems_filesystem_operations_table IMFS_ops = {
|
|
||||||
IMFS_eval_path,
|
|
||||||
IMFS_evaluate_for_make,
|
|
||||||
IMFS_link,
|
|
||||||
IMFS_unlink,
|
|
||||||
IMFS_node_type,
|
|
||||||
IMFS_mknod,
|
|
||||||
IMFS_rmnod,
|
|
||||||
IMFS_chown,
|
|
||||||
IMFS_freenodinfo,
|
|
||||||
IMFS_mount,
|
|
||||||
IMFS_initialize,
|
|
||||||
IMFS_unmount,
|
|
||||||
IMFS_fsunmount,
|
|
||||||
IMFS_utime,
|
|
||||||
IMFS_evaluate_link,
|
|
||||||
IMFS_symlink,
|
|
||||||
IMFS_readlink
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMFS_initialize
|
* IMFS_initialize
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int IMFS_initialize(
|
int IMFS_initialize_support(
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry,
|
||||||
|
rtems_filesystem_operations_table *op_table,
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers,
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_fs_info_t *fs_info;
|
IMFS_fs_info_t *fs_info;
|
||||||
@@ -73,8 +52,8 @@ int IMFS_initialize(
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.handlers = &IMFS_directory_handlers;
|
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
|
||||||
temp_mt_entry->mt_fs_root.ops = &IMFS_ops;
|
temp_mt_entry->mt_fs_root.ops = op_table;
|
||||||
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -91,68 +70,12 @@ int IMFS_initialize(
|
|||||||
* Set st_ino for the root to 1.
|
* Set st_ino for the root to 1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fs_info->ino_count = 1;
|
fs_info->ino_count = 1;
|
||||||
|
fs_info->memfile_handlers = memfile_handlers;
|
||||||
|
fs_info->memfile_handlers = directory_handlers;
|
||||||
|
|
||||||
jnode = temp_mt_entry->mt_fs_root.node_access;
|
jnode = temp_mt_entry->mt_fs_root.node_access;
|
||||||
jnode->st_ino = fs_info->ino_count;
|
jnode->st_ino = fs_info->ino_count;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define jnode_get_control( jnode ) \
|
|
||||||
(&jnode->info.directory.Entries)
|
|
||||||
|
|
||||||
#define jnode_has_no_children( jnode ) \
|
|
||||||
Chain_Is_empty( jnode_get_control( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_has_children( jnode ) \
|
|
||||||
( ! jnode_has_no_children( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_get_first_child( jnode ) \
|
|
||||||
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
|
||||||
|
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *jnode;
|
|
||||||
IMFS_jnode_t *next;
|
|
||||||
rtems_filesystem_location_info_t loc;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
|
||||||
* associated memory space
|
|
||||||
*/
|
|
||||||
|
|
||||||
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
|
|
||||||
do {
|
|
||||||
next = jnode->Parent;
|
|
||||||
loc.node_access = (void *)jnode;
|
|
||||||
|
|
||||||
if ( jnode->type != IMFS_DIRECTORY ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
} else if ( jnode_has_no_children( jnode ) ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
}
|
|
||||||
if ( jnode != NULL ) {
|
|
||||||
if ( jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
if ( jnode_has_children( jnode ) )
|
|
||||||
jnode = jnode_get_first_child( jnode );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (jnode != NULL);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,26 @@
|
|||||||
|
|
||||||
#define MEMFILE_STATIC
|
#define MEMFILE_STATIC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set of operations handlers for operations on memfile entities.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
|
||||||
|
memfile_open,
|
||||||
|
memfile_close,
|
||||||
|
memfile_read,
|
||||||
|
memfile_write,
|
||||||
|
memfile_ioctl,
|
||||||
|
memfile_lseek,
|
||||||
|
IMFS_stat,
|
||||||
|
IMFS_fchmod,
|
||||||
|
memfile_ftruncate,
|
||||||
|
NULL, /* fpathconf */
|
||||||
|
NULL, /* fsync */
|
||||||
|
IMFS_fdatasync,
|
||||||
|
IMFS_fcntl
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototypes of private routines
|
* Prototypes of private routines
|
||||||
*/
|
*/
|
||||||
|
|||||||
71
c/src/exec/libfs/src/imfs/miniimfs_init.c
Normal file
71
c/src/exec/libfs/src/imfs/miniimfs_init.c
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Mini-IMFS Initialization
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1998.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* Copyright assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.OARcorp.com/rtems/license.html.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h> /* for mkdir */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "imfs.h"
|
||||||
|
#include "libio_.h"
|
||||||
|
|
||||||
|
#if defined(IMFS_DEBUG)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* miniIMFS file system operations table
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_filesystem_operations_table miniIMFS_ops = {
|
||||||
|
IMFS_eval_path,
|
||||||
|
IMFS_evaluate_for_make,
|
||||||
|
NULL, /* XXX IMFS_link, */
|
||||||
|
NULL, /* XXX IMFS_unlink, */
|
||||||
|
IMFS_node_type,
|
||||||
|
IMFS_mknod,
|
||||||
|
NULL, /* XXX IMFS_rmnod, */
|
||||||
|
NULL, /* XXX IMFS_chown, */
|
||||||
|
NULL, /* XXX IMFS_freenodinfo, */
|
||||||
|
NULL, /* XXX IMFS_mount, */
|
||||||
|
miniIMFS_initialize,
|
||||||
|
NULL, /* XXX IMFS_unmount, */
|
||||||
|
NULL, /* XXX IMFS_fsunmount, */
|
||||||
|
NULL, /* XXX IMFS_utime, */
|
||||||
|
NULL, /* XXX IMFS_evaluate_link, */
|
||||||
|
NULL, /* XXX IMFS_symlink, */
|
||||||
|
NULL /* XXX IMFS_readlink */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* miniIMFS_initialize
|
||||||
|
*/
|
||||||
|
|
||||||
|
int miniIMFS_initialize(
|
||||||
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IMFS_initialize_support(
|
||||||
|
temp_mt_entry,
|
||||||
|
&miniIMFS_ops,
|
||||||
|
&rtems_filesystem_null_handlers, /* for memfiles */
|
||||||
|
&rtems_filesystem_null_handlers /* for directories */
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -306,7 +306,7 @@ typedef struct {
|
|||||||
* Structure for a mount table entry.
|
* Structure for a mount table entry.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct rtems_filesystem_mount_table_entry_tt{
|
struct rtems_filesystem_mount_table_entry_tt {
|
||||||
Chain_Node Node;
|
Chain_Node Node;
|
||||||
rtems_filesystem_location_info_t mt_point_node;
|
rtems_filesystem_location_info_t mt_point_node;
|
||||||
rtems_filesystem_location_info_t mt_fs_root;
|
rtems_filesystem_location_info_t mt_fs_root;
|
||||||
|
|||||||
@@ -24,10 +24,11 @@ BASE_FS_C_PIECES = base_fs mount unmount ioman libio libio_sockets eval \
|
|||||||
fs_null_handlers
|
fs_null_handlers
|
||||||
|
|
||||||
IMFS_C_PIECES = imfs_chown imfs_creat imfs_directory imfs_eval imfs_free \
|
IMFS_C_PIECES = imfs_chown imfs_creat imfs_directory imfs_eval imfs_free \
|
||||||
imfs_gtkn imfs_init imfs_link imfs_mknod imfs_mount imfs_fchmod \
|
imfs_fsunmount imfs_gtkn imfs_init imfs_initsupp imfs_link imfs_mknod \
|
||||||
imfs_rmnod imfs_unlink imfs_unmount imfs_utime imfs_ntype imfs_stat \
|
imfs_mount imfs_fchmod imfs_rmnod imfs_unlink imfs_unmount imfs_utime \
|
||||||
imfs_getchild memfile deviceio imfs_handlers imfs_debug imfs_symlink \
|
imfs_ntype imfs_stat imfs_getchild memfile deviceio imfs_handlers_device \
|
||||||
imfs_readlink imfs_fdatasync imfs_fcntl
|
imfs_handlers_directory imfs_handlers_memfile imfs_debug imfs_symlink \
|
||||||
|
imfs_readlink imfs_fdatasync imfs_fcntl miniimfs_init
|
||||||
|
|
||||||
TERMIOS_C_PIECES = cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcgetattr \
|
TERMIOS_C_PIECES = cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcgetattr \
|
||||||
tcsetattr tcdrain tcflow tcflush termios \
|
tcsetattr tcdrain tcflow tcflush termios \
|
||||||
|
|||||||
@@ -52,6 +52,13 @@ void rtems_filesystem_initialize( void )
|
|||||||
|
|
||||||
init_fs_mount_table();
|
init_fs_mount_table();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mount the first filesystem.
|
||||||
|
*
|
||||||
|
* NOTE: XXX This really needs to be read from a table of filesystems
|
||||||
|
* to mount initially and the miniIMFS needs to be shaken out.
|
||||||
|
*/
|
||||||
|
|
||||||
status = mount(
|
status = mount(
|
||||||
&first_entry,
|
&first_entry,
|
||||||
&IMFS_ops,
|
&IMFS_ops,
|
||||||
|
|||||||
@@ -183,7 +183,9 @@ struct IMFS_jnode_tt {
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ino_t ino_count;
|
ino_t ino_count;
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers;
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers;
|
||||||
} IMFS_fs_info_t;
|
} IMFS_fs_info_t;
|
||||||
|
|
||||||
#define increment_and_check_linkcounts( _fs_info ) \
|
#define increment_and_check_linkcounts( _fs_info ) \
|
||||||
@@ -214,6 +216,7 @@ extern rtems_filesystem_file_handlers_r IMFS_device_handlers;
|
|||||||
extern rtems_filesystem_file_handlers_r IMFS_memfile_handlers;
|
extern rtems_filesystem_file_handlers_r IMFS_memfile_handlers;
|
||||||
extern rtems_filesystem_file_handlers_r IMFS_directory_handlers;
|
extern rtems_filesystem_file_handlers_r IMFS_directory_handlers;
|
||||||
extern rtems_filesystem_operations_table IMFS_ops;
|
extern rtems_filesystem_operations_table IMFS_ops;
|
||||||
|
extern rtems_filesystem_operations_table miniIMFS_ops;
|
||||||
extern rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS;
|
extern rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -224,6 +227,17 @@ int IMFS_initialize(
|
|||||||
rtems_filesystem_mount_table_entry_t *mt_entry
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
);
|
);
|
||||||
|
|
||||||
|
int miniIMFS_initialize(
|
||||||
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
|
);
|
||||||
|
|
||||||
|
int IMFS_initialize_support(
|
||||||
|
rtems_filesystem_mount_table_entry_t *mt_entry,
|
||||||
|
rtems_filesystem_operations_table *op_table,
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers,
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers
|
||||||
|
);
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
int IMFS_fsunmount(
|
||||||
rtems_filesystem_mount_table_entry_t *mt_entry
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -32,11 +32,13 @@ int IMFS_Set_handlers(
|
|||||||
rtems_filesystem_location_info_t *loc
|
rtems_filesystem_location_info_t *loc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_jnode_t *node = loc->node_access;
|
IMFS_jnode_t *node = loc->node_access;
|
||||||
|
IMFS_fs_info_t *fs_info;
|
||||||
|
|
||||||
|
fs_info = loc->mt_entry->fs_info;
|
||||||
switch( node->type ) {
|
switch( node->type ) {
|
||||||
case IMFS_DIRECTORY:
|
case IMFS_DIRECTORY:
|
||||||
loc->handlers = &IMFS_directory_handlers;
|
loc->handlers = fs_info->directory_handlers;
|
||||||
break;
|
break;
|
||||||
case IMFS_DEVICE:
|
case IMFS_DEVICE:
|
||||||
loc->handlers = &IMFS_device_handlers;
|
loc->handlers = &IMFS_device_handlers;
|
||||||
@@ -46,7 +48,7 @@ int IMFS_Set_handlers(
|
|||||||
loc->handlers = &rtems_filesystem_null_handlers;
|
loc->handlers = &rtems_filesystem_null_handlers;
|
||||||
break;
|
break;
|
||||||
case IMFS_MEMORY_FILE:
|
case IMFS_MEMORY_FILE:
|
||||||
loc->handlers = &IMFS_memfile_handlers;
|
loc->handlers = fs_info->memfile_handlers;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,65 +35,3 @@ int IMFS_freenodinfo(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IMFS_freenod
|
|
||||||
*
|
|
||||||
* The following routine frees a node if possible.
|
|
||||||
*
|
|
||||||
* The routine returns 0 if the node was not freed and 1 if it was.
|
|
||||||
*
|
|
||||||
* NOTE: This routine is for INTERNAL IMFS use only.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int IMFS_freenod(
|
|
||||||
rtems_filesystem_location_info_t *pathloc
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *the_jnode;
|
|
||||||
|
|
||||||
the_jnode = pathloc->node_access;
|
|
||||||
|
|
||||||
if ( the_jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove a node that still has children
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( ! Chain_Is_empty( &the_jnode->info.directory.Entries ) )
|
|
||||||
return ENOTEMPTY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove the file system root node.
|
|
||||||
*/
|
|
||||||
if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access )
|
|
||||||
return EBUSY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove a mountpoint.
|
|
||||||
*/
|
|
||||||
if ( the_jnode->info.directory.mt_fs != NULL )
|
|
||||||
return EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !rtems_libio_is_file_open( the_jnode ) &&
|
|
||||||
(the_jnode->st_nlink < 1) ) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Is the rtems_filesystem_current is this node?
|
|
||||||
*/
|
|
||||||
if ( rtems_filesystem_current.node_access == pathloc->node_access ) {
|
|
||||||
rtems_filesystem_current.node_access = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Free memory associated with a memory file.
|
|
||||||
*/
|
|
||||||
if ( the_jnode->type == IMFS_MEMORY_FILE )
|
|
||||||
IMFS_memfile_remove( the_jnode );
|
|
||||||
|
|
||||||
free( the_jnode );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|||||||
90
c/src/lib/libc/imfs_fsunmount.c
Normal file
90
c/src/lib/libc/imfs_fsunmount.c
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* IMFS Initialization
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1998.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* Copyright assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.OARcorp.com/rtems/license.html.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h> /* for mkdir */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "imfs.h"
|
||||||
|
#include "libio_.h"
|
||||||
|
|
||||||
|
#if defined(IMFS_DEBUG)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IMFS_fsunmount
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define jnode_get_control( jnode ) \
|
||||||
|
(&jnode->info.directory.Entries)
|
||||||
|
|
||||||
|
#define jnode_has_no_children( jnode ) \
|
||||||
|
Chain_Is_empty( jnode_get_control( jnode ) )
|
||||||
|
|
||||||
|
#define jnode_has_children( jnode ) \
|
||||||
|
( ! jnode_has_no_children( jnode ) )
|
||||||
|
|
||||||
|
#define jnode_get_first_child( jnode ) \
|
||||||
|
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
||||||
|
|
||||||
|
|
||||||
|
int IMFS_fsunmount(
|
||||||
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IMFS_jnode_t *jnode;
|
||||||
|
IMFS_jnode_t *next;
|
||||||
|
rtems_filesystem_location_info_t loc;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
||||||
|
* associated memory space
|
||||||
|
*/
|
||||||
|
|
||||||
|
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
||||||
|
|
||||||
|
do {
|
||||||
|
next = jnode->Parent;
|
||||||
|
loc.node_access = (void *)jnode;
|
||||||
|
|
||||||
|
if ( jnode->type != IMFS_DIRECTORY ) {
|
||||||
|
result = IMFS_unlink( &loc );
|
||||||
|
if (result != 0)
|
||||||
|
return -1;
|
||||||
|
jnode = next;
|
||||||
|
} else if ( jnode_has_no_children( jnode ) ) {
|
||||||
|
result = IMFS_unlink( &loc );
|
||||||
|
if (result != 0)
|
||||||
|
return -1;
|
||||||
|
jnode = next;
|
||||||
|
}
|
||||||
|
if ( jnode != NULL ) {
|
||||||
|
if ( jnode->type == IMFS_DIRECTORY ) {
|
||||||
|
if ( jnode_has_children( jnode ) )
|
||||||
|
jnode = jnode_get_first_child( jnode );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (jnode != NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
/*
|
|
||||||
* Operations Tables for the IMFS
|
|
||||||
*
|
|
||||||
* COPYRIGHT (c) 1989-1998.
|
|
||||||
* On-Line Applications Research Corporation (OAR).
|
|
||||||
* Copyright assigned to U.S. Government, 1994.
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.OARcorp.com/rtems/license.html.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include "imfs.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set of operations handlers for operations on memfile entities.
|
|
||||||
*/
|
|
||||||
|
|
||||||
rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
|
|
||||||
memfile_open,
|
|
||||||
memfile_close,
|
|
||||||
memfile_read,
|
|
||||||
memfile_write,
|
|
||||||
memfile_ioctl,
|
|
||||||
memfile_lseek,
|
|
||||||
IMFS_stat,
|
|
||||||
IMFS_fchmod,
|
|
||||||
memfile_ftruncate,
|
|
||||||
NULL, /* fpathconf */
|
|
||||||
NULL, /* fsync */
|
|
||||||
IMFS_fdatasync,
|
|
||||||
IMFS_fcntl
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set of operations handlers for operations on directories.
|
|
||||||
*/
|
|
||||||
|
|
||||||
rtems_filesystem_file_handlers_r IMFS_directory_handlers = {
|
|
||||||
imfs_dir_open,
|
|
||||||
imfs_dir_close,
|
|
||||||
imfs_dir_read,
|
|
||||||
NULL, /* write */
|
|
||||||
NULL, /* ioctl */
|
|
||||||
imfs_dir_lseek,
|
|
||||||
imfs_dir_fstat,
|
|
||||||
IMFS_fchmod,
|
|
||||||
NULL, /* ftruncate */
|
|
||||||
NULL, /* fpathconf */
|
|
||||||
NULL, /* fsync */
|
|
||||||
IMFS_fdatasync,
|
|
||||||
IMFS_fcntl
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Handler table for IMFS device nodes
|
|
||||||
*/
|
|
||||||
|
|
||||||
rtems_filesystem_file_handlers_r IMFS_device_handlers = {
|
|
||||||
device_open,
|
|
||||||
device_close,
|
|
||||||
device_read,
|
|
||||||
device_write,
|
|
||||||
device_ioctl,
|
|
||||||
device_lseek,
|
|
||||||
IMFS_stat,
|
|
||||||
IMFS_fchmod,
|
|
||||||
NULL, /* ftruncate */
|
|
||||||
NULL, /* fpathconf */
|
|
||||||
NULL, /* fsync */
|
|
||||||
NULL, /* fdatasync */
|
|
||||||
NULL /* fcntl */
|
|
||||||
};
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMFS file system operations table
|
* IMFS file system operations table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ rtems_filesystem_operations_table IMFS_ops = {
|
|||||||
IMFS_initialize,
|
IMFS_initialize,
|
||||||
IMFS_unmount,
|
IMFS_unmount,
|
||||||
IMFS_fsunmount,
|
IMFS_fsunmount,
|
||||||
IMFS_utime,
|
IMFS_utime,
|
||||||
IMFS_evaluate_link,
|
IMFS_evaluate_link,
|
||||||
IMFS_symlink,
|
IMFS_symlink,
|
||||||
IMFS_readlink
|
IMFS_readlink
|
||||||
@@ -58,101 +58,11 @@ int IMFS_initialize(
|
|||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_fs_info_t *fs_info;
|
IMFS_initialize_support(
|
||||||
IMFS_jnode_t *jnode;
|
temp_mt_entry,
|
||||||
|
&IMFS_ops,
|
||||||
/*
|
&IMFS_memfile_handlers,
|
||||||
* Create the root node
|
&IMFS_directory_handlers
|
||||||
*/
|
);
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.node_access = IMFS_create_node(
|
|
||||||
NULL,
|
|
||||||
IMFS_DIRECTORY,
|
|
||||||
"",
|
|
||||||
( S_IRWXO | S_IRWXG| S_IRWXU ),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.handlers = &IMFS_directory_handlers;
|
|
||||||
temp_mt_entry->mt_fs_root.ops = &IMFS_ops;
|
|
||||||
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create custom file system data.
|
|
||||||
*/
|
|
||||||
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
|
|
||||||
if ( !fs_info ){
|
|
||||||
free(temp_mt_entry->mt_fs_root.node_access);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
temp_mt_entry->fs_info = fs_info;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set st_ino for the root to 1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
fs_info->ino_count = 1;
|
|
||||||
|
|
||||||
jnode = temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
jnode->st_ino = fs_info->ino_count;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define jnode_get_control( jnode ) \
|
|
||||||
(&jnode->info.directory.Entries)
|
|
||||||
|
|
||||||
#define jnode_has_no_children( jnode ) \
|
|
||||||
Chain_Is_empty( jnode_get_control( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_has_children( jnode ) \
|
|
||||||
( ! jnode_has_no_children( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_get_first_child( jnode ) \
|
|
||||||
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
|
||||||
|
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *jnode;
|
|
||||||
IMFS_jnode_t *next;
|
|
||||||
rtems_filesystem_location_info_t loc;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
|
||||||
* associated memory space
|
|
||||||
*/
|
|
||||||
|
|
||||||
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
|
|
||||||
do {
|
|
||||||
next = jnode->Parent;
|
|
||||||
loc.node_access = (void *)jnode;
|
|
||||||
|
|
||||||
if ( jnode->type != IMFS_DIRECTORY ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
} else if ( jnode_has_no_children( jnode ) ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
}
|
|
||||||
if ( jnode != NULL ) {
|
|
||||||
if ( jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
if ( jnode_has_children( jnode ) )
|
|
||||||
jnode = jnode_get_first_child( jnode );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (jnode != NULL);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,36 +26,15 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* IMFS file system operations table
|
|
||||||
*/
|
|
||||||
|
|
||||||
rtems_filesystem_operations_table IMFS_ops = {
|
|
||||||
IMFS_eval_path,
|
|
||||||
IMFS_evaluate_for_make,
|
|
||||||
IMFS_link,
|
|
||||||
IMFS_unlink,
|
|
||||||
IMFS_node_type,
|
|
||||||
IMFS_mknod,
|
|
||||||
IMFS_rmnod,
|
|
||||||
IMFS_chown,
|
|
||||||
IMFS_freenodinfo,
|
|
||||||
IMFS_mount,
|
|
||||||
IMFS_initialize,
|
|
||||||
IMFS_unmount,
|
|
||||||
IMFS_fsunmount,
|
|
||||||
IMFS_utime,
|
|
||||||
IMFS_evaluate_link,
|
|
||||||
IMFS_symlink,
|
|
||||||
IMFS_readlink
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMFS_initialize
|
* IMFS_initialize
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int IMFS_initialize(
|
int IMFS_initialize_support(
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry,
|
||||||
|
rtems_filesystem_operations_table *op_table,
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers,
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_fs_info_t *fs_info;
|
IMFS_fs_info_t *fs_info;
|
||||||
@@ -73,8 +52,8 @@ int IMFS_initialize(
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.handlers = &IMFS_directory_handlers;
|
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
|
||||||
temp_mt_entry->mt_fs_root.ops = &IMFS_ops;
|
temp_mt_entry->mt_fs_root.ops = op_table;
|
||||||
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -91,68 +70,12 @@ int IMFS_initialize(
|
|||||||
* Set st_ino for the root to 1.
|
* Set st_ino for the root to 1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fs_info->ino_count = 1;
|
fs_info->ino_count = 1;
|
||||||
|
fs_info->memfile_handlers = memfile_handlers;
|
||||||
|
fs_info->memfile_handlers = directory_handlers;
|
||||||
|
|
||||||
jnode = temp_mt_entry->mt_fs_root.node_access;
|
jnode = temp_mt_entry->mt_fs_root.node_access;
|
||||||
jnode->st_ino = fs_info->ino_count;
|
jnode->st_ino = fs_info->ino_count;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define jnode_get_control( jnode ) \
|
|
||||||
(&jnode->info.directory.Entries)
|
|
||||||
|
|
||||||
#define jnode_has_no_children( jnode ) \
|
|
||||||
Chain_Is_empty( jnode_get_control( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_has_children( jnode ) \
|
|
||||||
( ! jnode_has_no_children( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_get_first_child( jnode ) \
|
|
||||||
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
|
||||||
|
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *jnode;
|
|
||||||
IMFS_jnode_t *next;
|
|
||||||
rtems_filesystem_location_info_t loc;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
|
||||||
* associated memory space
|
|
||||||
*/
|
|
||||||
|
|
||||||
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
|
|
||||||
do {
|
|
||||||
next = jnode->Parent;
|
|
||||||
loc.node_access = (void *)jnode;
|
|
||||||
|
|
||||||
if ( jnode->type != IMFS_DIRECTORY ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
} else if ( jnode_has_no_children( jnode ) ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
}
|
|
||||||
if ( jnode != NULL ) {
|
|
||||||
if ( jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
if ( jnode_has_children( jnode ) )
|
|
||||||
jnode = jnode_get_first_child( jnode );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (jnode != NULL);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -306,7 +306,7 @@ typedef struct {
|
|||||||
* Structure for a mount table entry.
|
* Structure for a mount table entry.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct rtems_filesystem_mount_table_entry_tt{
|
struct rtems_filesystem_mount_table_entry_tt {
|
||||||
Chain_Node Node;
|
Chain_Node Node;
|
||||||
rtems_filesystem_location_info_t mt_point_node;
|
rtems_filesystem_location_info_t mt_point_node;
|
||||||
rtems_filesystem_location_info_t mt_fs_root;
|
rtems_filesystem_location_info_t mt_fs_root;
|
||||||
|
|||||||
@@ -29,6 +29,26 @@
|
|||||||
|
|
||||||
#define MEMFILE_STATIC
|
#define MEMFILE_STATIC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set of operations handlers for operations on memfile entities.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
|
||||||
|
memfile_open,
|
||||||
|
memfile_close,
|
||||||
|
memfile_read,
|
||||||
|
memfile_write,
|
||||||
|
memfile_ioctl,
|
||||||
|
memfile_lseek,
|
||||||
|
IMFS_stat,
|
||||||
|
IMFS_fchmod,
|
||||||
|
memfile_ftruncate,
|
||||||
|
NULL, /* fpathconf */
|
||||||
|
NULL, /* fsync */
|
||||||
|
IMFS_fdatasync,
|
||||||
|
IMFS_fcntl
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototypes of private routines
|
* Prototypes of private routines
|
||||||
*/
|
*/
|
||||||
|
|||||||
71
c/src/lib/libc/miniimfs_init.c
Normal file
71
c/src/lib/libc/miniimfs_init.c
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Mini-IMFS Initialization
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1998.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* Copyright assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.OARcorp.com/rtems/license.html.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h> /* for mkdir */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "imfs.h"
|
||||||
|
#include "libio_.h"
|
||||||
|
|
||||||
|
#if defined(IMFS_DEBUG)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* miniIMFS file system operations table
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_filesystem_operations_table miniIMFS_ops = {
|
||||||
|
IMFS_eval_path,
|
||||||
|
IMFS_evaluate_for_make,
|
||||||
|
NULL, /* XXX IMFS_link, */
|
||||||
|
NULL, /* XXX IMFS_unlink, */
|
||||||
|
IMFS_node_type,
|
||||||
|
IMFS_mknod,
|
||||||
|
NULL, /* XXX IMFS_rmnod, */
|
||||||
|
NULL, /* XXX IMFS_chown, */
|
||||||
|
NULL, /* XXX IMFS_freenodinfo, */
|
||||||
|
NULL, /* XXX IMFS_mount, */
|
||||||
|
miniIMFS_initialize,
|
||||||
|
NULL, /* XXX IMFS_unmount, */
|
||||||
|
NULL, /* XXX IMFS_fsunmount, */
|
||||||
|
NULL, /* XXX IMFS_utime, */
|
||||||
|
NULL, /* XXX IMFS_evaluate_link, */
|
||||||
|
NULL, /* XXX IMFS_symlink, */
|
||||||
|
NULL /* XXX IMFS_readlink */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* miniIMFS_initialize
|
||||||
|
*/
|
||||||
|
|
||||||
|
int miniIMFS_initialize(
|
||||||
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IMFS_initialize_support(
|
||||||
|
temp_mt_entry,
|
||||||
|
&miniIMFS_ops,
|
||||||
|
&rtems_filesystem_null_handlers, /* for memfiles */
|
||||||
|
&rtems_filesystem_null_handlers /* for directories */
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -183,7 +183,9 @@ struct IMFS_jnode_tt {
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ino_t ino_count;
|
ino_t ino_count;
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers;
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers;
|
||||||
} IMFS_fs_info_t;
|
} IMFS_fs_info_t;
|
||||||
|
|
||||||
#define increment_and_check_linkcounts( _fs_info ) \
|
#define increment_and_check_linkcounts( _fs_info ) \
|
||||||
@@ -214,6 +216,7 @@ extern rtems_filesystem_file_handlers_r IMFS_device_handlers;
|
|||||||
extern rtems_filesystem_file_handlers_r IMFS_memfile_handlers;
|
extern rtems_filesystem_file_handlers_r IMFS_memfile_handlers;
|
||||||
extern rtems_filesystem_file_handlers_r IMFS_directory_handlers;
|
extern rtems_filesystem_file_handlers_r IMFS_directory_handlers;
|
||||||
extern rtems_filesystem_operations_table IMFS_ops;
|
extern rtems_filesystem_operations_table IMFS_ops;
|
||||||
|
extern rtems_filesystem_operations_table miniIMFS_ops;
|
||||||
extern rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS;
|
extern rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -224,6 +227,17 @@ int IMFS_initialize(
|
|||||||
rtems_filesystem_mount_table_entry_t *mt_entry
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
);
|
);
|
||||||
|
|
||||||
|
int miniIMFS_initialize(
|
||||||
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
|
);
|
||||||
|
|
||||||
|
int IMFS_initialize_support(
|
||||||
|
rtems_filesystem_mount_table_entry_t *mt_entry,
|
||||||
|
rtems_filesystem_operations_table *op_table,
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers,
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers
|
||||||
|
);
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
int IMFS_fsunmount(
|
||||||
rtems_filesystem_mount_table_entry_t *mt_entry
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -32,11 +32,13 @@ int IMFS_Set_handlers(
|
|||||||
rtems_filesystem_location_info_t *loc
|
rtems_filesystem_location_info_t *loc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_jnode_t *node = loc->node_access;
|
IMFS_jnode_t *node = loc->node_access;
|
||||||
|
IMFS_fs_info_t *fs_info;
|
||||||
|
|
||||||
|
fs_info = loc->mt_entry->fs_info;
|
||||||
switch( node->type ) {
|
switch( node->type ) {
|
||||||
case IMFS_DIRECTORY:
|
case IMFS_DIRECTORY:
|
||||||
loc->handlers = &IMFS_directory_handlers;
|
loc->handlers = fs_info->directory_handlers;
|
||||||
break;
|
break;
|
||||||
case IMFS_DEVICE:
|
case IMFS_DEVICE:
|
||||||
loc->handlers = &IMFS_device_handlers;
|
loc->handlers = &IMFS_device_handlers;
|
||||||
@@ -46,7 +48,7 @@ int IMFS_Set_handlers(
|
|||||||
loc->handlers = &rtems_filesystem_null_handlers;
|
loc->handlers = &rtems_filesystem_null_handlers;
|
||||||
break;
|
break;
|
||||||
case IMFS_MEMORY_FILE:
|
case IMFS_MEMORY_FILE:
|
||||||
loc->handlers = &IMFS_memfile_handlers;
|
loc->handlers = fs_info->memfile_handlers;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,65 +35,3 @@ int IMFS_freenodinfo(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IMFS_freenod
|
|
||||||
*
|
|
||||||
* The following routine frees a node if possible.
|
|
||||||
*
|
|
||||||
* The routine returns 0 if the node was not freed and 1 if it was.
|
|
||||||
*
|
|
||||||
* NOTE: This routine is for INTERNAL IMFS use only.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int IMFS_freenod(
|
|
||||||
rtems_filesystem_location_info_t *pathloc
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *the_jnode;
|
|
||||||
|
|
||||||
the_jnode = pathloc->node_access;
|
|
||||||
|
|
||||||
if ( the_jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove a node that still has children
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( ! Chain_Is_empty( &the_jnode->info.directory.Entries ) )
|
|
||||||
return ENOTEMPTY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove the file system root node.
|
|
||||||
*/
|
|
||||||
if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access )
|
|
||||||
return EBUSY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove a mountpoint.
|
|
||||||
*/
|
|
||||||
if ( the_jnode->info.directory.mt_fs != NULL )
|
|
||||||
return EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !rtems_libio_is_file_open( the_jnode ) &&
|
|
||||||
(the_jnode->st_nlink < 1) ) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Is the rtems_filesystem_current is this node?
|
|
||||||
*/
|
|
||||||
if ( rtems_filesystem_current.node_access == pathloc->node_access ) {
|
|
||||||
rtems_filesystem_current.node_access = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Free memory associated with a memory file.
|
|
||||||
*/
|
|
||||||
if ( the_jnode->type == IMFS_MEMORY_FILE )
|
|
||||||
IMFS_memfile_remove( the_jnode );
|
|
||||||
|
|
||||||
free( the_jnode );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|||||||
90
c/src/libfs/src/imfs/imfs_fsunmount.c
Normal file
90
c/src/libfs/src/imfs/imfs_fsunmount.c
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* IMFS Initialization
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1998.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* Copyright assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.OARcorp.com/rtems/license.html.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h> /* for mkdir */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "imfs.h"
|
||||||
|
#include "libio_.h"
|
||||||
|
|
||||||
|
#if defined(IMFS_DEBUG)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IMFS_fsunmount
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define jnode_get_control( jnode ) \
|
||||||
|
(&jnode->info.directory.Entries)
|
||||||
|
|
||||||
|
#define jnode_has_no_children( jnode ) \
|
||||||
|
Chain_Is_empty( jnode_get_control( jnode ) )
|
||||||
|
|
||||||
|
#define jnode_has_children( jnode ) \
|
||||||
|
( ! jnode_has_no_children( jnode ) )
|
||||||
|
|
||||||
|
#define jnode_get_first_child( jnode ) \
|
||||||
|
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
||||||
|
|
||||||
|
|
||||||
|
int IMFS_fsunmount(
|
||||||
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IMFS_jnode_t *jnode;
|
||||||
|
IMFS_jnode_t *next;
|
||||||
|
rtems_filesystem_location_info_t loc;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
||||||
|
* associated memory space
|
||||||
|
*/
|
||||||
|
|
||||||
|
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
||||||
|
|
||||||
|
do {
|
||||||
|
next = jnode->Parent;
|
||||||
|
loc.node_access = (void *)jnode;
|
||||||
|
|
||||||
|
if ( jnode->type != IMFS_DIRECTORY ) {
|
||||||
|
result = IMFS_unlink( &loc );
|
||||||
|
if (result != 0)
|
||||||
|
return -1;
|
||||||
|
jnode = next;
|
||||||
|
} else if ( jnode_has_no_children( jnode ) ) {
|
||||||
|
result = IMFS_unlink( &loc );
|
||||||
|
if (result != 0)
|
||||||
|
return -1;
|
||||||
|
jnode = next;
|
||||||
|
}
|
||||||
|
if ( jnode != NULL ) {
|
||||||
|
if ( jnode->type == IMFS_DIRECTORY ) {
|
||||||
|
if ( jnode_has_children( jnode ) )
|
||||||
|
jnode = jnode_get_first_child( jnode );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (jnode != NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMFS file system operations table
|
* IMFS file system operations table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ rtems_filesystem_operations_table IMFS_ops = {
|
|||||||
IMFS_initialize,
|
IMFS_initialize,
|
||||||
IMFS_unmount,
|
IMFS_unmount,
|
||||||
IMFS_fsunmount,
|
IMFS_fsunmount,
|
||||||
IMFS_utime,
|
IMFS_utime,
|
||||||
IMFS_evaluate_link,
|
IMFS_evaluate_link,
|
||||||
IMFS_symlink,
|
IMFS_symlink,
|
||||||
IMFS_readlink
|
IMFS_readlink
|
||||||
@@ -58,101 +58,11 @@ int IMFS_initialize(
|
|||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_fs_info_t *fs_info;
|
IMFS_initialize_support(
|
||||||
IMFS_jnode_t *jnode;
|
temp_mt_entry,
|
||||||
|
&IMFS_ops,
|
||||||
/*
|
&IMFS_memfile_handlers,
|
||||||
* Create the root node
|
&IMFS_directory_handlers
|
||||||
*/
|
);
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.node_access = IMFS_create_node(
|
|
||||||
NULL,
|
|
||||||
IMFS_DIRECTORY,
|
|
||||||
"",
|
|
||||||
( S_IRWXO | S_IRWXG| S_IRWXU ),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.handlers = &IMFS_directory_handlers;
|
|
||||||
temp_mt_entry->mt_fs_root.ops = &IMFS_ops;
|
|
||||||
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create custom file system data.
|
|
||||||
*/
|
|
||||||
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
|
|
||||||
if ( !fs_info ){
|
|
||||||
free(temp_mt_entry->mt_fs_root.node_access);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
temp_mt_entry->fs_info = fs_info;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set st_ino for the root to 1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
fs_info->ino_count = 1;
|
|
||||||
|
|
||||||
jnode = temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
jnode->st_ino = fs_info->ino_count;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define jnode_get_control( jnode ) \
|
|
||||||
(&jnode->info.directory.Entries)
|
|
||||||
|
|
||||||
#define jnode_has_no_children( jnode ) \
|
|
||||||
Chain_Is_empty( jnode_get_control( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_has_children( jnode ) \
|
|
||||||
( ! jnode_has_no_children( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_get_first_child( jnode ) \
|
|
||||||
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
|
||||||
|
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *jnode;
|
|
||||||
IMFS_jnode_t *next;
|
|
||||||
rtems_filesystem_location_info_t loc;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
|
||||||
* associated memory space
|
|
||||||
*/
|
|
||||||
|
|
||||||
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
|
|
||||||
do {
|
|
||||||
next = jnode->Parent;
|
|
||||||
loc.node_access = (void *)jnode;
|
|
||||||
|
|
||||||
if ( jnode->type != IMFS_DIRECTORY ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
} else if ( jnode_has_no_children( jnode ) ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
}
|
|
||||||
if ( jnode != NULL ) {
|
|
||||||
if ( jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
if ( jnode_has_children( jnode ) )
|
|
||||||
jnode = jnode_get_first_child( jnode );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (jnode != NULL);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,36 +26,15 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* IMFS file system operations table
|
|
||||||
*/
|
|
||||||
|
|
||||||
rtems_filesystem_operations_table IMFS_ops = {
|
|
||||||
IMFS_eval_path,
|
|
||||||
IMFS_evaluate_for_make,
|
|
||||||
IMFS_link,
|
|
||||||
IMFS_unlink,
|
|
||||||
IMFS_node_type,
|
|
||||||
IMFS_mknod,
|
|
||||||
IMFS_rmnod,
|
|
||||||
IMFS_chown,
|
|
||||||
IMFS_freenodinfo,
|
|
||||||
IMFS_mount,
|
|
||||||
IMFS_initialize,
|
|
||||||
IMFS_unmount,
|
|
||||||
IMFS_fsunmount,
|
|
||||||
IMFS_utime,
|
|
||||||
IMFS_evaluate_link,
|
|
||||||
IMFS_symlink,
|
|
||||||
IMFS_readlink
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMFS_initialize
|
* IMFS_initialize
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int IMFS_initialize(
|
int IMFS_initialize_support(
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry,
|
||||||
|
rtems_filesystem_operations_table *op_table,
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers,
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_fs_info_t *fs_info;
|
IMFS_fs_info_t *fs_info;
|
||||||
@@ -73,8 +52,8 @@ int IMFS_initialize(
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.handlers = &IMFS_directory_handlers;
|
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
|
||||||
temp_mt_entry->mt_fs_root.ops = &IMFS_ops;
|
temp_mt_entry->mt_fs_root.ops = op_table;
|
||||||
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -91,68 +70,12 @@ int IMFS_initialize(
|
|||||||
* Set st_ino for the root to 1.
|
* Set st_ino for the root to 1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fs_info->ino_count = 1;
|
fs_info->ino_count = 1;
|
||||||
|
fs_info->memfile_handlers = memfile_handlers;
|
||||||
|
fs_info->memfile_handlers = directory_handlers;
|
||||||
|
|
||||||
jnode = temp_mt_entry->mt_fs_root.node_access;
|
jnode = temp_mt_entry->mt_fs_root.node_access;
|
||||||
jnode->st_ino = fs_info->ino_count;
|
jnode->st_ino = fs_info->ino_count;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define jnode_get_control( jnode ) \
|
|
||||||
(&jnode->info.directory.Entries)
|
|
||||||
|
|
||||||
#define jnode_has_no_children( jnode ) \
|
|
||||||
Chain_Is_empty( jnode_get_control( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_has_children( jnode ) \
|
|
||||||
( ! jnode_has_no_children( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_get_first_child( jnode ) \
|
|
||||||
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
|
||||||
|
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *jnode;
|
|
||||||
IMFS_jnode_t *next;
|
|
||||||
rtems_filesystem_location_info_t loc;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
|
||||||
* associated memory space
|
|
||||||
*/
|
|
||||||
|
|
||||||
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
|
|
||||||
do {
|
|
||||||
next = jnode->Parent;
|
|
||||||
loc.node_access = (void *)jnode;
|
|
||||||
|
|
||||||
if ( jnode->type != IMFS_DIRECTORY ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
} else if ( jnode_has_no_children( jnode ) ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
}
|
|
||||||
if ( jnode != NULL ) {
|
|
||||||
if ( jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
if ( jnode_has_children( jnode ) )
|
|
||||||
jnode = jnode_get_first_child( jnode );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (jnode != NULL);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,26 @@
|
|||||||
|
|
||||||
#define MEMFILE_STATIC
|
#define MEMFILE_STATIC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set of operations handlers for operations on memfile entities.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
|
||||||
|
memfile_open,
|
||||||
|
memfile_close,
|
||||||
|
memfile_read,
|
||||||
|
memfile_write,
|
||||||
|
memfile_ioctl,
|
||||||
|
memfile_lseek,
|
||||||
|
IMFS_stat,
|
||||||
|
IMFS_fchmod,
|
||||||
|
memfile_ftruncate,
|
||||||
|
NULL, /* fpathconf */
|
||||||
|
NULL, /* fsync */
|
||||||
|
IMFS_fdatasync,
|
||||||
|
IMFS_fcntl
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototypes of private routines
|
* Prototypes of private routines
|
||||||
*/
|
*/
|
||||||
|
|||||||
71
c/src/libfs/src/imfs/miniimfs_init.c
Normal file
71
c/src/libfs/src/imfs/miniimfs_init.c
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Mini-IMFS Initialization
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1998.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* Copyright assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.OARcorp.com/rtems/license.html.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h> /* for mkdir */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "imfs.h"
|
||||||
|
#include "libio_.h"
|
||||||
|
|
||||||
|
#if defined(IMFS_DEBUG)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* miniIMFS file system operations table
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_filesystem_operations_table miniIMFS_ops = {
|
||||||
|
IMFS_eval_path,
|
||||||
|
IMFS_evaluate_for_make,
|
||||||
|
NULL, /* XXX IMFS_link, */
|
||||||
|
NULL, /* XXX IMFS_unlink, */
|
||||||
|
IMFS_node_type,
|
||||||
|
IMFS_mknod,
|
||||||
|
NULL, /* XXX IMFS_rmnod, */
|
||||||
|
NULL, /* XXX IMFS_chown, */
|
||||||
|
NULL, /* XXX IMFS_freenodinfo, */
|
||||||
|
NULL, /* XXX IMFS_mount, */
|
||||||
|
miniIMFS_initialize,
|
||||||
|
NULL, /* XXX IMFS_unmount, */
|
||||||
|
NULL, /* XXX IMFS_fsunmount, */
|
||||||
|
NULL, /* XXX IMFS_utime, */
|
||||||
|
NULL, /* XXX IMFS_evaluate_link, */
|
||||||
|
NULL, /* XXX IMFS_symlink, */
|
||||||
|
NULL /* XXX IMFS_readlink */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* miniIMFS_initialize
|
||||||
|
*/
|
||||||
|
|
||||||
|
int miniIMFS_initialize(
|
||||||
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IMFS_initialize_support(
|
||||||
|
temp_mt_entry,
|
||||||
|
&miniIMFS_ops,
|
||||||
|
&rtems_filesystem_null_handlers, /* for memfiles */
|
||||||
|
&rtems_filesystem_null_handlers /* for directories */
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -306,7 +306,7 @@ typedef struct {
|
|||||||
* Structure for a mount table entry.
|
* Structure for a mount table entry.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct rtems_filesystem_mount_table_entry_tt{
|
struct rtems_filesystem_mount_table_entry_tt {
|
||||||
Chain_Node Node;
|
Chain_Node Node;
|
||||||
rtems_filesystem_location_info_t mt_point_node;
|
rtems_filesystem_location_info_t mt_point_node;
|
||||||
rtems_filesystem_location_info_t mt_fs_root;
|
rtems_filesystem_location_info_t mt_fs_root;
|
||||||
|
|||||||
@@ -52,6 +52,13 @@ void rtems_filesystem_initialize( void )
|
|||||||
|
|
||||||
init_fs_mount_table();
|
init_fs_mount_table();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mount the first filesystem.
|
||||||
|
*
|
||||||
|
* NOTE: XXX This really needs to be read from a table of filesystems
|
||||||
|
* to mount initially and the miniIMFS needs to be shaken out.
|
||||||
|
*/
|
||||||
|
|
||||||
status = mount(
|
status = mount(
|
||||||
&first_entry,
|
&first_entry,
|
||||||
&IMFS_ops,
|
&IMFS_ops,
|
||||||
|
|||||||
@@ -183,7 +183,9 @@ struct IMFS_jnode_tt {
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ino_t ino_count;
|
ino_t ino_count;
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers;
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers;
|
||||||
} IMFS_fs_info_t;
|
} IMFS_fs_info_t;
|
||||||
|
|
||||||
#define increment_and_check_linkcounts( _fs_info ) \
|
#define increment_and_check_linkcounts( _fs_info ) \
|
||||||
@@ -214,6 +216,7 @@ extern rtems_filesystem_file_handlers_r IMFS_device_handlers;
|
|||||||
extern rtems_filesystem_file_handlers_r IMFS_memfile_handlers;
|
extern rtems_filesystem_file_handlers_r IMFS_memfile_handlers;
|
||||||
extern rtems_filesystem_file_handlers_r IMFS_directory_handlers;
|
extern rtems_filesystem_file_handlers_r IMFS_directory_handlers;
|
||||||
extern rtems_filesystem_operations_table IMFS_ops;
|
extern rtems_filesystem_operations_table IMFS_ops;
|
||||||
|
extern rtems_filesystem_operations_table miniIMFS_ops;
|
||||||
extern rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS;
|
extern rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -224,6 +227,17 @@ int IMFS_initialize(
|
|||||||
rtems_filesystem_mount_table_entry_t *mt_entry
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
);
|
);
|
||||||
|
|
||||||
|
int miniIMFS_initialize(
|
||||||
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
|
);
|
||||||
|
|
||||||
|
int IMFS_initialize_support(
|
||||||
|
rtems_filesystem_mount_table_entry_t *mt_entry,
|
||||||
|
rtems_filesystem_operations_table *op_table,
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers,
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers
|
||||||
|
);
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
int IMFS_fsunmount(
|
||||||
rtems_filesystem_mount_table_entry_t *mt_entry
|
rtems_filesystem_mount_table_entry_t *mt_entry
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -32,11 +32,13 @@ int IMFS_Set_handlers(
|
|||||||
rtems_filesystem_location_info_t *loc
|
rtems_filesystem_location_info_t *loc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_jnode_t *node = loc->node_access;
|
IMFS_jnode_t *node = loc->node_access;
|
||||||
|
IMFS_fs_info_t *fs_info;
|
||||||
|
|
||||||
|
fs_info = loc->mt_entry->fs_info;
|
||||||
switch( node->type ) {
|
switch( node->type ) {
|
||||||
case IMFS_DIRECTORY:
|
case IMFS_DIRECTORY:
|
||||||
loc->handlers = &IMFS_directory_handlers;
|
loc->handlers = fs_info->directory_handlers;
|
||||||
break;
|
break;
|
||||||
case IMFS_DEVICE:
|
case IMFS_DEVICE:
|
||||||
loc->handlers = &IMFS_device_handlers;
|
loc->handlers = &IMFS_device_handlers;
|
||||||
@@ -46,7 +48,7 @@ int IMFS_Set_handlers(
|
|||||||
loc->handlers = &rtems_filesystem_null_handlers;
|
loc->handlers = &rtems_filesystem_null_handlers;
|
||||||
break;
|
break;
|
||||||
case IMFS_MEMORY_FILE:
|
case IMFS_MEMORY_FILE:
|
||||||
loc->handlers = &IMFS_memfile_handlers;
|
loc->handlers = fs_info->memfile_handlers;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,65 +35,3 @@ int IMFS_freenodinfo(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IMFS_freenod
|
|
||||||
*
|
|
||||||
* The following routine frees a node if possible.
|
|
||||||
*
|
|
||||||
* The routine returns 0 if the node was not freed and 1 if it was.
|
|
||||||
*
|
|
||||||
* NOTE: This routine is for INTERNAL IMFS use only.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int IMFS_freenod(
|
|
||||||
rtems_filesystem_location_info_t *pathloc
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *the_jnode;
|
|
||||||
|
|
||||||
the_jnode = pathloc->node_access;
|
|
||||||
|
|
||||||
if ( the_jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove a node that still has children
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( ! Chain_Is_empty( &the_jnode->info.directory.Entries ) )
|
|
||||||
return ENOTEMPTY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove the file system root node.
|
|
||||||
*/
|
|
||||||
if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access )
|
|
||||||
return EBUSY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You cannot remove a mountpoint.
|
|
||||||
*/
|
|
||||||
if ( the_jnode->info.directory.mt_fs != NULL )
|
|
||||||
return EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !rtems_libio_is_file_open( the_jnode ) &&
|
|
||||||
(the_jnode->st_nlink < 1) ) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Is the rtems_filesystem_current is this node?
|
|
||||||
*/
|
|
||||||
if ( rtems_filesystem_current.node_access == pathloc->node_access ) {
|
|
||||||
rtems_filesystem_current.node_access = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Free memory associated with a memory file.
|
|
||||||
*/
|
|
||||||
if ( the_jnode->type == IMFS_MEMORY_FILE )
|
|
||||||
IMFS_memfile_remove( the_jnode );
|
|
||||||
|
|
||||||
free( the_jnode );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|||||||
90
cpukit/libfs/src/imfs/imfs_fsunmount.c
Normal file
90
cpukit/libfs/src/imfs/imfs_fsunmount.c
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* IMFS Initialization
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1998.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* Copyright assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.OARcorp.com/rtems/license.html.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h> /* for mkdir */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "imfs.h"
|
||||||
|
#include "libio_.h"
|
||||||
|
|
||||||
|
#if defined(IMFS_DEBUG)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IMFS_fsunmount
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define jnode_get_control( jnode ) \
|
||||||
|
(&jnode->info.directory.Entries)
|
||||||
|
|
||||||
|
#define jnode_has_no_children( jnode ) \
|
||||||
|
Chain_Is_empty( jnode_get_control( jnode ) )
|
||||||
|
|
||||||
|
#define jnode_has_children( jnode ) \
|
||||||
|
( ! jnode_has_no_children( jnode ) )
|
||||||
|
|
||||||
|
#define jnode_get_first_child( jnode ) \
|
||||||
|
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
||||||
|
|
||||||
|
|
||||||
|
int IMFS_fsunmount(
|
||||||
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IMFS_jnode_t *jnode;
|
||||||
|
IMFS_jnode_t *next;
|
||||||
|
rtems_filesystem_location_info_t loc;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
||||||
|
* associated memory space
|
||||||
|
*/
|
||||||
|
|
||||||
|
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
||||||
|
|
||||||
|
do {
|
||||||
|
next = jnode->Parent;
|
||||||
|
loc.node_access = (void *)jnode;
|
||||||
|
|
||||||
|
if ( jnode->type != IMFS_DIRECTORY ) {
|
||||||
|
result = IMFS_unlink( &loc );
|
||||||
|
if (result != 0)
|
||||||
|
return -1;
|
||||||
|
jnode = next;
|
||||||
|
} else if ( jnode_has_no_children( jnode ) ) {
|
||||||
|
result = IMFS_unlink( &loc );
|
||||||
|
if (result != 0)
|
||||||
|
return -1;
|
||||||
|
jnode = next;
|
||||||
|
}
|
||||||
|
if ( jnode != NULL ) {
|
||||||
|
if ( jnode->type == IMFS_DIRECTORY ) {
|
||||||
|
if ( jnode_has_children( jnode ) )
|
||||||
|
jnode = jnode_get_first_child( jnode );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (jnode != NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMFS file system operations table
|
* IMFS file system operations table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ rtems_filesystem_operations_table IMFS_ops = {
|
|||||||
IMFS_initialize,
|
IMFS_initialize,
|
||||||
IMFS_unmount,
|
IMFS_unmount,
|
||||||
IMFS_fsunmount,
|
IMFS_fsunmount,
|
||||||
IMFS_utime,
|
IMFS_utime,
|
||||||
IMFS_evaluate_link,
|
IMFS_evaluate_link,
|
||||||
IMFS_symlink,
|
IMFS_symlink,
|
||||||
IMFS_readlink
|
IMFS_readlink
|
||||||
@@ -58,101 +58,11 @@ int IMFS_initialize(
|
|||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_fs_info_t *fs_info;
|
IMFS_initialize_support(
|
||||||
IMFS_jnode_t *jnode;
|
temp_mt_entry,
|
||||||
|
&IMFS_ops,
|
||||||
/*
|
&IMFS_memfile_handlers,
|
||||||
* Create the root node
|
&IMFS_directory_handlers
|
||||||
*/
|
);
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.node_access = IMFS_create_node(
|
|
||||||
NULL,
|
|
||||||
IMFS_DIRECTORY,
|
|
||||||
"",
|
|
||||||
( S_IRWXO | S_IRWXG| S_IRWXU ),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.handlers = &IMFS_directory_handlers;
|
|
||||||
temp_mt_entry->mt_fs_root.ops = &IMFS_ops;
|
|
||||||
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create custom file system data.
|
|
||||||
*/
|
|
||||||
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
|
|
||||||
if ( !fs_info ){
|
|
||||||
free(temp_mt_entry->mt_fs_root.node_access);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
temp_mt_entry->fs_info = fs_info;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set st_ino for the root to 1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
fs_info->ino_count = 1;
|
|
||||||
|
|
||||||
jnode = temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
jnode->st_ino = fs_info->ino_count;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define jnode_get_control( jnode ) \
|
|
||||||
(&jnode->info.directory.Entries)
|
|
||||||
|
|
||||||
#define jnode_has_no_children( jnode ) \
|
|
||||||
Chain_Is_empty( jnode_get_control( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_has_children( jnode ) \
|
|
||||||
( ! jnode_has_no_children( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_get_first_child( jnode ) \
|
|
||||||
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
|
||||||
|
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *jnode;
|
|
||||||
IMFS_jnode_t *next;
|
|
||||||
rtems_filesystem_location_info_t loc;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
|
||||||
* associated memory space
|
|
||||||
*/
|
|
||||||
|
|
||||||
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
|
|
||||||
do {
|
|
||||||
next = jnode->Parent;
|
|
||||||
loc.node_access = (void *)jnode;
|
|
||||||
|
|
||||||
if ( jnode->type != IMFS_DIRECTORY ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
} else if ( jnode_has_no_children( jnode ) ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
}
|
|
||||||
if ( jnode != NULL ) {
|
|
||||||
if ( jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
if ( jnode_has_children( jnode ) )
|
|
||||||
jnode = jnode_get_first_child( jnode );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (jnode != NULL);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,36 +26,15 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* IMFS file system operations table
|
|
||||||
*/
|
|
||||||
|
|
||||||
rtems_filesystem_operations_table IMFS_ops = {
|
|
||||||
IMFS_eval_path,
|
|
||||||
IMFS_evaluate_for_make,
|
|
||||||
IMFS_link,
|
|
||||||
IMFS_unlink,
|
|
||||||
IMFS_node_type,
|
|
||||||
IMFS_mknod,
|
|
||||||
IMFS_rmnod,
|
|
||||||
IMFS_chown,
|
|
||||||
IMFS_freenodinfo,
|
|
||||||
IMFS_mount,
|
|
||||||
IMFS_initialize,
|
|
||||||
IMFS_unmount,
|
|
||||||
IMFS_fsunmount,
|
|
||||||
IMFS_utime,
|
|
||||||
IMFS_evaluate_link,
|
|
||||||
IMFS_symlink,
|
|
||||||
IMFS_readlink
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMFS_initialize
|
* IMFS_initialize
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int IMFS_initialize(
|
int IMFS_initialize_support(
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry,
|
||||||
|
rtems_filesystem_operations_table *op_table,
|
||||||
|
rtems_filesystem_file_handlers_r *memfile_handlers,
|
||||||
|
rtems_filesystem_file_handlers_r *directory_handlers
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IMFS_fs_info_t *fs_info;
|
IMFS_fs_info_t *fs_info;
|
||||||
@@ -73,8 +52,8 @@ int IMFS_initialize(
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
temp_mt_entry->mt_fs_root.handlers = &IMFS_directory_handlers;
|
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
|
||||||
temp_mt_entry->mt_fs_root.ops = &IMFS_ops;
|
temp_mt_entry->mt_fs_root.ops = op_table;
|
||||||
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -91,68 +70,12 @@ int IMFS_initialize(
|
|||||||
* Set st_ino for the root to 1.
|
* Set st_ino for the root to 1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fs_info->ino_count = 1;
|
fs_info->ino_count = 1;
|
||||||
|
fs_info->memfile_handlers = memfile_handlers;
|
||||||
|
fs_info->memfile_handlers = directory_handlers;
|
||||||
|
|
||||||
jnode = temp_mt_entry->mt_fs_root.node_access;
|
jnode = temp_mt_entry->mt_fs_root.node_access;
|
||||||
jnode->st_ino = fs_info->ino_count;
|
jnode->st_ino = fs_info->ino_count;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define jnode_get_control( jnode ) \
|
|
||||||
(&jnode->info.directory.Entries)
|
|
||||||
|
|
||||||
#define jnode_has_no_children( jnode ) \
|
|
||||||
Chain_Is_empty( jnode_get_control( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_has_children( jnode ) \
|
|
||||||
( ! jnode_has_no_children( jnode ) )
|
|
||||||
|
|
||||||
#define jnode_get_first_child( jnode ) \
|
|
||||||
((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next))
|
|
||||||
|
|
||||||
|
|
||||||
int IMFS_fsunmount(
|
|
||||||
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
|
||||||
)
|
|
||||||
{
|
|
||||||
IMFS_jnode_t *jnode;
|
|
||||||
IMFS_jnode_t *next;
|
|
||||||
rtems_filesystem_location_info_t loc;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse tree that starts at the mt_fs_root and deallocate memory
|
|
||||||
* associated memory space
|
|
||||||
*/
|
|
||||||
|
|
||||||
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
|
|
||||||
|
|
||||||
do {
|
|
||||||
next = jnode->Parent;
|
|
||||||
loc.node_access = (void *)jnode;
|
|
||||||
|
|
||||||
if ( jnode->type != IMFS_DIRECTORY ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
} else if ( jnode_has_no_children( jnode ) ) {
|
|
||||||
result = IMFS_unlink( &loc );
|
|
||||||
if (result != 0)
|
|
||||||
return -1;
|
|
||||||
jnode = next;
|
|
||||||
}
|
|
||||||
if ( jnode != NULL ) {
|
|
||||||
if ( jnode->type == IMFS_DIRECTORY ) {
|
|
||||||
if ( jnode_has_children( jnode ) )
|
|
||||||
jnode = jnode_get_first_child( jnode );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (jnode != NULL);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,26 @@
|
|||||||
|
|
||||||
#define MEMFILE_STATIC
|
#define MEMFILE_STATIC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set of operations handlers for operations on memfile entities.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
|
||||||
|
memfile_open,
|
||||||
|
memfile_close,
|
||||||
|
memfile_read,
|
||||||
|
memfile_write,
|
||||||
|
memfile_ioctl,
|
||||||
|
memfile_lseek,
|
||||||
|
IMFS_stat,
|
||||||
|
IMFS_fchmod,
|
||||||
|
memfile_ftruncate,
|
||||||
|
NULL, /* fpathconf */
|
||||||
|
NULL, /* fsync */
|
||||||
|
IMFS_fdatasync,
|
||||||
|
IMFS_fcntl
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototypes of private routines
|
* Prototypes of private routines
|
||||||
*/
|
*/
|
||||||
|
|||||||
71
cpukit/libfs/src/imfs/miniimfs_init.c
Normal file
71
cpukit/libfs/src/imfs/miniimfs_init.c
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Mini-IMFS Initialization
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1998.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* Copyright assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.OARcorp.com/rtems/license.html.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h> /* for mkdir */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "imfs.h"
|
||||||
|
#include "libio_.h"
|
||||||
|
|
||||||
|
#if defined(IMFS_DEBUG)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* miniIMFS file system operations table
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_filesystem_operations_table miniIMFS_ops = {
|
||||||
|
IMFS_eval_path,
|
||||||
|
IMFS_evaluate_for_make,
|
||||||
|
NULL, /* XXX IMFS_link, */
|
||||||
|
NULL, /* XXX IMFS_unlink, */
|
||||||
|
IMFS_node_type,
|
||||||
|
IMFS_mknod,
|
||||||
|
NULL, /* XXX IMFS_rmnod, */
|
||||||
|
NULL, /* XXX IMFS_chown, */
|
||||||
|
NULL, /* XXX IMFS_freenodinfo, */
|
||||||
|
NULL, /* XXX IMFS_mount, */
|
||||||
|
miniIMFS_initialize,
|
||||||
|
NULL, /* XXX IMFS_unmount, */
|
||||||
|
NULL, /* XXX IMFS_fsunmount, */
|
||||||
|
NULL, /* XXX IMFS_utime, */
|
||||||
|
NULL, /* XXX IMFS_evaluate_link, */
|
||||||
|
NULL, /* XXX IMFS_symlink, */
|
||||||
|
NULL /* XXX IMFS_readlink */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* miniIMFS_initialize
|
||||||
|
*/
|
||||||
|
|
||||||
|
int miniIMFS_initialize(
|
||||||
|
rtems_filesystem_mount_table_entry_t *temp_mt_entry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IMFS_initialize_support(
|
||||||
|
temp_mt_entry,
|
||||||
|
&miniIMFS_ops,
|
||||||
|
&rtems_filesystem_null_handlers, /* for memfiles */
|
||||||
|
&rtems_filesystem_null_handlers /* for directories */
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user