Revision 0ddf08db nbd.c
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); |
Also available in: Unified diff