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 ) { rtems_status_code sc; if ( blocks_with_buffer <= media_block_count ) { sc = sparse_disk_initialize( sparse_disk, media_block_size, blocks_with_buffer, sparse_disk_delete, fill_pattern ); if ( RTEMS_SUCCESSFUL == sc ) { sc = rtems_blkdev_create( device_file_name, media_block_size, media_block_count, sparse_disk_ioctl, sparse_disk ); } } else { sc = RTEMS_INVALID_NUMBER; } return sc; }
static void test_blkdev_imfs_read_and_write(void) { rtems_status_code sc; int rv; ramdisk *rd; int fd; off_t off; rd = ramdisk_allocate(area_a, BLOCK_SIZE, BLOCK_COUNT, false); rtems_test_assert(rd != NULL); ramdisk_enable_free_at_delete_request(rd); sc = rtems_blkdev_create( rda, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd ); ASSERT_SC(sc); fd = open(rda, O_RDWR); rtems_test_assert(fd >= 0); area_init(area_a); area_read(fd, area_b); area_compare(area_a, area_b, true); off = lseek(fd, 0, SEEK_SET); rtems_test_assert(off == 0); area_init(area_b); area_write(fd, area_b); area_compare(area_a, area_b, false); rv = close(fd); rtems_test_assert(rv == 0); rv = unlink(rda); rtems_test_assert(rv == 0); area_compare(area_a, area_b, true); }
static void test_blkdev_imfs_errors(void) { static uintptr_t disk_size [] = { sizeof(rtems_disk_device) + sizeof(int) }; rtems_status_code sc; int rv; ramdisk *rd; void *opaque; rd = ramdisk_allocate(NULL, BLOCK_SIZE, BLOCK_COUNT, false); rtems_test_assert(rd != NULL); ramdisk_enable_free_at_delete_request(rd); sc = rtems_blkdev_create( rda, 0, BLOCK_COUNT, ramdisk_ioctl, rd ); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); sc = rtems_blkdev_create( rda, BLOCK_SIZE, 0, ramdisk_ioctl, rd ); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); opaque = rtems_heap_greedy_allocate(NULL, 0); sc = rtems_blkdev_create( rda, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd ); rtems_test_assert(sc == RTEMS_NO_MEMORY); rtems_heap_greedy_free(opaque); opaque = rtems_heap_greedy_allocate(disk_size, 1); sc = rtems_blkdev_create( rda, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd ); rtems_test_assert(sc == RTEMS_UNSATISFIED); rtems_heap_greedy_free(opaque); sc = rtems_blkdev_create( rda, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd ); ASSERT_SC(sc); sc = rtems_blkdev_create_partition( rda1, not_exist, 0, BLOCK_COUNT ); rtems_test_assert(sc == RTEMS_INVALID_ID); rv = mknod(not_blkdev, S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO, 0); rtems_test_assert(rv == 0); sc = rtems_blkdev_create_partition( rda1, not_blkdev, 0, BLOCK_COUNT ); rtems_test_assert(sc == RTEMS_INVALID_NODE); rv = mknod(invalid_blkdev, S_IFBLK | S_IRWXU | S_IRWXG | S_IRWXO, 0); rtems_test_assert(rv == 0); sc = rtems_blkdev_create_partition( rda1, invalid_blkdev, 0, BLOCK_COUNT ); rtems_test_assert(sc == RTEMS_NOT_IMPLEMENTED); sc = rtems_blkdev_create_partition( rda1, rda, 0, 0 ); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); sc = rtems_blkdev_create_partition( rda1, rda, BLOCK_COUNT, BLOCK_COUNT ); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); sc = rtems_blkdev_create_partition( rda1, rda, 0, BLOCK_COUNT + 1 ); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); opaque = rtems_heap_greedy_allocate(NULL, 0); sc = rtems_blkdev_create_partition( rda1, rda, 0, BLOCK_COUNT ); rtems_test_assert(sc == RTEMS_NO_MEMORY); rtems_heap_greedy_free(opaque); opaque = rtems_heap_greedy_allocate(disk_size, 1); sc = rtems_blkdev_create_partition( rda1, rda, 0, BLOCK_COUNT ); rtems_test_assert(sc == RTEMS_UNSATISFIED); rtems_heap_greedy_free(opaque); rv = unlink(rda); rtems_test_assert(rv == 0); }
static void test_blkdev_imfs_parameters(void) { rtems_status_code sc; int rv; ramdisk *rd; int fd; rtems_disk_device *dd; struct stat st; rd = ramdisk_allocate(NULL, BLOCK_SIZE, BLOCK_COUNT, false); rtems_test_assert(rd != NULL); ramdisk_enable_free_at_delete_request(rd); sc = rtems_blkdev_create( rda, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd ); ASSERT_SC(sc); sc = rtems_blkdev_create_partition( rda1, rda, 1, BLOCK_COUNT - 1 ); ASSERT_SC(sc); fd = open(rda, O_RDWR); rtems_test_assert(fd >= 0); rv = fstat(fd, &st); rtems_test_assert(rv == 0); rv = rtems_disk_fd_get_disk_device(fd, &dd); rtems_test_assert(rv == 0); rtems_test_assert(rtems_disk_get_driver_data(dd) == rd); rtems_test_assert(rtems_disk_get_device_identifier(dd) == st.st_rdev); rtems_test_assert(rtems_disk_get_media_block_size(dd) == BLOCK_SIZE); rtems_test_assert(rtems_disk_get_block_size(dd) == BLOCK_SIZE); rtems_test_assert(rtems_disk_get_block_begin(dd) == 0); rtems_test_assert(rtems_disk_get_block_count(dd) == BLOCK_COUNT); rv = close(fd); rtems_test_assert(rv == 0); fd = open(rda1, O_RDWR); rtems_test_assert(fd >= 0); rv = fstat(fd, &st); rtems_test_assert(rv == 0); rv = rtems_disk_fd_get_disk_device(fd, &dd); rtems_test_assert(rv == 0); rtems_test_assert(rtems_disk_get_driver_data(dd) == rd); rtems_test_assert(rtems_disk_get_device_identifier(dd) == st.st_rdev); rtems_test_assert(rtems_disk_get_media_block_size(dd) == BLOCK_SIZE); rtems_test_assert(rtems_disk_get_block_size(dd) == BLOCK_SIZE); rtems_test_assert(rtems_disk_get_block_begin(dd) == 1); rtems_test_assert(rtems_disk_get_block_count(dd) == BLOCK_COUNT - 1); rv = close(fd); rtems_test_assert(rv == 0); rv = unlink(rda1); rtems_test_assert(rv == 0); rv = unlink(rda); rtems_test_assert(rv == 0); }
static rtems_status_code rtems_bsd_sim_attach_worker(rtems_media_state state, const char *src, char **dest, void *arg) { rtems_status_code sc = RTEMS_SUCCESSFUL; struct cam_sim *sim = arg; char *disk = NULL; if (state == RTEMS_MEDIA_STATE_READY) { unsigned retries = 0; struct scsi_inquiry_data inq_data; uint32_t block_count = 0; uint32_t block_size = 0; disk = rtems_media_create_path("/dev", src, cam_sim_unit(sim)); if (disk == NULL) { BSD_PRINTF("OOPS: create path failed\n"); goto error; } sc = rtems_bsd_scsi_inquiry(&sim->ccb, &inq_data); if (sc != RTEMS_SUCCESSFUL) { BSD_PRINTF("OOPS: inquiry failed\n"); goto error; } scsi_print_inquiry(&inq_data); for (retries = 0; retries <= 3; ++retries) { sc = rtems_bsd_scsi_test_unit_ready(&sim->ccb); if (sc == RTEMS_SUCCESSFUL) { break; } } if (sc != RTEMS_SUCCESSFUL) { BSD_PRINTF("OOPS: test unit ready failed\n"); goto error; } sc = rtems_bsd_scsi_read_capacity(&sim->ccb, &block_count, &block_size); if (sc != RTEMS_SUCCESSFUL) { BSD_PRINTF("OOPS: read capacity failed\n"); goto error; } BSD_PRINTF("read capacity: block count %u, block size %u\n", block_count, block_size); sc = rtems_blkdev_create(disk, block_size, block_count, rtems_bsd_sim_disk_ioctl, sim); if (sc != RTEMS_SUCCESSFUL) { goto error; } /* FIXME */ #if 0 rtems_disk_device *dd = rtems_disk_obtain(dev); dd->block_size *= 64; rtems_disk_release(dd); #endif rtems_bsd_sim_disk_initialized(sim, disk); *dest = strdup(disk, M_RTEMS_HEAP); } return RTEMS_SUCCESSFUL; error: free(disk, M_RTEMS_HEAP); rtems_bsd_sim_disk_initialized(sim, NULL); return RTEMS_IO_ERROR; }