示例#1
0
int IMFS_initialize_support(
  rtems_filesystem_mount_table_entry_t *mt_entry,
  const void                           *data
)
{
  const IMFS_mount_data *mount_data = data;
  IMFS_fs_info_t *fs_info = mount_data->fs_info;
  IMFS_jnode_t *root_node;

  fs_info->mknod_controls = mount_data->mknod_controls;

  root_node = IMFS_initialize_node(
    &fs_info->Root_directory.Node,
    &fs_info->mknod_controls->directory->node_control,
    "",
    0,
    (S_IFDIR | 0755),
    NULL
  );
  IMFS_assert( root_node != NULL );

  mt_entry->fs_info = fs_info;
  mt_entry->ops = mount_data->ops;
  mt_entry->pathconf_limits_and_options = &IMFS_LIMITS_AND_OPTIONS;
  mt_entry->mt_fs_root->location.node_access = root_node;
  IMFS_Set_handlers( &mt_entry->mt_fs_root->location );

  IMFS_determine_bytes_per_block(
    &imfs_memfile_bytes_per_block,
    imfs_rq_memfile_bytes_per_block,
    IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
  );

  return 0;
}
/*
 *  IMFS_initialize
 */
int IMFS_initialize_support(
  epos_filesystem_mount_table_entry_t        *temp_mt_entry,
   const epos_filesystem_operations_table    *op_table,
   const epos_filesystem_file_handlers_r     *memfile_handlers,
   const epos_filesystem_file_handlers_r     *directory_handlers
)
{
  static int                             imfs_instance;
  IMFS_fs_info_t                        *fs_info;
  IMFS_jnode_t                          *jnode;

  /*
   * determine/check value for imfs_memfile_bytes_per_block
   */
  IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block,
				 imfs_rq_memfile_bytes_per_block,
				 IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK);
   
  /*
   *  Create the root node
   *
   *  NOTE: UNIX root is 755 and owned by root/root (0/0).
   */
  temp_mt_entry->mt_fs_root.node_access      = IMFS_create_root_node();
  temp_mt_entry->mt_fs_root.handlers         = directory_handlers;
  temp_mt_entry->mt_fs_root.ops              = op_table;
  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);
    epos_set_errno_and_return_minus_one(ENOMEM);
  }
  temp_mt_entry->fs_info = fs_info;

  /*
   * Set st_ino for the root to 1.
   */

  fs_info->instance              = imfs_instance++;
  fs_info->ino_count             = 1;
  fs_info->memfile_handlers      = memfile_handlers;
  fs_info->directory_handlers    = directory_handlers;

  jnode = temp_mt_entry->mt_fs_root.node_access;
  jnode->st_ino = fs_info->ino_count;

  /* Initialize POSIX FIFO/pipe module */
  epos_pipe_initialize();

  return 0;
}
示例#3
0
int IMFS_initialize_support(
  rtems_filesystem_mount_table_entry_t *mt_entry,
  const rtems_filesystem_operations_table *op_table,
  const IMFS_node_control *const node_controls [IMFS_TYPE_COUNT]
)
{
  static int imfs_instance;

  int rv = 0;
  IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );

  if ( fs_info != NULL ) {
    IMFS_jnode_t *root_node;

    fs_info->instance = imfs_instance++;
    memcpy(
      fs_info->node_controls,
      node_controls,
      sizeof( fs_info->node_controls )
    );

    root_node = IMFS_allocate_node(
      fs_info,
      fs_info->node_controls [IMFS_DIRECTORY],
      "",
      0,
      (S_IFDIR | 0755),
      NULL
    );
    if ( root_node != NULL ) {
      mt_entry->fs_info = fs_info;
      mt_entry->ops = op_table;
      mt_entry->pathconf_limits_and_options = &IMFS_LIMITS_AND_OPTIONS;
      mt_entry->mt_fs_root->location.node_access = root_node;
      IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
    } else {
      errno = ENOMEM;
      rv = -1;
    }
  } else {
    errno = ENOMEM;
    rv = -1;
  }

  if ( rv == 0 ) {
    IMFS_determine_bytes_per_block(
      &imfs_memfile_bytes_per_block,
      imfs_rq_memfile_bytes_per_block,
      IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
    );
  }

  return rv;
}