Index: c/src/exec/libcsupport/src/chdir.c
===================================================================
--- c/src/exec/libcsupport/src/chdir.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/chdir.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -39,10 +39,19 @@
    */
 
-  if ( !loc.ops->node_type )
+  if ( !loc.ops->node_type ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
+  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTDIR );
-
+  }
+  
+  if ( rtems_filesystem_current.ops->freenod )
+    (*rtems_filesystem_current.ops->freenod)( &rtems_filesystem_current );
+   
   rtems_filesystem_current = loc;
   
Index: c/src/exec/libcsupport/src/chmod.c
===================================================================
--- c/src/exec/libcsupport/src/chmod.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/chmod.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -29,4 +29,5 @@
   int                              status;
   rtems_filesystem_location_info_t loc;
+  int                              result;
 
   status = rtems_filesystem_evaluate_path( path, 0, &loc, TRUE );
@@ -34,7 +35,15 @@
     return -1;
   
-  if ( !loc.handlers->fchmod )
+  if ( !loc.handlers->fchmod ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*loc.handlers->fchmod)( &loc, mode );
+  result = (*loc.handlers->fchmod)( &loc, mode );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: c/src/exec/libcsupport/src/chown.c
===================================================================
--- c/src/exec/libcsupport/src/chown.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/chown.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -27,12 +27,21 @@
 )
 {
-  rtems_filesystem_location_info_t   temp_loc;
+  rtems_filesystem_location_info_t   loc;
+  int                                result;
 
-  if ( rtems_filesystem_evaluate_path( path, 0x00, &temp_loc, TRUE ) )
+  if ( rtems_filesystem_evaluate_path( path, 0x00, &loc, TRUE ) )
     return -1;
   
-  if ( !temp_loc.ops->chown )
+  if ( !loc.ops->chown ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*temp_loc.ops->chown)( &temp_loc, owner, group );
+  result = (*loc.ops->chown)( &loc, owner, group );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: c/src/exec/libcsupport/src/link.c
===================================================================
--- c/src/exec/libcsupport/src/link.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/link.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -33,4 +33,5 @@
    * Get the node we are linking to.
    */
+
   result = rtems_filesystem_evaluate_path( existing, 0, &existing_loc, TRUE );
   if ( result != 0 )
@@ -43,6 +44,9 @@
   rtems_filesystem_get_start_loc( new, &i, &parent_loc );
   result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
-  if ( result != 0 )
-     set_errno_and_return_minus_one( result );
+  if ( result != 0 ) {
+    if ( existing_loc.ops->freenod )
+      (*existing_loc.ops->freenod)( &parent_loc );
+    set_errno_and_return_minus_one( result );
+  }
 
   /*
@@ -51,11 +55,34 @@
    */
 
-  if ( parent_loc.mt_entry != existing_loc.mt_entry )
+  if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
+    if ( existing_loc.ops->freenod )
+      (*existing_loc.ops->freenod)( &existing_loc );
+
+    if ( parent_loc.ops->freenod )
+      (*parent_loc.ops->freenod)( &parent_loc );
+
     set_errno_and_return_minus_one( EXDEV );
+  }
 
-  if ( !parent_loc.ops->link )
+  if ( !parent_loc.ops->link ) {
+
+    if ( existing_loc.ops->freenod )
+      (*existing_loc.ops->freenod)( &existing_loc );
+
+    if ( parent_loc.ops->freenod )
+      (*parent_loc.ops->freenod)( &parent_loc );
+
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
+  result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
+  
+  if ( existing_loc.ops->freenod )
+    (*existing_loc.ops->freenod)( &existing_loc );
+
+  if ( parent_loc.ops->freenod )
+    (*parent_loc.ops->freenod)( &parent_loc );
+
+  return result;
 }
 
Index: c/src/exec/libcsupport/src/mknod.c
===================================================================
--- c/src/exec/libcsupport/src/mknod.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/mknod.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -53,7 +53,14 @@
     return -1;
 
