📄 diskdevs.c
字号:
disk_device *pdd; rtems_status_code rc; rtems_device_major_number major; rtems_device_minor_number minor; rtems_filesystem_split_dev_t (dev, major, minor); rc = rtems_semaphore_obtain(diskdevs_mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (rc != RTEMS_SUCCESSFUL) return rc; diskdevs_protected = TRUE; pdd = get_disk_entry(phys); if (pdd == NULL) { diskdevs_protected = FALSE; rtems_semaphore_release(diskdevs_mutex); return RTEMS_INVALID_NUMBER; } rc = create_disk(dev, name, &dd); if (rc != RTEMS_SUCCESSFUL) { diskdevs_protected = FALSE; rtems_semaphore_release(diskdevs_mutex); return rc; } dd->phys_dev = pdd; dd->uses = 0; dd->start = start; dd->size = size; dd->block_size = pdd->block_size; dd->block_size_log2 = pdd->block_size_log2; dd->ioctl = pdd->ioctl; rc = rtems_io_register_name(name, major, minor); diskdevs_protected = FALSE; rc = rtems_semaphore_release(diskdevs_mutex); return rc;}/* rtems_disk_delete -- * Delete physical or logical disk device. Device may be deleted if its * use counter (and use counters of all logical devices - if it is * physical device) equal to 0. When physical device deleted, * all logical devices deleted inherently. Appropriate devices removed * from "/dev" filesystem. * * PARAMETERS: * dev - device identifier (major, minor numbers) * * RETURNS: * RTEMS_SUCCESSFUL if block device successfully deleted, or error code * if error occured (device is not defined, device is in use). */rtems_status_codertems_disk_delete(dev_t dev){ rtems_status_code rc; int used; rtems_device_major_number maj; rtems_device_minor_number min; rc = rtems_semaphore_obtain(diskdevs_mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (rc != RTEMS_SUCCESSFUL) return rc; diskdevs_protected = TRUE; /* Check if this device is in use -- calculate usage counter */ used = 0; for (maj = 0; maj < disktab_size; maj++) { struct disk_device_table *dtab = disktab + maj; if (dtab != NULL) { for (min = 0; min < dtab->size; min++) { disk_device *dd = dtab->minor[min]; if ((dd != NULL) && (dd->phys_dev->dev == dev)) used += dd->uses; } } } if (used != 0) { diskdevs_protected = FALSE; rtems_semaphore_release(diskdevs_mutex); return RTEMS_RESOURCE_IN_USE; } /* Delete this device and all of its logical devices */ for (maj = 0; maj < disktab_size; maj++) { struct disk_device_table *dtab = disktab +maj; if (dtab != NULL) { for (min = 0; min < dtab->size; min++) { disk_device *dd = dtab->minor[min]; if ((dd != NULL) && (dd->phys_dev->dev == dev)) { unlink(dd->name); free(dd->name); free(dd); dtab->minor[min] = NULL; } } } } diskdevs_protected = FALSE; rc = rtems_semaphore_release(diskdevs_mutex); return rc;}/* rtems_disk_lookup -- * Find block device descriptor by its device identifier. * * PARAMETERS: * dev - device identifier (major, minor numbers) * * RETURNS: * pointer to the block device descriptor, or NULL if no such device * exists. */disk_device *rtems_disk_lookup(dev_t dev){ rtems_interrupt_level level; disk_device *dd; rtems_status_code rc; rtems_interrupt_disable(level); if (diskdevs_protected) { rtems_interrupt_enable(level); rc = rtems_semaphore_obtain(diskdevs_mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (rc != RTEMS_SUCCESSFUL) return NULL; diskdevs_protected = TRUE; dd = get_disk_entry(dev); dd->uses++; diskdevs_protected = FALSE; rtems_semaphore_release(diskdevs_mutex); return dd; } else { /* Frequent and quickest case */ dd = get_disk_entry(dev); dd->uses++; rtems_interrupt_enable(level); return dd; }}/* rtems_disk_release -- * Release disk_device structure (decrement usage counter to 1). * * PARAMETERS: * dd - pointer to disk device structure * * RETURNS: * RTEMS_SUCCESSFUL */rtems_status_codertems_disk_release(disk_device *dd){ rtems_interrupt_level level; rtems_interrupt_disable(level); dd->uses--; rtems_interrupt_enable(level); return RTEMS_SUCCESSFUL;}/* rtems_disk_next -- * Disk device enumerator. Looking for device having device number larger * than dev and return disk device descriptor for it. If there are no * such device, NULL value returned. * * PARAMETERS: * dev - device number (use -1 to start search) * * RETURNS: * Pointer to the disk descriptor for next disk device, or NULL if all * devices enumerated. */disk_device *rtems_disk_next(dev_t dev){ rtems_device_major_number major; rtems_device_minor_number minor; struct disk_device_table *dtab; dev++; rtems_filesystem_split_dev_t (dev, major, minor); if (major >= disktab_size) return NULL; dtab = disktab + major; while (TRUE) { if ((dtab == NULL) || (minor > dtab->size)) { major++; minor = 0; if (major >= disktab_size) return NULL; dtab = disktab + major; } else if (dtab->minor[minor] == NULL) { minor++; } else return dtab->minor[minor]; }}/* rtems_disk_initialize -- * Initialization of disk device library (initialize all data structures, * etc.) * * PARAMETERS: * none * * RETURNS: * RTEMS_SUCCESSFUL if library initialized, or error code if error * occured. */rtems_status_codertems_disk_io_initialize(void){ rtems_status_code rc; if (disk_io_initialized) return RTEMS_SUCCESSFUL; disktab_size = DISKTAB_INITIAL_SIZE; disktab = calloc(disktab_size, sizeof(struct disk_device_table)); if (disktab == NULL) return RTEMS_NO_MEMORY; diskdevs_protected = FALSE; rc = rtems_semaphore_create( rtems_build_name('D', 'D', 'E', 'V'), 1, RTEMS_FIFO | RTEMS_BINARY_SEMAPHORE | RTEMS_NO_INHERIT_PRIORITY | RTEMS_NO_PRIORITY_CEILING | RTEMS_LOCAL, 0, &diskdevs_mutex); if (rc != RTEMS_SUCCESSFUL) { free(disktab); return rc; } rc = rtems_bdbuf_init(rtems_bdbuf_configuration, rtems_bdbuf_configuration_size); if (rc != RTEMS_SUCCESSFUL) { rtems_semaphore_delete(diskdevs_mutex); free(disktab); return rc; } disk_io_initialized = 1; return RTEMS_SUCCESSFUL;}/* rtems_disk_io_done -- * Release all resources allocated for disk device interface. * * PARAMETERS: * none * * RETURNS: * RTEMS_SUCCESSFUL if all resources released, or error code if error * occured. */rtems_status_codertems_disk_io_done(void){ rtems_device_major_number maj; rtems_device_minor_number min; rtems_status_code rc; /* Free data structures */ for (maj = 0; maj < disktab_size; maj++) { struct disk_device_table *dtab = disktab + maj; if (dtab != NULL) { for (min = 0; min < dtab->size; min++) { disk_device *dd = dtab->minor[min]; unlink(dd->name); free(dd->name); free(dd); } free(dtab); } } free(disktab); rc = rtems_semaphore_release(diskdevs_mutex); /* XXX bdbuf should be released too! */ disk_io_initialized = 0; return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -