Changeset f9027ccf in rtems


Ignore:
Timestamp:
Jan 2, 2018, 3:34:54 PM (3 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
5, master
Children:
868ca746
Parents:
c8d5bed
git-author:
Sebastian Huber <sebastian.huber@…> (01/02/18 15:34:54)
git-committer:
Sebastian Huber <sebastian.huber@…> (02/07/18 07:58:29)
Message:

libblock: Use self-contained mutex for flashdisk

Update #2843.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libblock/src/flashdisk.c

    rc8d5bed rf9027ccf  
    4444#include <inttypes.h>
    4545
    46 #include "rtems/blkdev.h"
    47 #include "rtems/diskdevs.h"
    48 #include "rtems/flashdisk.h"
     46#include <rtems/blkdev.h>
     47#include <rtems/diskdevs.h>
     48#include <rtems/flashdisk.h>
     49#include <rtems/thread.h>
    4950
    5051/**
     
    196197  rtems_fdisk_segment_ctl_queue failed;    /**< The list of segments that failed
    197198                                                when being erased. */
    198   rtems_id lock;                           /**< Mutex for threading protection.*/
     199  rtems_mutex lock;                        /**< Mutex for threading protection.*/
    199200
    200201  uint8_t* copy_buffer;                    /**< Copy buf used during compacting */
     
    23772378  rtems_device_minor_number minor = rtems_filesystem_dev_minor_t (dev);
    23782379  rtems_blkdev_request*     r = argp;
    2379   rtems_status_code         sc;
    23802380
    23812381  errno = 0;
    23822382
    2383   sc = rtems_semaphore_obtain (rtems_flashdisks[minor].lock, RTEMS_WAIT, 0);
    2384   if (sc != RTEMS_SUCCESSFUL)
    2385     errno = EIO;
    2386   else
    2387   {
    2388     errno = 0;
    2389     switch (req)
    2390     {
    2391       case RTEMS_BLKIO_REQUEST:
    2392         if ((minor >= rtems_flashdisk_count) ||
    2393             (rtems_flashdisks[minor].device_count == 0))
     2383  rtems_mutex_lock (&rtems_flashdisks[minor].lock);
     2384
     2385  switch (req)
     2386  {
     2387    case RTEMS_BLKIO_REQUEST:
     2388      if ((minor >= rtems_flashdisk_count) ||
     2389          (rtems_flashdisks[minor].device_count == 0))
     2390      {
     2391        errno = ENODEV;
     2392      }
     2393      else
     2394      {
     2395        switch (r->req)
    23942396        {
    2395           errno = ENODEV;
     2397          case RTEMS_BLKDEV_REQ_READ:
     2398            errno = rtems_fdisk_read (&rtems_flashdisks[minor], r);
     2399            break;
     2400
     2401          case RTEMS_BLKDEV_REQ_WRITE:
     2402            errno = rtems_fdisk_write (&rtems_flashdisks[minor], r);
     2403            break;
     2404
     2405          default:
     2406            errno = EINVAL;
     2407            break;
    23962408        }
    2397         else
    2398         {
    2399           switch (r->req)
    2400           {
    2401             case RTEMS_BLKDEV_REQ_READ:
    2402               errno = rtems_fdisk_read (&rtems_flashdisks[minor], r);
    2403               break;
    2404 
    2405             case RTEMS_BLKDEV_REQ_WRITE:
    2406               errno = rtems_fdisk_write (&rtems_flashdisks[minor], r);
    2407               break;
    2408 
    2409             default:
    2410               errno = EINVAL;
    2411               break;
    2412           }
    2413         }
    2414         break;
    2415 
    2416       case RTEMS_FDISK_IOCTL_ERASE_DISK:
    2417         errno = rtems_fdisk_erase_disk (&rtems_flashdisks[minor]);
    2418         break;
    2419 
    2420       case RTEMS_FDISK_IOCTL_COMPACT:
    2421         errno = rtems_fdisk_compact (&rtems_flashdisks[minor]);
    2422         break;
    2423 
    2424       case RTEMS_FDISK_IOCTL_ERASE_USED:
    2425         errno = rtems_fdisk_erase_used (&rtems_flashdisks[minor]);
    2426         break;
    2427 
    2428       case RTEMS_FDISK_IOCTL_MONITORING:
    2429         errno = rtems_fdisk_monitoring_data (&rtems_flashdisks[minor],
    2430                                              (rtems_fdisk_monitor_data*) argp);
    2431         break;
    2432 
    2433       case RTEMS_FDISK_IOCTL_INFO_LEVEL:
    2434         rtems_flashdisks[minor].info_level = (uintptr_t) argp;
    2435         break;
    2436 
    2437       case RTEMS_FDISK_IOCTL_PRINT_STATUS:
    2438         errno = rtems_fdisk_print_status (&rtems_flashdisks[minor]);
    2439         break;
    2440 
    2441       default:
    2442         rtems_blkdev_ioctl (dd, req, argp);
    2443         break;
    2444     }
    2445 
    2446     sc = rtems_semaphore_release (rtems_flashdisks[minor].lock);
    2447     if (sc != RTEMS_SUCCESSFUL)
    2448       errno = EIO;
    2449   }
     2409      }
     2410      break;
     2411
     2412    case RTEMS_FDISK_IOCTL_ERASE_DISK:
     2413      errno = rtems_fdisk_erase_disk (&rtems_flashdisks[minor]);
     2414      break;
     2415
     2416    case RTEMS_FDISK_IOCTL_COMPACT:
     2417      errno = rtems_fdisk_compact (&rtems_flashdisks[minor]);
     2418      break;
     2419
     2420    case RTEMS_FDISK_IOCTL_ERASE_USED:
     2421      errno = rtems_fdisk_erase_used (&rtems_flashdisks[minor]);
     2422      break;
     2423
     2424    case RTEMS_FDISK_IOCTL_MONITORING:
     2425      errno = rtems_fdisk_monitoring_data (&rtems_flashdisks[minor],
     2426                                           (rtems_fdisk_monitor_data*) argp);
     2427      break;
     2428
     2429    case RTEMS_FDISK_IOCTL_INFO_LEVEL:
     2430      rtems_flashdisks[minor].info_level = (uintptr_t) argp;
     2431      break;
     2432
     2433    case RTEMS_FDISK_IOCTL_PRINT_STATUS:
     2434      errno = rtems_fdisk_print_status (&rtems_flashdisks[minor]);
     2435      break;
     2436
     2437    default:
     2438      rtems_blkdev_ioctl (dd, req, argp);
     2439      break;
     2440  }
     2441
     2442  rtems_mutex_unlock (&rtems_flashdisks[minor].lock);
    24502443
    24512444  return errno == 0 ? 0 : -1;
     
    25262519      return RTEMS_NO_MEMORY;
    25272520
    2528     sc = rtems_semaphore_create (rtems_build_name ('F', 'D', 'S', 'K'), 1,
    2529                                  RTEMS_PRIORITY | RTEMS_BINARY_SEMAPHORE |
    2530                                  RTEMS_INHERIT_PRIORITY, 0, &fd->lock);
    2531     if (sc != RTEMS_SUCCESSFUL)
    2532     {
    2533       rtems_fdisk_error ("disk lock create failed");
    2534       free (fd->copy_buffer);
    2535       free (fd->blocks);
    2536       free (fd->devices);
    2537       return sc;
    2538     }
     2521    rtems_mutex_init (&fd->lock, "Flash Disk");
    25392522
    25402523    sc = rtems_disk_create_phys(dev, c->block_size,
     
    25432526    if (sc != RTEMS_SUCCESSFUL)
    25442527    {
    2545       rtems_semaphore_delete (fd->lock);
     2528      rtems_mutex_destroy (&fd->lock);
    25462529      rtems_disk_delete (dev);
    25472530      free (fd->copy_buffer);
     
    25652548      {
    25662549        rtems_disk_delete (dev);
    2567         rtems_semaphore_delete (fd->lock);
     2550        rtems_mutex_destroy (&fd->lock);
    25682551        free (fd->copy_buffer);
    25692552        free (fd->blocks);
     
    26002583    {
    26012584      rtems_disk_delete (dev);
    2602       rtems_semaphore_delete (fd->lock);
     2585      rtems_mutex_destroy (&fd->lock);
    26032586      free (fd->copy_buffer);
    26042587      free (fd->blocks);
     
    26132596    {
    26142597      rtems_disk_delete (dev);
    2615       rtems_semaphore_delete (fd->lock);
     2598      rtems_mutex_destroy (&fd->lock);
    26162599      free (fd->copy_buffer);
    26172600      free (fd->blocks);
Note: See TracChangeset for help on using the changeset viewer.