qemu/include/block/export.h
<<
>>
Prefs
   1/*
   2 * Declarations for block exports
   3 *
   4 * Copyright (c) 2012, 2020 Red Hat, Inc.
   5 *
   6 * Authors:
   7 * Paolo Bonzini <pbonzini@redhat.com>
   8 * Kevin Wolf <kwolf@redhat.com>
   9 *
  10 * This work is licensed under the terms of the GNU GPL, version 2 or
  11 * later.  See the COPYING file in the top-level directory.
  12 */
  13
  14#ifndef BLOCK_EXPORT_H
  15#define BLOCK_EXPORT_H
  16
  17#include "qapi/qapi-types-block-export.h"
  18#include "qemu/queue.h"
  19
  20typedef struct BlockExport BlockExport;
  21
  22typedef struct BlockExportDriver {
  23    /* The export type that this driver services */
  24    BlockExportType type;
  25
  26    /*
  27     * The size of the driver-specific state that contains BlockExport as its
  28     * first field.
  29     */
  30    size_t instance_size;
  31
  32    /* Creates and starts a new block export */
  33    int (*create)(BlockExport *, BlockExportOptions *, Error **);
  34
  35    /*
  36     * Frees a removed block export. This function is only called after all
  37     * references have been dropped.
  38     */
  39    void (*delete)(BlockExport *);
  40
  41    /*
  42     * Start to disconnect all clients and drop other references held
  43     * internally by the export driver. When the function returns, there may
  44     * still be active references while the export is in the process of
  45     * shutting down.
  46     */
  47    void (*request_shutdown)(BlockExport *);
  48} BlockExportDriver;
  49
  50struct BlockExport {
  51    const BlockExportDriver *drv;
  52
  53    /* Unique identifier for the export */
  54    char *id;
  55
  56    /*
  57     * Reference count for this block export. This includes strong references
  58     * both from the owner (qemu-nbd or the monitor) and clients connected to
  59     * the export.
  60     *
  61     * Use atomics to access this field.
  62     */
  63    int refcount;
  64
  65    /*
  66     * True if one of the references in refcount belongs to the user. After the
  67     * user has dropped their reference, they may not e.g. remove the same
  68     * export a second time (which would decrease the refcount without having
  69     * it incremented first).
  70     */
  71    bool user_owned;
  72
  73    /* The AioContext whose lock protects this BlockExport object. */
  74    AioContext *ctx;
  75
  76    /* The block device to export */
  77    BlockBackend *blk;
  78
  79    /* List entry for block_exports */
  80    QLIST_ENTRY(BlockExport) next;
  81};
  82
  83BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp);
  84BlockExport *blk_exp_find(const char *id);
  85void blk_exp_ref(BlockExport *exp);
  86void blk_exp_unref(BlockExport *exp);
  87void blk_exp_request_shutdown(BlockExport *exp);
  88void blk_exp_close_all(void);
  89void blk_exp_close_all_type(BlockExportType type);
  90
  91#endif
  92