Revision fc19f8a0 nbd.c
b/nbd.c | ||
---|---|---|
102 | 102 |
len = send(fd, buffer + offset, size - offset, 0); |
103 | 103 |
} |
104 | 104 |
|
105 |
if (len == -1)
|
|
105 |
if (len < 0) {
|
|
106 | 106 |
errno = socket_error(); |
107 | 107 |
|
108 |
/* recoverable error */ |
|
109 |
if (len == -1 && (errno == EAGAIN || errno == EINTR)) { |
|
110 |
continue; |
|
108 |
/* recoverable error */ |
|
109 |
if (errno == EINTR || errno == EAGAIN) { |
|
110 |
continue; |
|
111 |
} |
|
112 |
|
|
113 |
/* unrecoverable error */ |
|
114 |
return 0; |
|
111 | 115 |
} |
112 | 116 |
|
113 | 117 |
/* eof */ |
... | ... | |
115 | 119 |
break; |
116 | 120 |
} |
117 | 121 |
|
118 |
/* unrecoverable error */ |
|
119 |
if (len == -1) { |
|
120 |
return 0; |
|
121 |
} |
|
122 |
|
|
123 | 122 |
offset += len; |
124 | 123 |
} |
125 | 124 |
|
... | ... | |
364 | 363 |
{ |
365 | 364 |
TRACE("Setting NBD socket"); |
366 | 365 |
|
367 |
if (ioctl(fd, NBD_SET_SOCK, csock) == -1) {
|
|
366 |
if (ioctl(fd, NBD_SET_SOCK, csock) < 0) {
|
|
368 | 367 |
int serrno = errno; |
369 | 368 |
LOG("Failed to set NBD socket"); |
370 | 369 |
errno = serrno; |
... | ... | |
373 | 372 |
|
374 | 373 |
TRACE("Setting block size to %lu", (unsigned long)blocksize); |
375 | 374 |
|
376 |
if (ioctl(fd, NBD_SET_BLKSIZE, blocksize) == -1) {
|
|
375 |
if (ioctl(fd, NBD_SET_BLKSIZE, blocksize) < 0) {
|
|
377 | 376 |
int serrno = errno; |
378 | 377 |
LOG("Failed setting NBD block size"); |
379 | 378 |
errno = serrno; |
... | ... | |
382 | 381 |
|
383 | 382 |
TRACE("Setting size to %zd block(s)", (size_t)(size / blocksize)); |
384 | 383 |
|
385 |
if (ioctl(fd, NBD_SET_SIZE_BLOCKS, size / blocksize) == -1) {
|
|
384 |
if (ioctl(fd, NBD_SET_SIZE_BLOCKS, size / blocksize) < 0) {
|
|
386 | 385 |
int serrno = errno; |
387 | 386 |
LOG("Failed setting size (in blocks)"); |
388 | 387 |
errno = serrno; |
... | ... | |
430 | 429 |
TRACE("Doing NBD loop"); |
431 | 430 |
|
432 | 431 |
ret = ioctl(fd, NBD_DO_IT); |
433 |
if (ret == -1 && errno == EPIPE) {
|
|
432 |
if (ret < 0 && errno == EPIPE) {
|
|
434 | 433 |
/* NBD_DO_IT normally returns EPIPE when someone has disconnected |
435 | 434 |
* the socket via NBD_DISCONNECT. We do not want to return 1 in |
436 | 435 |
* that case. |
... | ... | |
714 | 713 |
|
715 | 714 |
if (!len) { |
716 | 715 |
rc = nbd_send_reply(csock, reply); |
717 |
if (rc == -1) {
|
|
716 |
if (rc < 0) {
|
|
718 | 717 |
rc = -errno; |
719 | 718 |
} |
720 | 719 |
} else { |
721 | 720 |
socket_set_cork(csock, 1); |
722 | 721 |
rc = nbd_send_reply(csock, reply); |
723 |
if (rc != -1) {
|
|
722 |
if (rc >= 0) {
|
|
724 | 723 |
ret = qemu_co_send(csock, req->data, len); |
725 | 724 |
if (ret != len) { |
726 | 725 |
errno = EIO; |
727 | 726 |
rc = -1; |
728 | 727 |
} |
729 | 728 |
} |
730 |
if (rc == -1) {
|
|
729 |
if (rc < 0) {
|
|
731 | 730 |
rc = -errno; |
732 | 731 |
} |
733 | 732 |
socket_set_cork(csock, 0); |
... | ... | |
746 | 745 |
ssize_t rc; |
747 | 746 |
|
748 | 747 |
client->recv_coroutine = qemu_coroutine_self(); |
749 |
if (nbd_receive_request(csock, request) == -1) {
|
|
748 |
if (nbd_receive_request(csock, request) < 0) {
|
|
750 | 749 |
rc = -EIO; |
751 | 750 |
goto out; |
752 | 751 |
} |
... | ... | |
860 | 859 |
} |
861 | 860 |
} |
862 | 861 |
|
863 |
if (nbd_co_send_reply(req, &reply, 0) < 0) |
|
862 |
if (nbd_co_send_reply(req, &reply, 0) < 0) {
|
|
864 | 863 |
goto out; |
864 |
} |
|
865 | 865 |
break; |
866 | 866 |
case NBD_CMD_DISC: |
867 | 867 |
TRACE("Request type is DISCONNECT"); |
... | ... | |
875 | 875 |
LOG("flush failed"); |
876 | 876 |
reply.error = -ret; |
877 | 877 |
} |
878 |
|
|
879 |
if (nbd_co_send_reply(req, &reply, 0) < 0) |
|
878 |
if (nbd_co_send_reply(req, &reply, 0) < 0) { |
|
880 | 879 |
goto out; |
880 |
} |
|
881 | 881 |
break; |
882 | 882 |
case NBD_CMD_TRIM: |
883 | 883 |
TRACE("Request type is TRIM"); |
... | ... | |
887 | 887 |
LOG("discard failed"); |
888 | 888 |
reply.error = -ret; |
889 | 889 |
} |
890 |
if (nbd_co_send_reply(req, &reply, 0) < 0) |
|
890 |
if (nbd_co_send_reply(req, &reply, 0) < 0) {
|
|
891 | 891 |
goto out; |
892 |
} |
|
892 | 893 |
break; |
893 | 894 |
default: |
894 | 895 |
LOG("invalid request type (%u) received", request.type); |
895 | 896 |
invalid_request: |
896 | 897 |
reply.error = -EINVAL; |
897 | 898 |
error_reply: |
898 |
if (nbd_co_send_reply(req, &reply, 0) == -1)
|
|
899 |
if (nbd_co_send_reply(req, &reply, 0) < 0) {
|
|
899 | 900 |
goto out; |
901 |
} |
|
900 | 902 |
break; |
901 | 903 |
} |
902 | 904 |
|
... | ... | |
939 | 941 |
void (*close)(NBDClient *)) |
940 | 942 |
{ |
941 | 943 |
NBDClient *client; |
942 |
if (nbd_send_negotiate(csock, exp->size, exp->nbdflags) == -1) {
|
|
944 |
if (nbd_send_negotiate(csock, exp->size, exp->nbdflags) < 0) {
|
|
943 | 945 |
return NULL; |
944 | 946 |
} |
945 | 947 |
client = g_malloc0(sizeof(NBDClient)); |
Also available in: Unified diff