| #ifndef NBD_CLIENT_H | 
 | #define NBD_CLIENT_H | 
 |  | 
 | #include "qemu-common.h" | 
 | #include "block/nbd.h" | 
 | #include "block/block_int.h" | 
 |  | 
 | /* #define DEBUG_NBD */ | 
 |  | 
 | #if defined(DEBUG_NBD) | 
 | #define logout(fmt, ...) \ | 
 |     fprintf(stderr, "nbd\t%-24s" fmt, __func__, ##__VA_ARGS__) | 
 | #else | 
 | #define logout(fmt, ...) ((void)0) | 
 | #endif | 
 |  | 
 | #define MAX_NBD_REQUESTS    16 | 
 |  | 
 | typedef struct NbdClientSession { | 
 |     int sock; | 
 |     uint32_t nbdflags; | 
 |     off_t size; | 
 |  | 
 |     CoMutex send_mutex; | 
 |     CoMutex free_sema; | 
 |     Coroutine *send_coroutine; | 
 |     int in_flight; | 
 |  | 
 |     Coroutine *recv_coroutine[MAX_NBD_REQUESTS]; | 
 |     struct nbd_reply reply; | 
 |  | 
 |     bool is_unix; | 
 | } NbdClientSession; | 
 |  | 
 | NbdClientSession *nbd_get_client_session(BlockDriverState *bs); | 
 |  | 
 | int nbd_client_init(BlockDriverState *bs, int sock, const char *export_name, | 
 |                     Error **errp); | 
 | void nbd_client_close(BlockDriverState *bs); | 
 |  | 
 | int nbd_client_co_discard(BlockDriverState *bs, int64_t sector_num, | 
 |                           int nb_sectors); | 
 | int nbd_client_co_flush(BlockDriverState *bs); | 
 | int nbd_client_co_writev(BlockDriverState *bs, int64_t sector_num, | 
 |                          int nb_sectors, QEMUIOVector *qiov); | 
 | int nbd_client_co_readv(BlockDriverState *bs, int64_t sector_num, | 
 |                         int nb_sectors, QEMUIOVector *qiov); | 
 |  | 
 | void nbd_client_detach_aio_context(BlockDriverState *bs); | 
 | void nbd_client_attach_aio_context(BlockDriverState *bs, | 
 |                                    AioContext *new_context); | 
 |  | 
 | #endif /* NBD_CLIENT_H */ |