18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * QEMU System Emulator block driver 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2003 Fabrice Bellard 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in the Software without restriction, including without limitation the rights 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * furnished to do so, subject to the following conditions: 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The above copyright notice and this permission notice shall be included in 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * all copies or substantial portions of the Software. 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE. 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef BLOCK_INT_H 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define BLOCK_INT_H 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "block.h" 285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-option.h" 29cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner#include "qemu-queue.h" 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define BLOCK_FLAG_ENCRYPT 1 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define BLOCK_FLAG_COMPRESS 2 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define BLOCK_FLAG_COMPAT6 4 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BLOCK_OPT_SIZE "size" 365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BLOCK_OPT_ENCRYPT "encryption" 375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BLOCK_OPT_COMPAT6 "compat6" 385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BLOCK_OPT_BACKING_FILE "backing_file" 395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BLOCK_OPT_BACKING_FMT "backing_fmt" 405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BLOCK_OPT_CLUSTER_SIZE "cluster_size" 41dd9cb7929e2b98bf9f8017ebbd7e433d38541664David 'Digit' Turner#define BLOCK_OPT_PREALLOC "preallocation" 425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct AIOPool { 445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void (*cancel)(BlockDriverAIOCB *acb); 455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int aiocb_size; 465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockDriverAIOCB *free_aiocb; 475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} AIOPool; 485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct BlockDriver { 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *format_name; 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int instance_size; 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename); 535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int (*bdrv_probe_device)(const char *filename); 54cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int (*bdrv_open)(BlockDriverState *bs, int flags); 55cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int (*bdrv_file_open)(BlockDriverState *bs, const char *filename, int flags); 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_read)(BlockDriverState *bs, int64_t sector_num, 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t *buf, int nb_sectors); 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_write)(BlockDriverState *bs, int64_t sector_num, 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const uint8_t *buf, int nb_sectors); 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void (*bdrv_close)(BlockDriverState *bs); 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int (*bdrv_create)(const char *filename, QEMUOptionParameter *options); 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void (*bdrv_flush)(BlockDriverState *bs); 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_is_allocated)(BlockDriverState *bs, int64_t sector_num, 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nb_sectors, int *pnum); 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_set_key)(BlockDriverState *bs, const char *key); 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_make_empty)(BlockDriverState *bs); 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* aio */ 685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockDriverAIOCB *(*bdrv_aio_readv)(BlockDriverState *bs, 695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BlockDriverCompletionFunc *cb, void *opaque); 715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockDriverAIOCB *(*bdrv_aio_writev)(BlockDriverState *bs, 725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BlockDriverCompletionFunc *cb, void *opaque); 74cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner BlockDriverAIOCB *(*bdrv_aio_flush)(BlockDriverState *bs, 75cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner BlockDriverCompletionFunc *cb, void *opaque); 76cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 77cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int (*bdrv_aio_multiwrite)(BlockDriverState *bs, BlockRequest *reqs, 78cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int num_reqs); 79cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int (*bdrv_merge_requests)(BlockDriverState *bs, BlockRequest* a, 80cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner BlockRequest *b); 81cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *protocol_name; 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_truncate)(BlockDriverState *bs, int64_t offset); 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t (*bdrv_getlength)(BlockDriverState *bs); 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_write_compressed)(BlockDriverState *bs, int64_t sector_num, 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const uint8_t *buf, int nb_sectors); 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_snapshot_create)(BlockDriverState *bs, 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEMUSnapshotInfo *sn_info); 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_snapshot_goto)(BlockDriverState *bs, 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *snapshot_id); 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_snapshot_delete)(BlockDriverState *bs, const char *snapshot_id); 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_snapshot_list)(BlockDriverState *bs, 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEMUSnapshotInfo **psn_info); 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi); 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 98cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int (*bdrv_save_vmstate)(BlockDriverState *bs, const uint8_t *buf, 99cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int64_t pos, int size); 100cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int (*bdrv_load_vmstate)(BlockDriverState *bs, uint8_t *buf, 101cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int64_t pos, int size); 102cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 103cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int (*bdrv_change_backing_file)(BlockDriverState *bs, 104cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner const char *backing_file, const char *backing_fmt); 1055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* removable device specific */ 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_is_inserted)(BlockDriverState *bs); 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_media_changed)(BlockDriverState *bs); 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_eject)(BlockDriverState *bs, int eject_flag); 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_set_locked)(BlockDriverState *bs, int locked); 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* to control generic scsi devices */ 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*bdrv_ioctl)(BlockDriverState *bs, unsigned long int req, void *buf); 1145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockDriverAIOCB *(*bdrv_aio_ioctl)(BlockDriverState *bs, 1155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner unsigned long int req, void *buf, 1165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockDriverCompletionFunc *cb, void *opaque); 1175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* List of options for creating images, terminated by name == NULL */ 1195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner QEMUOptionParameter *create_options; 1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 122cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner /* 123cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner * Returns 0 for completed check, -errno for internal errors. 124cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner * The check results are stored in result. 125cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner */ 126cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int (*bdrv_check)(BlockDriverState* bs, BdrvCheckResult *result); 127cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 128cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner void (*bdrv_debug_event)(BlockDriverState *bs, BlkDebugEvent event); 129cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 130cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner /* 131cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner * Returns 1 if newly created images are guaranteed to contain only 132cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner * zeros, 0 otherwise. 133cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner */ 134cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int (*bdrv_has_zero_init)(BlockDriverState *bs); 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 136cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner QLIST_ENTRY(BlockDriver) list; 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct BlockDriverState { 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t total_sectors; /* if we are reading a disk image, give its 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size in sectors */ 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int read_only; /* if true, the media is read only */ 143cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int keep_read_only; /* if true, the media was requested to stay read only */ 144cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int open_flags; /* flags used to open the file, re-used for re-open */ 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int removable; /* if true, the media can be removed */ 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int locked; /* if true, the media cannot temporarily be ejected */ 147cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int tray_open; /* if true, the virtual tray is open */ 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int encrypted; /* if true, the media is encrypted */ 1495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int valid_key; /* if true, a valid encryption key has been set */ 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sg; /* if true, the device is a /dev/sg* */ 151cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int probed; /* if true, format was probed automatically */ 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* event callback when inserting/removing */ 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void (*change_cb)(void *opaque); 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void *change_opaque; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BlockDriver *drv; /* NULL means no media */ 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void *opaque; 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 159cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner DeviceState *peer; 160cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char filename[1024]; 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char backing_file[1024]; /* if non zero, the image is a diff of 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this file image */ 1645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char backing_format[16]; /* if non-zero and backing_file exists */ 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int is_temporary; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int media_changed; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BlockDriverState *backing_hd; 169cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner BlockDriverState *file; 170cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* async read/write emulation */ 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void *sync_aiocb; 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* I/O stats (display with "info blockstats"). */ 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t rd_bytes; 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t wr_bytes; 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t rd_ops; 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t wr_ops; 180cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner uint64_t wr_highest_sector; 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* Whether the disk can expand beyond total_sectors */ 1835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int growable; 1845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* the memory alignment required for the buffers handled by this driver */ 1865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int buffer_alignment; 1875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 188cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner /* do we need to tell the quest if we have a volatile write cache? */ 189cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int enable_write_cache; 190cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* NOTE: the following infos are only hints for real hardware 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drivers. They are not used by the block driver */ 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int cyls, heads, secs, translation; 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int type; 195cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner BlockErrorAction on_read_error, on_write_error; 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char device_name[32]; 197cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner unsigned long *dirty_bitmap; 198cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int64_t dirty_count; 199cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner QTAILQ_ENTRY(BlockDriverState) list; 2005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void *private; 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct BlockDriverAIOCB { 2045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner AIOPool *pool; 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BlockDriverState *bs; 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BlockDriverCompletionFunc *cb; 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void *opaque; 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BlockDriverAIOCB *next; 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid get_tmp_filename(char *filename, int size); 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid *qemu_aio_get(AIOPool *pool, BlockDriverState *bs, 2145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockDriverCompletionFunc *cb, void *opaque); 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_aio_release(void *p); 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid *qemu_blockalign(BlockDriverState *bs, size_t size); 2185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef _WIN32 2205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint is_windows_drive(const char *filename); 2215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 223cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turnertypedef struct BlockConf { 224cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner BlockDriverState *bs; 225cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner uint16_t physical_block_size; 226cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner uint16_t logical_block_size; 227cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner uint16_t min_io_size; 228cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner uint32_t opt_io_size; 229cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner} BlockConf; 230cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 231cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turnerstatic inline unsigned int get_physical_block_exp(BlockConf *conf) 232cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner{ 233cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner unsigned int exp = 0, size; 234cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 235cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner for (size = conf->physical_block_size; 236cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner size > conf->logical_block_size; 237cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner size >>= 1) { 238cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner exp++; 239cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner } 240cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 241cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner return exp; 242cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner} 243cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 244cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner#define DEFINE_BLOCK_PROPERTIES(_state, _conf) \ 245cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner DEFINE_PROP_DRIVE("drive", _state, _conf.bs), \ 246cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner DEFINE_PROP_UINT16("logical_block_size", _state, \ 247cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner _conf.logical_block_size, 512), \ 248cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner DEFINE_PROP_UINT16("physical_block_size", _state, \ 249cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner _conf.physical_block_size, 512), \ 250cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0), \ 251cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0) 252cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* BLOCK_INT_H */ 254