-  if ( !temp_loc.ops->mknod )
+  if ( !temp_loc.ops->mknod ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
+  result =  (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
+  if ( temp_loc.ops->freenod )
+    (*temp_loc.ops->freenod)( &temp_loc );
+
+  return result;
 }
Index: c/src/exec/libcsupport/src/mount.c
===================================================================
--- c/src/exec/libcsupport/src/mount.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/mount.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -89,11 +89,10 @@
   rtems_filesystem_mount_table_entry_t **mt_entry,
   rtems_filesystem_operations_table    *fs_ops,
-  rtems_filesystem_options_t            fsoptions,
+  rtems_filesystem_options_t            options,
   char                                 *device,
   char                                 *mount_point
 )
 {
-  rtems_filesystem_location_info_t      temp_loc;
-  rtems_filesystem_options_t            options;
+  rtems_filesystem_location_info_t      loc;
   rtems_filesystem_mount_table_entry_t *temp_mt_entry;
 
@@ -113,6 +112,6 @@
    */
 
-  if ( fsoptions != RTEMS_FILESYSTEM_READ_ONLY && 
-       fsoptions != RTEMS_FILESYSTEM_READ_WRITE ) {
+  if ( options != RTEMS_FILESYSTEM_READ_ONLY && 
+       options != RTEMS_FILESYSTEM_READ_WRITE ) {
     errno = EINVAL;
     return -1;
@@ -146,5 +145,5 @@
        mount_point, 
        RTEMS_LIBIO_PERMS_RWX,
-       &temp_loc ,
+       &loc,
        TRUE ) == -1 )
        goto cleanup_and_bail;
@@ -154,5 +153,5 @@
       */
 
-     if ( temp_loc.ops->node_type( &temp_loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
+     if ( loc.ops->node_type( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
        errno = ENOTDIR;
        goto cleanup_and_bail;
@@ -163,5 +162,5 @@
       */
 
-     if ( search_mt_for_mount_point( &temp_loc ) == FOUND ) {
+     if ( search_mt_for_mount_point( &loc ) == FOUND ) {
        errno = EBUSY;
        goto cleanup_and_bail;
@@ -173,8 +172,8 @@
       */
 
-     temp_mt_entry->mt_point_node.node_access = temp_loc.node_access;
-     temp_mt_entry->mt_point_node.handlers = temp_loc.handlers;
-     temp_mt_entry->mt_point_node.ops = temp_loc.ops;
-     temp_mt_entry->mt_point_node.mt_entry = temp_loc.mt_entry;
+     temp_mt_entry->mt_point_node.node_access = loc.node_access;
+     temp_mt_entry->mt_point_node.handlers = loc.handlers;
+     temp_mt_entry->mt_point_node.ops = loc.ops;
+     temp_mt_entry->mt_point_node.mt_entry = loc.mt_entry;
 
      /* 
@@ -183,10 +182,10 @@
       */
 
-     if ( !temp_loc.ops->mount ){
+     if ( !loc.ops->mount ){
        errno = ENOTSUP;
        goto cleanup_and_bail;
      }
 
-     if ( temp_loc.ops->mount( temp_mt_entry ) ) {
+     if ( loc.ops->mount( temp_mt_entry ) ) {
         goto cleanup_and_bail;
      }
@@ -225,4 +224,8 @@
 
   *mt_entry = temp_mt_entry;
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
   return 0;
 
@@ -230,4 +233,8 @@
 
   free( temp_mt_entry );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
   return -1;
 }
Index: c/src/exec/libcsupport/src/open.c
===================================================================
--- c/src/exec/libcsupport/src/open.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/open.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -63,5 +63,5 @@
   rtems_libio_t                      *iop = 0;
   int                                 status;
-  rtems_filesystem_location_info_t    temp_loc;
+  rtems_filesystem_location_info_t    loc;
   int                                 eval_flags;
 
@@ -105,5 +105,5 @@
 
   status = rtems_filesystem_evaluate_path(
-     pathname, eval_flags, &temp_loc, TRUE );
+     pathname, eval_flags, &loc, TRUE );
 
   if ( status == -1 ) {
@@ -127,5 +127,5 @@
 
     /* Sanity check to see if the file name exists after the mknod() */
-    status = rtems_filesystem_evaluate_path( pathname, 0x0, &temp_loc, TRUE );
+    status = rtems_filesystem_evaluate_path( pathname, 0x0, &loc, TRUE );
     if ( status != 0 ) {   /* The file did not exist */
       rc = EACCES;
@@ -140,13 +140,13 @@
 
   /*
-   *  Fill in the file control block based on the temp_loc structure
+   *  Fill in the file control block based on the loc structure
    *  returned by successful path evaluation.
    */
 
   iop->offset     = 0;
-  iop->handlers   = temp_loc.handlers;
-  iop->file_info  = temp_loc.node_access;
+  iop->handlers   = loc.handlers;
+  iop->file_info  = loc.node_access;
   iop->flags     |= rtems_libio_fcntl_flags( flags );
-  iop->pathinfo   = temp_loc;
+  iop->pathinfo   = loc;
 
   if ( !iop->handlers->open ) {
@@ -179,4 +179,8 @@
     set_errno_and_return_minus_one( rc );
   }
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+    
   return iop - rtems_libio_iops;
 }
Index: c/src/exec/libcsupport/src/readlink.c
===================================================================
--- c/src/exec/libcsupport/src/readlink.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/readlink.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -24,20 +24,34 @@
   int                               result;
 
+  if (!buf)
+    set_errno_and_return_minus_one( EFAULT );
+
   result = rtems_filesystem_evaluate_path( pathname, 0, &loc, FALSE );
   if ( result != 0 )
      return -1;
   
-  if (!buf)
-    set_errno_and_return_minus_one( EFAULT );
+  if ( !loc.ops->node_type ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
+    set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if ( !loc.ops->node_type )
+  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
+    set_errno_and_return_minus_one( EINVAL );
+  }
+
+  if ( !loc.ops->readlink ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK )
-    set_errno_and_return_minus_one( EINVAL );
+  result =  (*loc.ops->readlink)( &loc, buf, bufsize );
 
-  if ( !loc.ops->readlink )
-    set_errno_and_return_minus_one( ENOTSUP );
-
-  return (*loc.ops->readlink)( &loc, buf, bufsize );
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: c/src/exec/libcsupport/src/rmdir.c
===================================================================
--- c/src/exec/libcsupport/src/rmdir.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/rmdir.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -40,9 +40,15 @@
    */
 
-  if ( !loc.ops->node_type )
+  if ( !loc.ops->node_type ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
+  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTDIR );
+  }
 
   /*
@@ -50,7 +56,15 @@
    */
 
-  if ( !loc.ops->rmnod )
+  if ( !loc.ops->rmnod ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*loc.ops->rmnod)( &loc );  
+  result =  (*loc.ops->rmnod)( &loc );  
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: c/src/exec/libcsupport/src/stat.c
===================================================================
--- c/src/exec/libcsupport/src/stat.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/stat.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -59,6 +59,9 @@
     return -1;
   
-  if ( !loc.handlers->fstat )
+  if ( !loc.handlers->fstat ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
   /*
@@ -69,5 +72,10 @@
   memset( buf, 0, sizeof(struct stat) );
 
-  return (*loc.handlers->fstat)( &loc, buf );
+  status =  (*loc.handlers->fstat)( &loc, buf );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return status;
 }
 #endif
Index: c/src/exec/libcsupport/src/symlink.c
===================================================================
--- c/src/exec/libcsupport/src/symlink.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/symlink.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -30,5 +30,10 @@
     return -1;
 
-  return (*loc.ops->symlink)( &loc, actualpath, name_start);
+  result = (*loc.ops->symlink)( &loc, actualpath, name_start);
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+
+  return result;
 }
 
Index: c/src/exec/libcsupport/src/unlink.c
===================================================================
--- c/src/exec/libcsupport/src/unlink.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/unlink.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -32,14 +32,28 @@
      return -1;
   
-  if ( !loc.ops->node_type )
+  if ( !loc.ops->node_type ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY )
+  if (  (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( EISDIR );
+  }
+
+  if ( !loc.ops->unlink ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
+    set_errno_and_return_minus_one( ENOTSUP );
+  }
+
+  result = (*loc.ops->unlink)( &loc );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
   
-  if ( !loc.ops->unlink )
-    set_errno_and_return_minus_one( ENOTSUP );
-
-  return (*loc.ops->unlink)( &loc );
+  return result;
 }
 
Index: c/src/exec/libcsupport/src/unmount.c
===================================================================
--- c/src/exec/libcsupport/src/unmount.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/unmount.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -84,6 +84,9 @@
    */
 
-  if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry )
+  if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
     set_errno_and_return_minus_one( EBUSY );
+  }
 
   /*
@@ -93,6 +96,9 @@
    */
 
-  if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 )
+  if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
     set_errno_and_return_minus_one( EBUSY );
+  }
   
   /*
@@ -104,13 +110,19 @@
    */
 
-  if ( ( temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 )
+  if ((temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
+    return -1;
+  }
+
+  /*
+   * Run the unmount function for the subordinate file system.
+   */
+
+  if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
      return -1;
-
-  /*
-   * Run the unmount function for the subordinate file system.
-   */
-
-  if ( ( temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0 )
-     return -1;
+  }
 
   /*
@@ -131,4 +143,6 @@
 
   free( temp_loc.mt_entry );
+  if ( temp_loc.ops->freenod )
+    (*temp_loc.ops->freenod)( &temp_loc );
 
   return result;
Index: c/src/exec/libcsupport/src/utime.c
===================================================================
--- c/src/exec/libcsupport/src/utime.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libcsupport/src/utime.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -25,11 +25,17 @@
 {
   rtems_filesystem_location_info_t   temp_loc;
+  int                                result;
+
+  if ( !temp_loc.ops->utime )
+    set_errno_and_return_minus_one( ENOTSUP );
 
   if ( rtems_filesystem_evaluate_path( path, 0x00, &temp_loc, TRUE ) )
     return -1;
 
-  if ( !temp_loc.ops->utime )
-    set_errno_and_return_minus_one( ENOTSUP );
+  result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
 
-  return (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
+  if ( temp_loc.ops->freenod )
+    (*temp_loc.ops->freenod)( &temp_loc );
+
+  return result;
 }
Index: c/src/exec/libfs/src/imfs/ioman.c
===================================================================
--- c/src/exec/libfs/src/imfs/ioman.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/exec/libfs/src/imfs/ioman.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -62,4 +62,7 @@
  *
  *  This version is not reentrant.
+ *
+ *  XXX - This is dependent upon IMFS and should not be.  
+ *        Suggest adding a filesystem routine to fill in the device_info.
  */
 
@@ -71,13 +74,18 @@
 #if !defined(RTEMS_UNIX)
   IMFS_jnode_t                      *the_jnode;
-  rtems_filesystem_location_info_t   temp_loc;
+  rtems_filesystem_location_info_t   loc;
   static rtems_driver_name_t         device;
   int                                result;
+  rtems_filesystem_node_types_t      node_type;
 
-  result = rtems_filesystem_evaluate_path( name, 0x00, &temp_loc, TRUE );
-  the_jnode = temp_loc.node_access;
+  result = rtems_filesystem_evaluate_path( name, 0x00, &loc, TRUE );
+  the_jnode = loc.node_access;
 
-  if ( (result != 0) || the_jnode->type != IMFS_DEVICE ) {
+  node_type = (*loc.ops->node_type)( &loc );
+
+  if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
     *device_info = 0;
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     return RTEMS_UNSATISFIED;
   }
@@ -88,4 +96,8 @@
   device.minor              = the_jnode->info.device.minor;
   *device_info              = &device;
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+   
 #endif
   return RTEMS_SUCCESSFUL;
Index: c/src/lib/libc/chdir.c
===================================================================
--- c/src/lib/libc/chdir.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/chdir.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -39,10 +39,19 @@
    */
 
-  if ( !loc.ops->node_type )
+  if ( !loc.ops->node_type ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
+  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTDIR );
-
+  }
+  
+  if ( rtems_filesystem_current.ops->freenod )
+    (*rtems_filesystem_current.ops->freenod)( &rtems_filesystem_current );
+   
   rtems_filesystem_current = loc;
   
Index: c/src/lib/libc/chmod.c
===================================================================
--- c/src/lib/libc/chmod.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/chmod.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -29,4 +29,5 @@
   int                              status;
   rtems_filesystem_location_info_t loc;
+  int                              result;
 
   status = rtems_filesystem_evaluate_path( path, 0, &loc, TRUE );
@@ -34,7 +35,15 @@
     return -1;
   
-  if ( !loc.handlers->fchmod )
+  if ( !loc.handlers->fchmod ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*loc.handlers->fchmod)( &loc, mode );
+  result = (*loc.handlers->fchmod)( &loc, mode );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: c/src/lib/libc/chown.c
===================================================================
--- c/src/lib/libc/chown.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/chown.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -27,12 +27,21 @@
 )
 {
-  rtems_filesystem_location_info_t   temp_loc;
+  rtems_filesystem_location_info_t   loc;
+  int                                result;
 
-  if ( rtems_filesystem_evaluate_path( path, 0x00, &temp_loc, TRUE ) )
+  if ( rtems_filesystem_evaluate_path( path, 0x00, &loc, TRUE ) )
     return -1;
   
-  if ( !temp_loc.ops->chown )
+  if ( !loc.ops->chown ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*temp_loc.ops->chown)( &temp_loc, owner, group );
+  result = (*loc.ops->chown)( &loc, owner, group );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: c/src/lib/libc/ioman.c
===================================================================
--- c/src/lib/libc/ioman.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/ioman.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -62,4 +62,7 @@
  *
  *  This version is not reentrant.
+ *
+ *  XXX - This is dependent upon IMFS and should not be.  
+ *        Suggest adding a filesystem routine to fill in the device_info.
  */
 
@@ -71,13 +74,18 @@
 #if !defined(RTEMS_UNIX)
   IMFS_jnode_t                      *the_jnode;
-  rtems_filesystem_location_info_t   temp_loc;
+  rtems_filesystem_location_info_t   loc;
   static rtems_driver_name_t         device;
   int                                result;
+  rtems_filesystem_node_types_t      node_type;
 
-  result = rtems_filesystem_evaluate_path( name, 0x00, &temp_loc, TRUE );
-  the_jnode = temp_loc.node_access;
+  result = rtems_filesystem_evaluate_path( name, 0x00, &loc, TRUE );
+  the_jnode = loc.node_access;
 
-  if ( (result != 0) || the_jnode->type != IMFS_DEVICE ) {
+  node_type = (*loc.ops->node_type)( &loc );
+
+  if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
     *device_info = 0;
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     return RTEMS_UNSATISFIED;
   }
@@ -88,4 +96,8 @@
   device.minor              = the_jnode->info.device.minor;
   *device_info              = &device;
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+   
 #endif
   return RTEMS_SUCCESSFUL;
Index: c/src/lib/libc/link.c
===================================================================
--- c/src/lib/libc/link.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/link.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -33,4 +33,5 @@
    * Get the node we are linking to.
    */
+
   result = rtems_filesystem_evaluate_path( existing, 0, &existing_loc, TRUE );
   if ( result != 0 )
@@ -43,6 +44,9 @@
   rtems_filesystem_get_start_loc( new, &i, &parent_loc );
   result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
-  if ( result != 0 )
-     set_errno_and_return_minus_one( result );
+  if ( result != 0 ) {
+    if ( existing_loc.ops->freenod )
+      (*existing_loc.ops->freenod)( &parent_loc );
+    set_errno_and_return_minus_one( result );
+  }
 
   /*
@@ -51,11 +55,34 @@
    */
 
-  if ( parent_loc.mt_entry != existing_loc.mt_entry )
+  if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
+    if ( existing_loc.ops->freenod )
+      (*existing_loc.ops->freenod)( &existing_loc );
+
+    if ( parent_loc.ops->freenod )
+      (*parent_loc.ops->freenod)( &parent_loc );
+
     set_errno_and_return_minus_one( EXDEV );
+  }
 
-  if ( !parent_loc.ops->link )
+  if ( !parent_loc.ops->link ) {
+
+    if ( existing_loc.ops->freenod )
+      (*existing_loc.ops->freenod)( &existing_loc );
+
+    if ( parent_loc.ops->freenod )
+      (*parent_loc.ops->freenod)( &parent_loc );
+
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
+  result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
+  
+  if ( existing_loc.ops->freenod )
+    (*existing_loc.ops->freenod)( &existing_loc );
+
+  if ( parent_loc.ops->freenod )
+    (*parent_loc.ops->freenod)( &parent_loc );
+
+  return result;
 }
 
Index: c/src/lib/libc/mknod.c
===================================================================
--- c/src/lib/libc/mknod.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/mknod.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -53,7 +53,14 @@
     return -1;
 
-  if ( !temp_loc.ops->mknod )
+  if ( !temp_loc.ops->mknod ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
+  result =  (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
+  if ( temp_loc.ops->freenod )
+    (*temp_loc.ops->freenod)( &temp_loc );
+
+  return result;
 }
Index: c/src/lib/libc/mount.c
===================================================================
--- c/src/lib/libc/mount.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/mount.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -89,11 +89,10 @@
   rtems_filesystem_mount_table_entry_t **mt_entry,
   rtems_filesystem_operations_table    *fs_ops,
-  rtems_filesystem_options_t            fsoptions,
+  rtems_filesystem_options_t            options,
   char                                 *device,
   char                                 *mount_point
 )
 {
-  rtems_filesystem_location_info_t      temp_loc;
-  rtems_filesystem_options_t            options;
+  rtems_filesystem_location_info_t      loc;
   rtems_filesystem_mount_table_entry_t *temp_mt_entry;
 
@@ -113,6 +112,6 @@
    */
 
-  if ( fsoptions != RTEMS_FILESYSTEM_READ_ONLY && 
-       fsoptions != RTEMS_FILESYSTEM_READ_WRITE ) {
+  if ( options != RTEMS_FILESYSTEM_READ_ONLY && 
+       options != RTEMS_FILESYSTEM_READ_WRITE ) {
     errno = EINVAL;
     return -1;
@@ -146,5 +145,5 @@
        mount_point, 
        RTEMS_LIBIO_PERMS_RWX,
-       &temp_loc ,
+       &loc,
        TRUE ) == -1 )
        goto cleanup_and_bail;
@@ -154,5 +153,5 @@
       */
 
-     if ( temp_loc.ops->node_type( &temp_loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
+     if ( loc.ops->node_type( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
        errno = ENOTDIR;
        goto cleanup_and_bail;
@@ -163,5 +162,5 @@
       */
 
-     if ( search_mt_for_mount_point( &temp_loc ) == FOUND ) {
+     if ( search_mt_for_mount_point( &loc ) == FOUND ) {
        errno = EBUSY;
        goto cleanup_and_bail;
@@ -173,8 +172,8 @@
       */
 
-     temp_mt_entry->mt_point_node.node_access = temp_loc.node_access;
-     temp_mt_entry->mt_point_node.handlers = temp_loc.handlers;
-     temp_mt_entry->mt_point_node.ops = temp_loc.ops;
-     temp_mt_entry->mt_point_node.mt_entry = temp_loc.mt_entry;
+     temp_mt_entry->mt_point_node.node_access = loc.node_access;
+     temp_mt_entry->mt_point_node.handlers = loc.handlers;
+     temp_mt_entry->mt_point_node.ops = loc.ops;
+     temp_mt_entry->mt_point_node.mt_entry = loc.mt_entry;
 
      /* 
@@ -183,10 +182,10 @@
       */
 
-     if ( !temp_loc.ops->mount ){
+     if ( !loc.ops->mount ){
        errno = ENOTSUP;
        goto cleanup_and_bail;
      }
 
-     if ( temp_loc.ops->mount( temp_mt_entry ) ) {
+     if ( loc.ops->mount( temp_mt_entry ) ) {
         goto cleanup_and_bail;
      }
@@ -225,4 +224,8 @@
 
   *mt_entry = temp_mt_entry;
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
   return 0;
 
@@ -230,4 +233,8 @@
 
   free( temp_mt_entry );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
   return -1;
 }
Index: c/src/lib/libc/open.c
===================================================================
--- c/src/lib/libc/open.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/open.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -63,5 +63,5 @@
   rtems_libio_t                      *iop = 0;
   int                                 status;
-  rtems_filesystem_location_info_t    temp_loc;
+  rtems_filesystem_location_info_t    loc;
   int                                 eval_flags;
 
@@ -105,5 +105,5 @@
 
   status = rtems_filesystem_evaluate_path(
-     pathname, eval_flags, &temp_loc, TRUE );
+     pathname, eval_flags, &loc, TRUE );
 
   if ( status == -1 ) {
@@ -127,5 +127,5 @@
 
     /* Sanity check to see if the file name exists after the mknod() */
-    status = rtems_filesystem_evaluate_path( pathname, 0x0, &temp_loc, TRUE );
+    status = rtems_filesystem_evaluate_path( pathname, 0x0, &loc, TRUE );
     if ( status != 0 ) {   /* The file did not exist */
       rc = EACCES;
@@ -140,13 +140,13 @@
 
   /*
-   *  Fill in the file control block based on the temp_loc structure
+   *  Fill in the file control block based on the loc structure
    *  returned by successful path evaluation.
    */
 
   iop->offset     = 0;
-  iop->handlers   = temp_loc.handlers;
-  iop->file_info  = temp_loc.node_access;
+  iop->handlers   = loc.handlers;
+  iop->file_info  = loc.node_access;
   iop->flags     |= rtems_libio_fcntl_flags( flags );
-  iop->pathinfo   = temp_loc;
+  iop->pathinfo   = loc;
 
   if ( !iop->handlers->open ) {
@@ -179,4 +179,8 @@
     set_errno_and_return_minus_one( rc );
   }
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+    
   return iop - rtems_libio_iops;
 }
Index: c/src/lib/libc/readlink.c
===================================================================
--- c/src/lib/libc/readlink.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/readlink.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -24,20 +24,34 @@
   int                               result;
 
+  if (!buf)
+    set_errno_and_return_minus_one( EFAULT );
+
   result = rtems_filesystem_evaluate_path( pathname, 0, &loc, FALSE );
   if ( result != 0 )
      return -1;
   
-  if (!buf)
-    set_errno_and_return_minus_one( EFAULT );
+  if ( !loc.ops->node_type ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
+    set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if ( !loc.ops->node_type )
+  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
+    set_errno_and_return_minus_one( EINVAL );
+  }
+
+  if ( !loc.ops->readlink ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK )
-    set_errno_and_return_minus_one( EINVAL );
+  result =  (*loc.ops->readlink)( &loc, buf, bufsize );
 
-  if ( !loc.ops->readlink )
-    set_errno_and_return_minus_one( ENOTSUP );
-
-  return (*loc.ops->readlink)( &loc, buf, bufsize );
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: c/src/lib/libc/rmdir.c
===================================================================
--- c/src/lib/libc/rmdir.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/rmdir.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -40,9 +40,15 @@
    */
 
-  if ( !loc.ops->node_type )
+  if ( !loc.ops->node_type ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
+  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTDIR );
+  }
 
   /*
@@ -50,7 +56,15 @@
    */
 
-  if ( !loc.ops->rmnod )
+  if ( !loc.ops->rmnod ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*loc.ops->rmnod)( &loc );  
+  result =  (*loc.ops->rmnod)( &loc );  
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: c/src/lib/libc/stat.c
===================================================================
--- c/src/lib/libc/stat.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/stat.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -59,6 +59,9 @@
     return -1;
   
-  if ( !loc.handlers->fstat )
+  if ( !loc.handlers->fstat ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
   /*
@@ -69,5 +72,10 @@
   memset( buf, 0, sizeof(struct stat) );
 
-  return (*loc.handlers->fstat)( &loc, buf );
+  status =  (*loc.handlers->fstat)( &loc, buf );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return status;
 }
 #endif
Index: c/src/lib/libc/symlink.c
===================================================================
--- c/src/lib/libc/symlink.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/symlink.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -30,5 +30,10 @@
     return -1;
 
-  return (*loc.ops->symlink)( &loc, actualpath, name_start);
+  result = (*loc.ops->symlink)( &loc, actualpath, name_start);
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+
+  return result;
 }
 
Index: c/src/lib/libc/unlink.c
===================================================================
--- c/src/lib/libc/unlink.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/unlink.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -32,14 +32,28 @@
      return -1;
   
-  if ( !loc.ops->node_type )
+  if ( !loc.ops->node_type ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY )
+  if (  (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( EISDIR );
+  }
+
+  if ( !loc.ops->unlink ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
+    set_errno_and_return_minus_one( ENOTSUP );
+  }
+
+  result = (*loc.ops->unlink)( &loc );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
   
-  if ( !loc.ops->unlink )
-    set_errno_and_return_minus_one( ENOTSUP );
-
-  return (*loc.ops->unlink)( &loc );
+  return result;
 }
 
Index: c/src/lib/libc/unmount.c
===================================================================
--- c/src/lib/libc/unmount.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/unmount.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -84,6 +84,9 @@
    */
 
-  if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry )
+  if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
     set_errno_and_return_minus_one( EBUSY );
+  }
 
   /*
@@ -93,6 +96,9 @@
    */
 
-  if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 )
+  if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
     set_errno_and_return_minus_one( EBUSY );
+  }
   
   /*
@@ -104,13 +110,19 @@
    */
 
-  if ( ( temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 )
+  if ((temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
+    return -1;
+  }
+
+  /*
+   * Run the unmount function for the subordinate file system.
+   */
+
+  if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
      return -1;
-
-  /*
-   * Run the unmount function for the subordinate file system.
-   */
-
-  if ( ( temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0 )
-     return -1;
+  }
 
   /*
@@ -131,4 +143,6 @@
 
   free( temp_loc.mt_entry );
+  if ( temp_loc.ops->freenod )
+    (*temp_loc.ops->freenod)( &temp_loc );
 
   return result;
Index: c/src/lib/libc/utime.c
===================================================================
--- c/src/lib/libc/utime.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/lib/libc/utime.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -25,11 +25,17 @@
 {
   rtems_filesystem_location_info_t   temp_loc;
+  int                                result;
+
+  if ( !temp_loc.ops->utime )
+    set_errno_and_return_minus_one( ENOTSUP );
 
   if ( rtems_filesystem_evaluate_path( path, 0x00, &temp_loc, TRUE ) )
     return -1;
 
-  if ( !temp_loc.ops->utime )
-    set_errno_and_return_minus_one( ENOTSUP );
+  result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
 
-  return (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
+  if ( temp_loc.ops->freenod )
+    (*temp_loc.ops->freenod)( &temp_loc );
+
+  return result;
 }
Index: c/src/libfs/src/imfs/ioman.c
===================================================================
--- c/src/libfs/src/imfs/ioman.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ c/src/libfs/src/imfs/ioman.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -62,4 +62,7 @@
  *
  *  This version is not reentrant.
+ *
+ *  XXX - This is dependent upon IMFS and should not be.  
+ *        Suggest adding a filesystem routine to fill in the device_info.
  */
 
@@ -71,13 +74,18 @@
 #if !defined(RTEMS_UNIX)
   IMFS_jnode_t                      *the_jnode;
-  rtems_filesystem_location_info_t   temp_loc;
+  rtems_filesystem_location_info_t   loc;
   static rtems_driver_name_t         device;
   int                                result;
+  rtems_filesystem_node_types_t      node_type;
 
-  result = rtems_filesystem_evaluate_path( name, 0x00, &temp_loc, TRUE );
-  the_jnode = temp_loc.node_access;
+  result = rtems_filesystem_evaluate_path( name, 0x00, &loc, TRUE );
+  the_jnode = loc.node_access;
 
-  if ( (result != 0) || the_jnode->type != IMFS_DEVICE ) {
+  node_type = (*loc.ops->node_type)( &loc );
+
+  if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
     *device_info = 0;
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     return RTEMS_UNSATISFIED;
   }
@@ -88,4 +96,8 @@
   device.minor              = the_jnode->info.device.minor;
   *device_info              = &device;
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+   
 #endif
   return RTEMS_SUCCESSFUL;
Index: cpukit/libcsupport/src/chdir.c
===================================================================
--- cpukit/libcsupport/src/chdir.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/chdir.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -39,10 +39,19 @@
    */
 
-  if ( !loc.ops->node_type )
+  if ( !loc.ops->node_type ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
+  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTDIR );
-
+  }
+  
+  if ( rtems_filesystem_current.ops->freenod )
+    (*rtems_filesystem_current.ops->freenod)( &rtems_filesystem_current );
+   
   rtems_filesystem_current = loc;
   
Index: cpukit/libcsupport/src/chmod.c
===================================================================
--- cpukit/libcsupport/src/chmod.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/chmod.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -29,4 +29,5 @@
   int                              status;
   rtems_filesystem_location_info_t loc;
+  int                              result;
 
   status = rtems_filesystem_evaluate_path( path, 0, &loc, TRUE );
@@ -34,7 +35,15 @@
     return -1;
   
-  if ( !loc.handlers->fchmod )
+  if ( !loc.handlers->fchmod ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*loc.handlers->fchmod)( &loc, mode );
+  result = (*loc.handlers->fchmod)( &loc, mode );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: cpukit/libcsupport/src/chown.c
===================================================================
--- cpukit/libcsupport/src/chown.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/chown.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -27,12 +27,21 @@
 )
 {
-  rtems_filesystem_location_info_t   temp_loc;
+  rtems_filesystem_location_info_t   loc;
+  int                                result;
 
-  if ( rtems_filesystem_evaluate_path( path, 0x00, &temp_loc, TRUE ) )
+  if ( rtems_filesystem_evaluate_path( path, 0x00, &loc, TRUE ) )
     return -1;
   
-  if ( !temp_loc.ops->chown )
+  if ( !loc.ops->chown ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*temp_loc.ops->chown)( &temp_loc, owner, group );
+  result = (*loc.ops->chown)( &loc, owner, group );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: cpukit/libcsupport/src/link.c
===================================================================
--- cpukit/libcsupport/src/link.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/link.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -33,4 +33,5 @@
    * Get the node we are linking to.
    */
+
   result = rtems_filesystem_evaluate_path( existing, 0, &existing_loc, TRUE );
   if ( result != 0 )
@@ -43,6 +44,9 @@
   rtems_filesystem_get_start_loc( new, &i, &parent_loc );
   result = (*parent_loc.ops->evalformake)( &new[i], &parent_loc, &name_start );
-  if ( result != 0 )
-     set_errno_and_return_minus_one( result );
+  if ( result != 0 ) {
+    if ( existing_loc.ops->freenod )
+      (*existing_loc.ops->freenod)( &parent_loc );
+    set_errno_and_return_minus_one( result );
+  }
 
   /*
@@ -51,11 +55,34 @@
    */
 
-  if ( parent_loc.mt_entry != existing_loc.mt_entry )
+  if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
+    if ( existing_loc.ops->freenod )
+      (*existing_loc.ops->freenod)( &existing_loc );
+
+    if ( parent_loc.ops->freenod )
+      (*parent_loc.ops->freenod)( &parent_loc );
+
     set_errno_and_return_minus_one( EXDEV );
+  }
 
-  if ( !parent_loc.ops->link )
+  if ( !parent_loc.ops->link ) {
+
+    if ( existing_loc.ops->freenod )
+      (*existing_loc.ops->freenod)( &existing_loc );
+
+    if ( parent_loc.ops->freenod )
+      (*parent_loc.ops->freenod)( &parent_loc );
+
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
+  result = (*parent_loc.ops->link)( &existing_loc, &parent_loc, name_start );
+  
+  if ( existing_loc.ops->freenod )
+    (*existing_loc.ops->freenod)( &existing_loc );
+
+  if ( parent_loc.ops->freenod )
+    (*parent_loc.ops->freenod)( &parent_loc );
+
+  return result;
 }
 
Index: cpukit/libcsupport/src/mknod.c
===================================================================
--- cpukit/libcsupport/src/mknod.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/mknod.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -53,7 +53,14 @@
     return -1;
 
-  if ( !temp_loc.ops->mknod )
+  if ( !temp_loc.ops->mknod ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
+  result =  (*temp_loc.ops->mknod)( name_start, mode, dev, &temp_loc );
+  if ( temp_loc.ops->freenod )
+    (*temp_loc.ops->freenod)( &temp_loc );
+
+  return result;
 }
Index: cpukit/libcsupport/src/mount.c
===================================================================
--- cpukit/libcsupport/src/mount.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/mount.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -89,11 +89,10 @@
   rtems_filesystem_mount_table_entry_t **mt_entry,
   rtems_filesystem_operations_table    *fs_ops,
-  rtems_filesystem_options_t            fsoptions,
+  rtems_filesystem_options_t            options,
   char                                 *device,
   char                                 *mount_point
 )
 {
-  rtems_filesystem_location_info_t      temp_loc;
-  rtems_filesystem_options_t            options;
+  rtems_filesystem_location_info_t      loc;
   rtems_filesystem_mount_table_entry_t *temp_mt_entry;
 
@@ -113,6 +112,6 @@
    */
 
-  if ( fsoptions != RTEMS_FILESYSTEM_READ_ONLY && 
-       fsoptions != RTEMS_FILESYSTEM_READ_WRITE ) {
+  if ( options != RTEMS_FILESYSTEM_READ_ONLY && 
+       options != RTEMS_FILESYSTEM_READ_WRITE ) {
     errno = EINVAL;
     return -1;
@@ -146,5 +145,5 @@
        mount_point, 
        RTEMS_LIBIO_PERMS_RWX,
-       &temp_loc ,
+       &loc,
        TRUE ) == -1 )
        goto cleanup_and_bail;
@@ -154,5 +153,5 @@
       */
 
-     if ( temp_loc.ops->node_type( &temp_loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
+     if ( loc.ops->node_type( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
        errno = ENOTDIR;
        goto cleanup_and_bail;
@@ -163,5 +162,5 @@
       */
 
-     if ( search_mt_for_mount_point( &temp_loc ) == FOUND ) {
+     if ( search_mt_for_mount_point( &loc ) == FOUND ) {
        errno = EBUSY;
        goto cleanup_and_bail;
@@ -173,8 +172,8 @@
       */
 
-     temp_mt_entry->mt_point_node.node_access = temp_loc.node_access;
-     temp_mt_entry->mt_point_node.handlers = temp_loc.handlers;
-     temp_mt_entry->mt_point_node.ops = temp_loc.ops;
-     temp_mt_entry->mt_point_node.mt_entry = temp_loc.mt_entry;
+     temp_mt_entry->mt_point_node.node_access = loc.node_access;
+     temp_mt_entry->mt_point_node.handlers = loc.handlers;
+     temp_mt_entry->mt_point_node.ops = loc.ops;
+     temp_mt_entry->mt_point_node.mt_entry = loc.mt_entry;
 
      /* 
@@ -183,10 +182,10 @@
       */
 
-     if ( !temp_loc.ops->mount ){
+     if ( !loc.ops->mount ){
        errno = ENOTSUP;
        goto cleanup_and_bail;
      }
 
-     if ( temp_loc.ops->mount( temp_mt_entry ) ) {
+     if ( loc.ops->mount( temp_mt_entry ) ) {
         goto cleanup_and_bail;
      }
@@ -225,4 +224,8 @@
 
   *mt_entry = temp_mt_entry;
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
   return 0;
 
@@ -230,4 +233,8 @@
 
   free( temp_mt_entry );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
   return -1;
 }
Index: cpukit/libcsupport/src/open.c
===================================================================
--- cpukit/libcsupport/src/open.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/open.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -63,5 +63,5 @@
   rtems_libio_t                      *iop = 0;
   int                                 status;
-  rtems_filesystem_location_info_t    temp_loc;
+  rtems_filesystem_location_info_t    loc;
   int                                 eval_flags;
 
@@ -105,5 +105,5 @@
 
   status = rtems_filesystem_evaluate_path(
-     pathname, eval_flags, &temp_loc, TRUE );
+     pathname, eval_flags, &loc, TRUE );
 
   if ( status == -1 ) {
@@ -127,5 +127,5 @@
 
     /* Sanity check to see if the file name exists after the mknod() */
-    status = rtems_filesystem_evaluate_path( pathname, 0x0, &temp_loc, TRUE );
+    status = rtems_filesystem_evaluate_path( pathname, 0x0, &loc, TRUE );
     if ( status != 0 ) {   /* The file did not exist */
       rc = EACCES;
@@ -140,13 +140,13 @@
 
   /*
-   *  Fill in the file control block based on the temp_loc structure
+   *  Fill in the file control block based on the loc structure
    *  returned by successful path evaluation.
    */
 
   iop->offset     = 0;
-  iop->handlers   = temp_loc.handlers;
-  iop->file_info  = temp_loc.node_access;
+  iop->handlers   = loc.handlers;
+  iop->file_info  = loc.node_access;
   iop->flags     |= rtems_libio_fcntl_flags( flags );
-  iop->pathinfo   = temp_loc;
+  iop->pathinfo   = loc;
 
   if ( !iop->handlers->open ) {
@@ -179,4 +179,8 @@
     set_errno_and_return_minus_one( rc );
   }
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+    
   return iop - rtems_libio_iops;
 }
Index: cpukit/libcsupport/src/readlink.c
===================================================================
--- cpukit/libcsupport/src/readlink.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/readlink.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -24,20 +24,34 @@
   int                               result;
 
+  if (!buf)
+    set_errno_and_return_minus_one( EFAULT );
+
   result = rtems_filesystem_evaluate_path( pathname, 0, &loc, FALSE );
   if ( result != 0 )
      return -1;
   
-  if (!buf)
-    set_errno_and_return_minus_one( EFAULT );
+  if ( !loc.ops->node_type ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
+    set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if ( !loc.ops->node_type )
+  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
+    set_errno_and_return_minus_one( EINVAL );
+  }
+
+  if ( !loc.ops->readlink ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK )
-    set_errno_and_return_minus_one( EINVAL );
+  result =  (*loc.ops->readlink)( &loc, buf, bufsize );
 
-  if ( !loc.ops->readlink )
-    set_errno_and_return_minus_one( ENOTSUP );
-
-  return (*loc.ops->readlink)( &loc, buf, bufsize );
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: cpukit/libcsupport/src/rmdir.c
===================================================================
--- cpukit/libcsupport/src/rmdir.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/rmdir.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -40,9 +40,15 @@
    */
 
-  if ( !loc.ops->node_type )
+  if ( !loc.ops->node_type ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
+  if (  (*loc.ops->node_type)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTDIR );
+  }
 
   /*
@@ -50,7 +56,15 @@
    */
 
-  if ( !loc.ops->rmnod )
+  if ( !loc.ops->rmnod ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  return (*loc.ops->rmnod)( &loc );  
+  result =  (*loc.ops->rmnod)( &loc );  
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return result;
 }
Index: cpukit/libcsupport/src/stat.c
===================================================================
--- cpukit/libcsupport/src/stat.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/stat.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -59,6 +59,9 @@
     return -1;
   
-  if ( !loc.handlers->fstat )
+  if ( !loc.handlers->fstat ){
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
   /*
@@ -69,5 +72,10 @@
   memset( buf, 0, sizeof(struct stat) );
 
-  return (*loc.handlers->fstat)( &loc, buf );
+  status =  (*loc.handlers->fstat)( &loc, buf );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+  
+  return status;
 }
 #endif
Index: cpukit/libcsupport/src/symlink.c
===================================================================
--- cpukit/libcsupport/src/symlink.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/symlink.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -30,5 +30,10 @@
     return -1;
 
-  return (*loc.ops->symlink)( &loc, actualpath, name_start);
+  result = (*loc.ops->symlink)( &loc, actualpath, name_start);
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+
+  return result;
 }
 
Index: cpukit/libcsupport/src/unlink.c
===================================================================
--- cpukit/libcsupport/src/unlink.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/unlink.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -32,14 +32,28 @@
      return -1;
   
-  if ( !loc.ops->node_type )
+  if ( !loc.ops->node_type ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( ENOTSUP );
+  }
 
-  if (  (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY )
+  if (  (*loc.ops->node_type)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     set_errno_and_return_minus_one( EISDIR );
+  }
+
+  if ( !loc.ops->unlink ) {
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
+    set_errno_and_return_minus_one( ENOTSUP );
+  }
+
+  result = (*loc.ops->unlink)( &loc );
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
   
-  if ( !loc.ops->unlink )
-    set_errno_and_return_minus_one( ENOTSUP );
-
-  return (*loc.ops->unlink)( &loc );
+  return result;
 }
 
Index: cpukit/libcsupport/src/unmount.c
===================================================================
--- cpukit/libcsupport/src/unmount.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/unmount.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -84,6 +84,9 @@
    */
 
-  if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry )
+  if ( rtems_filesystem_current.mt_entry == temp_loc.mt_entry ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
     set_errno_and_return_minus_one( EBUSY );
+  }
 
   /*
@@ -93,6 +96,9 @@
    */
 
-  if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 )
+  if ( rtems_libio_is_open_files_in_fs( temp_loc.mt_entry ) == 1 ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
     set_errno_and_return_minus_one( EBUSY );
+  }
   
   /*
@@ -104,13 +110,19 @@
    */
 
-  if ( ( temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 )
+  if ((temp_mt_entry.mt_point_node.ops->unmount )( temp_loc.mt_entry ) != 0 ) {
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
+    return -1;
+  }
+
+  /*
+   * Run the unmount function for the subordinate file system.
+   */
+
+  if ((temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0){
+    if ( temp_loc.ops->freenod )
+      (*temp_loc.ops->freenod)( &temp_loc );
      return -1;
-
-  /*
-   * Run the unmount function for the subordinate file system.
-   */
-
-  if ( ( temp_mt_entry.mt_fs_root.ops->fsunmount_me )( temp_loc.mt_entry ) != 0 )
-     return -1;
+  }
 
   /*
@@ -131,4 +143,6 @@
 
   free( temp_loc.mt_entry );
+  if ( temp_loc.ops->freenod )
+    (*temp_loc.ops->freenod)( &temp_loc );
 
   return result;
Index: cpukit/libcsupport/src/utime.c
===================================================================
--- cpukit/libcsupport/src/utime.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libcsupport/src/utime.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -25,11 +25,17 @@
 {
   rtems_filesystem_location_info_t   temp_loc;
+  int                                result;
+
+  if ( !temp_loc.ops->utime )
+    set_errno_and_return_minus_one( ENOTSUP );
 
   if ( rtems_filesystem_evaluate_path( path, 0x00, &temp_loc, TRUE ) )
     return -1;
 
-  if ( !temp_loc.ops->utime )
-    set_errno_and_return_minus_one( ENOTSUP );
+  result = (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
 
-  return (*temp_loc.ops->utime)( &temp_loc, times->actime, times->modtime );
+  if ( temp_loc.ops->freenod )
+    (*temp_loc.ops->freenod)( &temp_loc );
+
+  return result;
 }
Index: cpukit/libfs/src/imfs/ioman.c
===================================================================
--- cpukit/libfs/src/imfs/ioman.c	(revision cb5056b38701d18309e35216f5bfc15a9bdeb90d)
+++ cpukit/libfs/src/imfs/ioman.c	(revision d71fcabaa6bc42e82d83060da49abff2b41ee272)
@@ -62,4 +62,7 @@
  *
  *  This version is not reentrant.
+ *
+ *  XXX - This is dependent upon IMFS and should not be.  
+ *        Suggest adding a filesystem routine to fill in the device_info.
  */
 
@@ -71,13 +74,18 @@
 #if !defined(RTEMS_UNIX)
   IMFS_jnode_t                      *the_jnode;
-  rtems_filesystem_location_info_t   temp_loc;
+  rtems_filesystem_location_info_t   loc;
   static rtems_driver_name_t         device;
   int                                result;
+  rtems_filesystem_node_types_t      node_type;
 
-  result = rtems_filesystem_evaluate_path( name, 0x00, &temp_loc, TRUE );
-  the_jnode = temp_loc.node_access;
+  result = rtems_filesystem_evaluate_path( name, 0x00, &loc, TRUE );
+  the_jnode = loc.node_access;
 
-  if ( (result != 0) || the_jnode->type != IMFS_DEVICE ) {
+  node_type = (*loc.ops->node_type)( &loc );
+
+  if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
     *device_info = 0;
+    if ( loc.ops->freenod )
+      (*loc.ops->freenod)( &loc );
     return RTEMS_UNSATISFIED;
   }
@@ -88,4 +96,8 @@
   device.minor              = the_jnode->info.device.minor;
   *device_info              = &device;
+
+  if ( loc.ops->freenod )
+    (*loc.ops->freenod)( &loc );
+   
 #endif
   return RTEMS_SUCCESSFUL;
