Revision 0ddf08db

b/nbd.c
90 90

  
91 91
struct NBDExport {
92 92
    int refcount;
93
    void (*close)(NBDExport *exp);
94

  
93 95
    BlockDriverState *bs;
94 96
    off_t dev_offset;
95 97
    off_t size;
......
723 725
}
724 726

  
725 727
NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset,
726
                          off_t size, uint32_t nbdflags)
728
                          off_t size, uint32_t nbdflags,
729
                          void (*close)(NBDExport *))
727 730
{
728 731
    NBDExport *exp = g_malloc0(sizeof(NBDExport));
729 732
    QSIMPLEQ_INIT(&exp->requests);
......
733 736
    exp->dev_offset = dev_offset;
734 737
    exp->nbdflags = nbdflags;
735 738
    exp->size = size == -1 ? bdrv_getlength(bs) : size;
739
    exp->close = close;
736 740
    return exp;
737 741
}
738 742

  
......
761 765
    }
762 766

  
763 767
    if (--exp->refcount == 0) {
768
        if (exp->close) {
769
            exp->close(exp);
770
        }
771

  
764 772
        while (!QSIMPLEQ_EMPTY(&exp->requests)) {
765 773
            NBDRequest *first = QSIMPLEQ_FIRST(&exp->requests);
766 774
            QSIMPLEQ_REMOVE_HEAD(&exp->requests, entry);
b/nbd.h
79 79
typedef struct NBDClient NBDClient;
80 80

  
81 81
NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset,
82
                          off_t size, uint32_t nbdflags);
82
                          off_t size, uint32_t nbdflags,
83
                          void (*close)(NBDExport *));
83 84
void nbd_export_close(NBDExport *exp);
84 85
void nbd_export_get(NBDExport *exp);
85 86
void nbd_export_put(NBDExport *exp);
b/qemu-nbd.c
546 546
        }
547 547
    }
548 548

  
549
    exp = nbd_export_new(bs, dev_offset, fd_size, nbdflags);
549
    exp = nbd_export_new(bs, dev_offset, fd_size, nbdflags, NULL);
550 550

  
551 551
    if (sockpath) {
552 552
        fd = unix_socket_incoming(sockpath);

Also available in: Unified diff