Revision 1743b515 nbd.c
b/nbd.c | ||
---|---|---|
600 | 600 |
QSIMPLEQ_HEAD(, NBDRequest) requests; |
601 | 601 |
}; |
602 | 602 |
|
603 |
struct NBDClient { |
|
604 |
int refcount; |
|
605 |
void (*close)(NBDClient *client); |
|
606 |
|
|
607 |
NBDExport *exp; |
|
608 |
int sock; |
|
609 |
}; |
|
610 |
|
|
611 |
static void nbd_client_get(NBDClient *client) |
|
612 |
{ |
|
613 |
client->refcount++; |
|
614 |
} |
|
615 |
|
|
616 |
static void nbd_client_put(NBDClient *client) |
|
617 |
{ |
|
618 |
if (--client->refcount == 0) { |
|
619 |
g_free(client); |
|
620 |
} |
|
621 |
} |
|
622 |
|
|
623 |
static void nbd_client_close(NBDClient *client) |
|
624 |
{ |
|
625 |
qemu_set_fd_handler2(client->sock, NULL, NULL, NULL, NULL); |
|
626 |
close(client->sock); |
|
627 |
client->sock = -1; |
|
628 |
if (client->close) { |
|
629 |
client->close(client); |
|
630 |
} |
|
631 |
nbd_client_put(client); |
|
632 |
} |
|
633 |
|
|
603 | 634 |
static NBDRequest *nbd_request_get(NBDExport *exp) |
604 | 635 |
{ |
605 | 636 |
NBDRequest *req; |
... | ... | |
712 | 743 |
return rc; |
713 | 744 |
} |
714 | 745 |
|
715 |
int nbd_trip(NBDExport *exp, int csock)
|
|
746 |
static int nbd_trip(NBDClient *client)
|
|
716 | 747 |
{ |
748 |
NBDExport *exp = client->exp; |
|
717 | 749 |
NBDRequest *req = nbd_request_get(exp); |
750 |
int csock = client->sock; |
|
718 | 751 |
struct nbd_request request; |
719 | 752 |
struct nbd_reply reply; |
720 | 753 |
int rc = -1; |
... | ... | |
836 | 869 |
return rc; |
837 | 870 |
} |
838 | 871 |
|
839 |
int nbd_negotiate(NBDExport *exp, int csock) |
|
872 |
static void nbd_read(void *opaque) |
|
873 |
{ |
|
874 |
NBDClient *client = opaque; |
|
875 |
|
|
876 |
nbd_client_get(client); |
|
877 |
if (nbd_trip(client) != 0) { |
|
878 |
nbd_client_close(client); |
|
879 |
} |
|
880 |
|
|
881 |
nbd_client_put(client); |
|
882 |
} |
|
883 |
|
|
884 |
NBDClient *nbd_client_new(NBDExport *exp, int csock, |
|
885 |
void (*close)(NBDClient *)) |
|
840 | 886 |
{ |
841 |
return nbd_send_negotiate(csock, exp->size, exp->nbdflags); |
|
887 |
NBDClient *client; |
|
888 |
if (nbd_send_negotiate(csock, exp->size, exp->nbdflags) == -1) { |
|
889 |
return NULL; |
|
890 |
} |
|
891 |
client = g_malloc0(sizeof(NBDClient)); |
|
892 |
client->refcount = 1; |
|
893 |
client->exp = exp; |
|
894 |
client->sock = csock; |
|
895 |
client->close = close; |
|
896 |
qemu_set_fd_handler2(csock, NULL, nbd_read, NULL, client); |
|
897 |
return client; |
|
842 | 898 |
} |
Also available in: Unified diff