⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diskdevs.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -