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