diff --git a/cpukit/libcsupport/src/rmdir.c b/cpukit/libcsupport/src/rmdir.c index 4e7baf5e39..f2bc16e516 100644 --- a/cpukit/libcsupport/src/rmdir.c +++ b/cpukit/libcsupport/src/rmdir.c @@ -38,7 +38,12 @@ int rmdir( const char *path ) rtems_filesystem_node_types_t type = (*ops->node_type_h)( currentloc ); if ( type == RTEMS_FILESYSTEM_DIRECTORY ) { - rv = (*ops->rmnod_h)( &parentloc, currentloc ); + if ( !rtems_filesystem_location_is_root( currentloc ) ) { + rv = (*ops->rmnod_h)( &parentloc, currentloc ); + } else { + rtems_filesystem_eval_path_error( &ctx, EBUSY ); + rv = -1; + } } else { rtems_filesystem_eval_path_error( &ctx, ENOTDIR ); rv = -1; diff --git a/cpukit/libcsupport/src/unlink.c b/cpukit/libcsupport/src/unlink.c index 9817ad9611..2a3b1c75a8 100644 --- a/cpukit/libcsupport/src/unlink.c +++ b/cpukit/libcsupport/src/unlink.c @@ -34,9 +34,15 @@ int unlink( const char *path ) &parentloc, parent_eval_flags ); - const rtems_filesystem_operations_table *ops = currentloc->mt_entry->ops; - rv = (*ops->rmnod_h)( &parentloc, currentloc ); + if ( !rtems_filesystem_location_is_root( currentloc ) ) { + const rtems_filesystem_operations_table *ops = currentloc->mt_entry->ops; + + rv = (*ops->rmnod_h)( &parentloc, currentloc ); + } else { + rtems_filesystem_eval_path_error( &ctx, EBUSY ); + rv = -1; + } rtems_filesystem_eval_path_cleanup_with_parent( &ctx, &parentloc ); diff --git a/cpukit/libfs/src/dosfs/msdos_rmnod.c b/cpukit/libfs/src/dosfs/msdos_rmnod.c index db08352600..099b9287e5 100644 --- a/cpukit/libfs/src/dosfs/msdos_rmnod.c +++ b/cpukit/libfs/src/dosfs/msdos_rmnod.c @@ -50,14 +50,6 @@ msdos_rmnod(const rtems_filesystem_location_info_t *parent_pathloc, rtems_set_errno_and_return_minus_one(EBUSY); } - /* - * You cannot remove the file system root node. - */ - if (rtems_filesystem_location_is_root(pathloc)) - { - rtems_set_errno_and_return_minus_one(EBUSY); - } - /* * You cannot remove a mountpoint. * not used - mount() not implemenetd yet. diff --git a/cpukit/libfs/src/imfs/imfs.h b/cpukit/libfs/src/imfs/imfs.h index 7c0cbe5931..aed00778e7 100644 --- a/cpukit/libfs/src/imfs/imfs.h +++ b/cpukit/libfs/src/imfs/imfs.h @@ -169,13 +169,11 @@ IMFS_jnode_t *IMFS_node_initialize_generic( ); typedef IMFS_jnode_t *(*IMFS_node_control_remove)( - IMFS_jnode_t *node, - const IMFS_jnode_t *root_node + IMFS_jnode_t *node ); IMFS_jnode_t *IMFS_node_remove_default( - IMFS_jnode_t *node, - const IMFS_jnode_t *root_node + IMFS_jnode_t *node ); typedef IMFS_jnode_t *(*IMFS_node_control_destroy)( IMFS_jnode_t *node ); diff --git a/cpukit/libfs/src/imfs/imfs_handlers_directory.c b/cpukit/libfs/src/imfs/imfs_handlers_directory.c index 0663e7a206..9dcdcf2a90 100644 --- a/cpukit/libfs/src/imfs/imfs_handlers_directory.c +++ b/cpukit/libfs/src/imfs/imfs_handlers_directory.c @@ -74,14 +74,13 @@ static bool IMFS_is_mount_point( const IMFS_jnode_t *node ) } static IMFS_jnode_t *IMFS_node_remove_directory( - IMFS_jnode_t *node, - const IMFS_jnode_t *root_node + IMFS_jnode_t *node ) { if ( !rtems_chain_is_empty( &node->info.directory.Entries ) ) { errno = ENOTEMPTY; node = NULL; - } else if ( node == root_node || IMFS_is_mount_point( node ) ) { + } else if ( IMFS_is_mount_point( node ) ) { errno = EBUSY; node = NULL; } diff --git a/cpukit/libfs/src/imfs/imfs_handlers_link.c b/cpukit/libfs/src/imfs/imfs_handlers_link.c index baf58313c8..2c4ad3f66f 100644 --- a/cpukit/libfs/src/imfs/imfs_handlers_link.c +++ b/cpukit/libfs/src/imfs/imfs_handlers_link.c @@ -64,14 +64,13 @@ static IMFS_jnode_t *IMFS_node_initialize_hard_link( } static IMFS_jnode_t *IMFS_node_remove_hard_link( - IMFS_jnode_t *node, - const IMFS_jnode_t *root_node + IMFS_jnode_t *node ) { IMFS_jnode_t *target = node->info.hard_link.link_node; if ( target->st_nlink == 1) { - target = (*target->control->node_remove)( target, root_node ); + target = (*target->control->node_remove)( target ); if ( target == NULL ) { node = NULL; } diff --git a/cpukit/libfs/src/imfs/imfs_initsupp.c b/cpukit/libfs/src/imfs/imfs_initsupp.c index 26152d8d3d..3bb8a979fc 100644 --- a/cpukit/libfs/src/imfs/imfs_initsupp.c +++ b/cpukit/libfs/src/imfs/imfs_initsupp.c @@ -141,8 +141,7 @@ IMFS_jnode_t *IMFS_node_initialize_default( } IMFS_jnode_t *IMFS_node_remove_default( - IMFS_jnode_t *node, - const IMFS_jnode_t *root_node + IMFS_jnode_t *node ) { return node; diff --git a/cpukit/libfs/src/imfs/imfs_rmnod.c b/cpukit/libfs/src/imfs/imfs_rmnod.c index a0fa1d654c..90e61d9ee9 100644 --- a/cpukit/libfs/src/imfs/imfs_rmnod.c +++ b/cpukit/libfs/src/imfs/imfs_rmnod.c @@ -29,10 +29,7 @@ int IMFS_rmnod( int rv = 0; IMFS_jnode_t *node = loc->node_access; - node = (*node->control->node_remove)( - node, - loc->mt_entry->mt_fs_root->location.node_access - ); + node = (*node->control->node_remove)( node ); if ( node != NULL ) { --node->reference_count; --node->st_nlink; diff --git a/cpukit/libfs/src/rfs/rtems-rfs-rtems.c b/cpukit/libfs/src/rfs/rtems-rfs-rtems.c index ba6c9056e6..6ff9793911 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-rtems.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-rtems.c @@ -678,9 +678,6 @@ rtems_rfs_rtems_rmnod (const rtems_filesystem_location_info_t* parent_pathloc, printf ("rtems-rfs: rmnod: parent:%" PRId32 " doff:%" PRIu32 ", ino:%" PRId32 "\n", parent, doff, ino); - if (ino == RTEMS_RFS_ROOT_INO) - return rtems_rfs_rtems_error ("rmnod: root inode", EBUSY); - rc = rtems_rfs_unlink (fs, parent, ino, doff, rtems_rfs_unlink_dir_if_empty); if (rc) { diff --git a/testsuites/fstests/fsimfsgeneric01/init.c b/testsuites/fstests/fsimfsgeneric01/init.c index 9fd4bad43a..1a25dec661 100644 --- a/testsuites/fstests/fsimfsgeneric01/init.c +++ b/testsuites/fstests/fsimfsgeneric01/init.c @@ -233,10 +233,7 @@ static IMFS_jnode_t *node_initialize( return node; } -static IMFS_jnode_t *node_remove( - IMFS_jnode_t *node, - const IMFS_jnode_t *root_node -) +static IMFS_jnode_t *node_remove(IMFS_jnode_t *node) { test_state *state = IMFS_generic_get_context_by_node(node);