qemu/block_int.h
<<
>>
Prefs
   1/*
   2 * QEMU System Emulator block driver
   3 *
   4 * Copyright (c) 2003 Fabrice Bellard
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a copy
   7 * of this software and associated documentation files (the "Software"), to deal
   8 * in the Software without restriction, including without limitation the rights
   9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 * copies of the Software, and to permit persons to whom the Software is
  11 * furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice shall be included in
  14 * all copies or substantial portions of the Software.
  15 *
  16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 * THE SOFTWARE.
  23 */
  24#ifndef BLOCK_INT_H
  25#define BLOCK_INT_H
  26
  27#include "block.h"
  28#include "qemu-option.h"
  29#include "qemu-queue.h"
  30
  31#define BLOCK_FLAG_ENCRYPT      1
  32#define BLOCK_FLAG_COMPAT6      4
  33
  34#define BLOCK_OPT_SIZE          "size"
  35#define BLOCK_OPT_ENCRYPT       "encryption"
  36#define BLOCK_OPT_COMPAT6       "compat6"
  37#define BLOCK_OPT_BACKING_FILE  "backing_file"
  38#define BLOCK_OPT_BACKING_FMT   "backing_fmt"
  39#define BLOCK_OPT_CLUSTER_SIZE  "cluster_size"
  40#define BLOCK_OPT_TABLE_SIZE    "table_size"
  41#define BLOCK_OPT_PREALLOC      "preallocation"
  42
  43typedef struct AIOPool {
  44    void (*cancel)(BlockDriverAIOCB *acb);
  45    int aiocb_size;
  46    BlockDriverAIOCB *free_aiocb;
  47} AIOPool;
  48
  49struct BlockDriver {
  50    const char *format_name;
  51    int instance_size;
  52    int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename);
  53    int (*bdrv_probe_device)(const char *filename);
  54    int (*bdrv_open)(BlockDriverState *bs, int flags);
  55    int (*bdrv_file_open)(BlockDriverState *bs, const char *filename, int flags);
  56    int (*bdrv_read)(BlockDriverState *bs, int64_t sector_num,
  57                     uint8_t *buf, int nb_sectors);
  58    int (*bdrv_write)(BlockDriverState *bs, int64_t sector_num,
  59                      const uint8_t *buf, int nb_sectors);
  60    void (*bdrv_close)(BlockDriverState *bs);
  61    int (*bdrv_create)(const char *filename, QEMUOptionParameter *options);
  62    int (*bdrv_flush)(BlockDriverState *bs);
  63    int (*bdrv_is_allocated)(BlockDriverState *bs, int64_t sector_num,
  64                             int nb_sectors, int *pnum);
  65    int (*bdrv_set_key)(BlockDriverState *bs, const char *key);
  66    int (*bdrv_make_empty)(BlockDriverState *bs);
  67    /* aio */
  68    BlockDriverAIOCB *(*bdrv_aio_readv)(BlockDriverState *bs,
  69        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
  70        BlockDriverCompletionFunc *cb, void *opaque);
  71    BlockDriverAIOCB *(*bdrv_aio_writev)(BlockDriverState *bs,
  72        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
  73        BlockDriverCompletionFunc *cb, void *opaque);
  74    BlockDriverAIOCB *(*bdrv_aio_flush)(BlockDriverState *bs,
  75        BlockDriverCompletionFunc *cb, void *opaque);
  76    int (*bdrv_discard)(BlockDriverState *bs, int64_t sector_num,
  77                        int nb_sectors);
  78
  79    int (*bdrv_aio_multiwrite)(BlockDriverState *bs, BlockRequest *reqs,
  80        int num_reqs);
  81    int (*bdrv_merge_requests)(BlockDriverState *bs, BlockRequest* a,
  82        BlockRequest *b);
  83
  84
  85    const char *protocol_name;
  86    int (*bdrv_truncate)(BlockDriverState *bs, int64_t offset);
  87    int64_t (*bdrv_getlength)(BlockDriverState *bs);
  88    int (*bdrv_write_compressed)(BlockDriverState *bs, int64_t sector_num,
  89                                 const uint8_t *buf, int nb_sectors);
  90
  91    int (*bdrv_snapshot_create)(BlockDriverState *bs,
  92                                QEMUSnapshotInfo *sn_info);
  93    int (*bdrv_snapshot_goto)(BlockDriverState *bs,
  94                              const char *snapshot_id);
  95    int (*bdrv_snapshot_delete)(BlockDriverState *bs, const char *snapshot_id);
  96    int (*bdrv_snapshot_list)(BlockDriverState *bs,
  97                              QEMUSnapshotInfo **psn_info);
  98    int (*bdrv_snapshot_load_tmp)(BlockDriverState *bs,
  99                                  const char *snapshot_name);
 100    int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi);
 101
 102    int (*bdrv_save_vmstate)(BlockDriverState *bs, const uint8_t *buf,
 103                             int64_t pos, int size);
 104    int (*bdrv_load_vmstate)(BlockDriverState *bs, uint8_t *buf,
 105                             int64_t pos, int size);
 106
 107    int (*bdrv_change_backing_file)(BlockDriverState *bs,
 108        const char *backing_file, const char *backing_fmt);
 109
 110    /* removable device specific */
 111    int (*bdrv_is_inserted)(BlockDriverState *bs);
 112    int (*bdrv_media_changed)(BlockDriverState *bs);
 113    int (*bdrv_eject)(BlockDriverState *bs, int eject_flag);
 114    int (*bdrv_set_locked)(BlockDriverState *bs, int locked);
 115
 116    /* to control generic scsi devices */
 117    int (*bdrv_ioctl)(BlockDriverState *bs, unsigned long int req, void *buf);
 118    BlockDriverAIOCB *(*bdrv_aio_ioctl)(BlockDriverState *bs,
 119        unsigned long int req, void *buf,
 120        BlockDriverCompletionFunc *cb, void *opaque);
 121
 122    /* List of options for creating images, terminated by name == NULL */
 123    QEMUOptionParameter *create_options;
 124
 125
 126    /*
 127     * Returns 0 for completed check, -errno for internal errors.
 128     * The check results are stored in result.
 129     */
 130    int (*bdrv_check)(BlockDriverState* bs, BdrvCheckResult *result);
 131
 132    void (*bdrv_debug_event)(BlockDriverState *bs, BlkDebugEvent event);
 133
 134    /*
 135     * Returns 1 if newly created images are guaranteed to contain only
 136     * zeros, 0 otherwise.
 137     */
 138    int (*bdrv_has_zero_init)(BlockDriverState *bs);
 139
 140    QLIST_ENTRY(BlockDriver) list;
 141};
 142
 143struct BlockDriverState {
 144    int64_t total_sectors; /* if we are reading a disk image, give its
 145                              size in sectors */
 146    int read_only; /* if true, the media is read only */
 147    int keep_read_only; /* if true, the media was requested to stay read only */
 148    int open_flags; /* flags used to open the file, re-used for re-open */
 149    int removable; /* if true, the media can be removed */
 150    int locked;    /* if true, the media cannot temporarily be ejected */
 151    int tray_open; /* if true, the virtual tray is open */
 152    int encrypted; /* if true, the media is encrypted */
 153    int valid_key; /* if true, a valid encryption key has been set */
 154    int sg;        /* if true, the device is a /dev/sg* */
 155    /* event callback when inserting/removing */
 156    void (*change_cb)(void *opaque, int reason);
 157    void *change_opaque;
 158
 159    BlockDriver *drv; /* NULL means no media */
 160    void *opaque;
 161
 162    DeviceState *peer;
 163
 164    char filename[1024];
 165    char backing_file[1024]; /* if non zero, the image is a diff of
 166                                this file image */
 167    char backing_format[16]; /* if non-zero and backing_file exists */
 168    int is_temporary;
 169    int media_changed;
 170
 171    BlockDriverState *backing_hd;
 172    BlockDriverState *file;
 173
 174    /* async read/write emulation */
 175
 176    void *sync_aiocb;
 177
 178    /* I/O stats (display with "info blockstats"). */
 179    uint64_t rd_bytes;
 180    uint64_t wr_bytes;
 181    uint64_t rd_ops;
 182    uint64_t wr_ops;
 183    uint64_t wr_highest_sector;
 184
 185    /* Whether the disk can expand beyond total_sectors */
 186    int growable;
 187
 188    /* the memory alignment required for the buffers handled by this driver */
 189    int buffer_alignment;
 190
 191    /* do we need to tell the quest if we have a volatile write cache? */
 192    int enable_write_cache;
 193
 194    /* NOTE: the following infos are only hints for real hardware
 195       drivers. They are not used by the block driver */
 196    int cyls, heads, secs, translation;
 197    int type;
 198    BlockErrorAction on_read_error, on_write_error;
 199    char device_name[32];
 200    unsigned long *dirty_bitmap;
 201    int64_t dirty_count;
 202    int in_use; /* users other than guest access, eg. block migration */
 203    QTAILQ_ENTRY(BlockDriverState) list;
 204    void *private;
 205};
 206
 207#define CHANGE_MEDIA    0x01
 208#define CHANGE_SIZE     0x02
 209
 210struct BlockDriverAIOCB {
 211    AIOPool *pool;
 212    BlockDriverState *bs;
 213    BlockDriverCompletionFunc *cb;
 214    void *opaque;
 215    BlockDriverAIOCB *next;
 216};
 217
 218void get_tmp_filename(char *filename, int size);
 219
 220void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
 221                   BlockDriverCompletionFunc *cb, void *opaque);
 222void qemu_aio_release(void *p);
 223
 224void *qemu_blockalign(BlockDriverState *bs, size_t size);
 225
 226#ifdef _WIN32
 227int is_windows_drive(const char *filename);
 228#endif
 229
 230typedef struct BlockConf {
 231    BlockDriverState *bs;
 232    uint16_t physical_block_size;
 233    uint16_t logical_block_size;
 234    uint16_t min_io_size;
 235    uint32_t opt_io_size;
 236    int32_t bootindex;
 237    uint32_t discard_granularity;
 238} BlockConf;
 239
 240static inline unsigned int get_physical_block_exp(BlockConf *conf)
 241{
 242    unsigned int exp = 0, size;
 243
 244    for (size = conf->physical_block_size;
 245        size > conf->logical_block_size;
 246        size >>= 1) {
 247        exp++;
 248    }
 249
 250    return exp;
 251}
 252
 253#define DEFINE_BLOCK_PROPERTIES(_state, _conf)                          \
 254    DEFINE_PROP_DRIVE("drive", _state, _conf.bs),                       \
 255    DEFINE_PROP_UINT16("logical_block_size", _state,                    \
 256                       _conf.logical_block_size, 512),                  \
 257    DEFINE_PROP_UINT16("physical_block_size", _state,                   \
 258                       _conf.physical_block_size, 512),                 \
 259    DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0),  \
 260    DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0),    \
 261    DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1),        \
 262    DEFINE_PROP_UINT32("discard_granularity", _state, \
 263                       _conf.discard_granularity, 0)
 264
 265#endif /* BLOCK_INT_H */
 266