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; }
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; }
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; }
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; }