/*
 * Declarations for block exports
 *
 * Copyright (c) 2012, 2020 Red Hat, Inc.
 *
 * Authors:
 * Paolo Bonzini <pbonzini@redhat.com>
 * Kevin Wolf <kwolf@redhat.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or
 * later.  See the COPYING file in the top-level directory.
 */

#ifndef BLOCK_EXPORT_H
#define BLOCK_EXPORT_H

#include "qapi/qapi-types-block-export.h"
#include "qemu/queue.h"

typedef struct BlockExport BlockExport;

typedef struct BlockExportDriver {
    /* The export type that this driver services */
    BlockExportType type;

    /*
     * The size of the driver-specific state that contains BlockExport as its
     * first field.
     */
    size_t instance_size;

    /* Creates and starts a new block export */
    int (*create)(BlockExport *, BlockExportOptions *, Error **);

    /*
     * Frees a removed block export. This function is only called after all
     * references have been dropped.
     */
    void (*delete)(BlockExport *);

    /*
     * Start to disconnect all clients and drop other references held
     * internally by the export driver. When the function returns, there may
     * still be active references while the export is in the process of
     * shutting down.
     */
    void (*request_shutdown)(BlockExport *);
} BlockExportDriver;

struct BlockExport {
    const BlockExportDriver *drv;

    /* Unique identifier for the export */
    char *id;

    /*
     * Reference count for this block export. This includes strong references
     * both from the owner (qemu-nbd or the monitor) and clients connected to
     * the export.
     */
    int refcount;

    /*
     * True if one of the references in refcount belongs to the user. After the
     * user has dropped their reference, they may not e.g. remove the same
     * export a second time (which would decrease the refcount without having
     * it incremented first).
     */
    bool user_owned;

    /* The AioContext whose lock protects this BlockExport object. */
    AioContext *ctx;

    /* The block device to export */
    BlockBackend *blk;

    /* List entry for block_exports */
    QLIST_ENTRY(BlockExport) next;
};

BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp);
BlockExport *blk_exp_find(const char *id);
void blk_exp_ref(BlockExport *exp);
void blk_exp_unref(BlockExport *exp);
void blk_exp_request_shutdown(BlockExport *exp);
void blk_exp_close_all(void);
void blk_exp_close_all_type(BlockExportType type);

#endif
