Esempio n. 1
0
rtems_status_code
rtems_disk_delete(dev_t dev)
{
  rtems_status_code sc = RTEMS_SUCCESSFUL;
  rtems_disk_device *dd = NULL;

  sc = disk_lock();
  if (sc != RTEMS_SUCCESSFUL) {
    return sc;
  }

  dd = get_disk_entry(dev, true);
  if (dd == NULL) {
    disk_unlock();

    return RTEMS_INVALID_ID;
  }

  dd->deleted = true;
  rtems_disk_cleanup(dd);

  disk_unlock();

  return RTEMS_SUCCESSFUL;
}
Esempio n. 2
0
rtems_status_code rtems_disk_create_log(
  dev_t dev,
  dev_t phys,
  rtems_blkdev_bnum begin_block,
  rtems_blkdev_bnum block_count,
  const char *name
)
{
  rtems_status_code sc = RTEMS_SUCCESSFUL;
  rtems_disk_device *physical_disk = NULL;
  rtems_disk_device *dd = NULL;
  rtems_blkdev_bnum end_block = begin_block + block_count;

  sc = disk_lock();
  if (sc != RTEMS_SUCCESSFUL) {
    return sc;
  }

  physical_disk = get_disk_entry(phys, true);
  if (physical_disk == NULL || !is_physical_disk(physical_disk)) {
    disk_unlock();

    return RTEMS_INVALID_ID;
  }

  if (
    begin_block >= physical_disk->size
      || end_block <= begin_block
      || end_block > physical_disk->size
  ) {
    disk_unlock();

    return RTEMS_INVALID_NUMBER;
  }

  sc = create_disk(dev, name, &dd);
  if (sc != RTEMS_SUCCESSFUL) {
    disk_unlock();

    return sc;
  }

  dd->phys_dev = physical_disk;
  dd->start = begin_block;
  dd->size = block_count;
  dd->block_size = physical_disk->block_size;
  dd->media_block_size = physical_disk->media_block_size;
  dd->block_to_media_block_shift = physical_disk->block_to_media_block_shift;
  dd->bds_per_group = physical_disk->bds_per_group;
  dd->ioctl = physical_disk->ioctl;
  dd->driver_data = physical_disk->driver_data;

  ++physical_disk->uses;

  disk_unlock();

  return RTEMS_SUCCESSFUL;
}
Esempio n. 3
0
rtems_status_code rtems_disk_create_log(
  dev_t dev,
  dev_t phys,
  rtems_blkdev_bnum block_begin,
  rtems_blkdev_bnum block_count,
  const char *name
)
{
  rtems_status_code sc = RTEMS_SUCCESSFUL;
  rtems_disk_device *phys_dd = NULL;
  rtems_disk_device *dd = NULL;
  char *alloc_name = NULL;

  sc = disk_lock();
  if (sc != RTEMS_SUCCESSFUL) {
    return sc;
  }

  phys_dd = get_disk_entry(phys, true);
  if (phys_dd == NULL) {
    disk_unlock();

    return RTEMS_INVALID_ID;
  }

  sc = create_disk(dev, name, &dd, &alloc_name);
  if (sc != RTEMS_SUCCESSFUL) {
    disk_unlock();

    return sc;
  }

  sc = rtems_disk_init_log(
    dd,
    phys_dd,
    block_begin,
    block_count
  );

  dd->dev = dev;
  dd->name = alloc_name;

  ++phys_dd->uses;

  if (sc != RTEMS_SUCCESSFUL) {
    dd->ioctl = null_handler;
    rtems_disk_delete(dev);
    disk_unlock();

    return sc;
  }

  disk_unlock();

  return RTEMS_SUCCESSFUL;
}
Esempio n. 4
0
rtems_disk_device *
rtems_disk_obtain(dev_t dev)
{
  rtems_status_code sc = RTEMS_SUCCESSFUL;
  rtems_disk_device *dd = NULL;
  rtems_interrupt_level level;

  rtems_interrupt_disable(level);
  if (!diskdevs_protected) {
    /* Frequent and quickest case */
    dd = get_disk_entry(dev, false);
    rtems_interrupt_enable(level);
  } else {
    rtems_interrupt_enable(level);

    sc = disk_lock();
    if (sc == RTEMS_SUCCESSFUL) {
      dd = get_disk_entry(dev, false);
      disk_unlock();
    }
  }

  return dd;
}