summaryrefslogblamecommitdiffstats
path: root/cpukit/include/rtems/sparse-disk.h
blob: 5b280be0a7880bebb29ef3eb820e95f0e4adbb3f (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13

                                           










                                                                 



















                                                                              








                           
                         









                                                 
   
        










                                                                                 
                                         



















































































                                                                                 
/* SPDX-License-Identifier: BSD-2-Clause */

/**
 * @file
 *
 * @ingroup rtems_sparse_disk
 *
 * @brief Sparse disk block device API.
 */

/*
 * Copyright (c) 2012 embedded brains GmbH.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef SPARSE_DISK_H
#define SPARSE_DISK_H

#include <stddef.h>
#include <stdint.h>
#include <rtems.h>
#include <rtems/diskdevs.h>
#include <rtems/thread.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup rtems_sparse_disk Sparse Disk Device
 *
 * @ingroup rtems_blkdev
 *
 */
/**@{**/

typedef struct {
  rtems_blkdev_bnum  block;
  void              *data;
} rtems_sparse_disk_key;

typedef struct rtems_sparse_disk rtems_sparse_disk;

typedef void (*rtems_sparse_disk_delete_handler)(rtems_sparse_disk *sparse_disk);

struct rtems_sparse_disk {
  rtems_mutex                      mutex;
  rtems_blkdev_bnum                blocks_with_buffer;
  size_t                           used_count;
  uint32_t                         media_block_size;
  rtems_sparse_disk_delete_handler delete_handler;
  uint8_t                          fill_pattern;
  rtems_sparse_disk_key           *key_table;
};

/**
 * @brief Creates and registers a sparse disk.
 *
 * @param[in] device_file_name The device file name path.
 * @param[in] media_block_size The media block size in bytes.
 * @param[in] blocks_with_buffer Blocks of the device with a buffer.  Other
 * blocks can store only fill pattern value bytes.
 * @param[in] block_count The media block count of the device.  It is the sum
 * of blocks with buffer and blocks that contain only fill pattern value bytes.
 * @param[in] fill_pattern The fill pattern specifies the byte value of blocks
 * without a buffer.  It is also the initial value for blocks with a buffer.
 *
 * @retval RTEMS_SUCCESSFUL Successful operation.
 * @retval RTEMS_INVALID_NUMBER Media block size or media block count is not
 * positive.  The blocks with buffer count is greater than the media block count.
 * @retval RTEMS_NO_MEMORY Not enough memory.
 * @retval RTEMS_TOO_MANY Cannot create semaphore.
 * @retval RTEMS_UNSATISFIED Cannot create generic device node.
 *
 * @see rtems_sparse_disk_register().
 */
rtems_status_code rtems_sparse_disk_create_and_register(
  const char        *device_file_name,
  uint32_t           media_block_size,
  rtems_blkdev_bnum  blocks_with_buffer,
  rtems_blkdev_bnum  media_block_count,
  uint8_t            fill_pattern
);

/**
 * @brief Frees a sparse disk.
 *
 * Calls free() on the sparse disk pointer.
 */
void rtems_sparse_disk_free( rtems_sparse_disk *sparse_disk );

/**
 * @brief Initializes and registers a sparse disk.
 *
 * This will create one semaphore for mutual exclusion.
 *
 * @param[in] device_file_name The device file name path.
 * @param[in, out] sparse_disk The sparse disk.
 * @param[in] media_block_size The media block size in bytes.
 * @param[in] blocks_with_buffer Blocks of the device with a buffer.  Other
 * blocks can store only fill pattern value bytes.
 * @param[in] block_count The media block count of the device.  It is the sum
 * of blocks with buffer and blocks that contain only fill pattern value bytes.
 * @param[in] fill_pattern The fill pattern specifies the byte value of blocks
 * without a buffer.  It is also the initial value for blocks with a buffer.
 * @param[in] sparse_disk_delete The sparse disk delete handler.
 *
 * @retval RTEMS_SUCCESSFUL Successful operation.
 * @retval RTEMS_INVALID_NUMBER Media block size or media block count is not
 * positive.  The blocks with buffer count is greater than the media block count.
 * @retval RTEMS_INVALID_ADDRESS Invalid sparse disk address.
 * @retval RTEMS_TOO_MANY Cannot create semaphore.
 * @retval RTEMS_UNSATISFIED Cannot create generic device node.
 */
rtems_status_code rtems_sparse_disk_register(
  const char                       *device_file_name,
  rtems_sparse_disk                *sparse_disk,
  uint32_t                          media_block_size,
  rtems_blkdev_bnum                 blocks_with_buffer,
  rtems_blkdev_bnum                 media_block_count,
  uint8_t                           fill_pattern,
  rtems_sparse_disk_delete_handler  sparse_disk_delete
);

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* SPARSE_DISK_H */