diff options
-rw-r--r-- | tools/blktap2/drivers/Makefile | 2 | ||||
-rw-r--r-- | tools/blktap2/drivers/block-log.c | 4 | ||||
-rw-r--r-- | tools/blktap2/drivers/block-qcow.c | 2 | ||||
-rw-r--r-- | tools/blktap2/drivers/block-remus.c | 2 | ||||
-rw-r--r-- | tools/blktap2/drivers/tapdisk-diff.c | 4 | ||||
-rw-r--r-- | tools/blktap2/drivers/tapdisk-log.c | 3 | ||||
-rw-r--r-- | tools/blktap2/drivers/tapdisk-queue.c | 2 | ||||
-rw-r--r-- | tools/blktap2/drivers/tapdisk-stream.c | 6 | ||||
-rw-r--r-- | tools/blktap2/drivers/tapdisk-utils.c | 37 | ||||
-rw-r--r-- | tools/blktap2/drivers/tapdisk-utils.h | 3 | ||||
-rw-r--r-- | tools/blktap2/drivers/tapdisk2.c | 7 | ||||
-rw-r--r-- | tools/blktap2/vhd/lib/libvhd-journal.c | 2 |
12 files changed, 60 insertions, 14 deletions
diff --git a/tools/blktap2/drivers/Makefile b/tools/blktap2/drivers/Makefile index 959fa76bf2..5a3cd9a2a9 100644 --- a/tools/blktap2/drivers/Makefile +++ b/tools/blktap2/drivers/Makefile @@ -9,7 +9,7 @@ QCOW_UTIL = img2qcow qcow-create qcow2raw LOCK_UTIL = lock-util INST_DIR = $(SBINDIR) -CFLAGS += -Werror -g -O0 +CFLAGS += -Werror -g CFLAGS += -Wno-unused CFLAGS += -fno-strict-aliasing CFLAGS += -I../lib -I../../libxc diff --git a/tools/blktap2/drivers/block-log.c b/tools/blktap2/drivers/block-log.c index c9612a4b9b..a03565b65e 100644 --- a/tools/blktap2/drivers/block-log.c +++ b/tools/blktap2/drivers/block-log.c @@ -347,11 +347,11 @@ static int ctl_open(struct tdlog_state* s, const char* name) static int ctl_close(struct tdlog_state* s) { while (s->connected) { + s->connected--; tapdisk_server_unregister_event(s->connections[s->connected].id); close(s->connections[s->connected].fd); s->connections[s->connected].fd = -1; s->connections[s->connected].id = 0; - s->connected--; } if (s->ctl.fd >= 0) { @@ -382,7 +382,7 @@ static int ctl_close_sock(struct tdlog_state* s, int fd) { int i; - for (i = 0; i <= s->connected; i++) { + for (i = 0; i < s->connected; i++) { if (s->connections[i].fd == fd) { tapdisk_server_unregister_event(s->connections[i].id); close(s->connections[i].fd); diff --git a/tools/blktap2/drivers/block-qcow.c b/tools/blktap2/drivers/block-qcow.c index 13d6c324ea..a0e827a4e4 100644 --- a/tools/blktap2/drivers/block-qcow.c +++ b/tools/blktap2/drivers/block-qcow.c @@ -1457,7 +1457,7 @@ int tdqcow_get_parent_id(td_driver_t *driver, td_disk_id_t *id) { off_t off; char *buf, *filename; - int len, secs, type, err = -EINVAL; + int len, secs, type = 0, err = -EINVAL; struct tdqcow_state *child = (struct tdqcow_state *)driver->data; if (!child->backing_file_offset) diff --git a/tools/blktap2/drivers/block-remus.c b/tools/blktap2/drivers/block-remus.c index f6da984e27..58ca16049d 100644 --- a/tools/blktap2/drivers/block-remus.c +++ b/tools/blktap2/drivers/block-remus.c @@ -481,7 +481,7 @@ static char* merge_requests(struct ramdisk* ramdisk, uint64_t start, static int ramdisk_flush(td_driver_t *driver, struct tdremus_state* s) { uint64_t* sectors; - char* buf; + char* buf = NULL; uint64_t base, batchlen; int i, j, count = 0; diff --git a/tools/blktap2/drivers/tapdisk-diff.c b/tools/blktap2/drivers/tapdisk-diff.c index 0a36c430d4..5734810ee9 100644 --- a/tools/blktap2/drivers/tapdisk-diff.c +++ b/tools/blktap2/drivers/tapdisk-diff.c @@ -169,7 +169,7 @@ tapdisk_stream_poll_clear(struct tapdisk_stream_poll *p) { int dummy; - read(p->pipe[POLL_READ], &dummy, sizeof(dummy)); + read_exact(p->pipe[POLL_READ], &dummy, sizeof(dummy)); p->set = 0; } @@ -179,7 +179,7 @@ tapdisk_stream_poll_set(struct tapdisk_stream_poll *p) int dummy = 0; if (!p->set) { - write(p->pipe[POLL_WRITE], &dummy, sizeof(dummy)); + write_exact(p->pipe[POLL_WRITE], &dummy, sizeof(dummy)); p->set = 1; } } diff --git a/tools/blktap2/drivers/tapdisk-log.c b/tools/blktap2/drivers/tapdisk-log.c index 1220bf927e..d14da32415 100644 --- a/tools/blktap2/drivers/tapdisk-log.c +++ b/tools/blktap2/drivers/tapdisk-log.c @@ -37,6 +37,7 @@ #include <sys/time.h> #include "tapdisk-log.h" +#include "tapdisk-utils.h" #define MAX_ENTRY_LEN 512 #define MAX_ERROR_MESSAGES 16 @@ -247,7 +248,7 @@ tlog_flush(void) wsize = ((size + 511) & (~511)); memset(tapdisk_log.buf + size, '\n', wsize - size); - write(fd, tapdisk_log.buf, wsize); + write_exact(fd, tapdisk_log.buf, wsize); tapdisk_log.p = tapdisk_log.buf; diff --git a/tools/blktap2/drivers/tapdisk-queue.c b/tools/blktap2/drivers/tapdisk-queue.c index b6394bfdad..1a9403828b 100644 --- a/tools/blktap2/drivers/tapdisk-queue.c +++ b/tools/blktap2/drivers/tapdisk-queue.c @@ -435,7 +435,7 @@ tapdisk_lio_ack_event(struct tqueue *queue) uint64_t val; if (lio->flags & LIO_FLAG_EVENTFD) - read(lio->event_fd, &val, sizeof(val)); + read_exact(lio->event_fd, &val, sizeof(val)); } static void diff --git a/tools/blktap2/drivers/tapdisk-stream.c b/tools/blktap2/drivers/tapdisk-stream.c index 8fa9d9e0bf..9d04be6adc 100644 --- a/tools/blktap2/drivers/tapdisk-stream.c +++ b/tools/blktap2/drivers/tapdisk-stream.c @@ -144,7 +144,7 @@ tapdisk_stream_poll_clear(struct tapdisk_stream_poll *p) { int dummy; - read(p->pipe[POLL_READ], &dummy, sizeof(dummy)); + read_exact(p->pipe[POLL_READ], &dummy, sizeof(dummy)); p->set = 0; } @@ -154,7 +154,7 @@ tapdisk_stream_poll_set(struct tapdisk_stream_poll *p) int dummy = 0; if (!p->set) { - write(p->pipe[POLL_WRITE], &dummy, sizeof(dummy)); + write_exact(p->pipe[POLL_WRITE], &dummy, sizeof(dummy)); p->set = 1; } } @@ -202,7 +202,7 @@ tapdisk_stream_print_request(struct tapdisk_stream *s, { unsigned long idx = (unsigned long)tapdisk_stream_request_idx(s, sreq); char *buf = (char *)MMAP_VADDR(s->vbd->ring.vstart, idx, 0); - write(s->out_fd, buf, sreq->secs << SECTOR_SHIFT); + write_exact(s->out_fd, buf, sreq->secs << SECTOR_SHIFT); } static void diff --git a/tools/blktap2/drivers/tapdisk-utils.c b/tools/blktap2/drivers/tapdisk-utils.c index 757c0bdc77..124fce8aab 100644 --- a/tools/blktap2/drivers/tapdisk-utils.c +++ b/tools/blktap2/drivers/tapdisk-utils.c @@ -215,3 +215,40 @@ int tapdisk_linux_version(void) } #endif +int read_exact(int fd, void *data, size_t size) +{ + size_t offset = 0; + ssize_t len; + + while ( offset < size ) + { + len = read(fd, (char *)data + offset, size - offset); + if ( (len == -1) && (errno == EINTR) ) + continue; + if ( len == 0 ) + errno = 0; + if ( len <= 0 ) + return -1; + offset += len; + } + + return 0; +} + +int write_exact(int fd, const void *data, size_t size) +{ + size_t offset = 0; + ssize_t len; + + while ( offset < size ) + { + len = write(fd, (const char *)data + offset, size - offset); + if ( (len == -1) && (errno == EINTR) ) + continue; + if ( len <= 0 ) + return -1; + offset += len; + } + + return 0; +} diff --git a/tools/blktap2/drivers/tapdisk-utils.h b/tools/blktap2/drivers/tapdisk-utils.h index 5e08aa8326..0180516346 100644 --- a/tools/blktap2/drivers/tapdisk-utils.h +++ b/tools/blktap2/drivers/tapdisk-utils.h @@ -40,4 +40,7 @@ int tapdisk_parse_disk_type(const char *, char **, int *); int tapdisk_get_image_size(int, uint64_t *, uint32_t *); int tapdisk_linux_version(void); +int read_exact(int fd, void *data, size_t size); /* EOF => -1, errno=0 */ +int write_exact(int fd, const void *data, size_t size); + #endif diff --git a/tools/blktap2/drivers/tapdisk2.c b/tools/blktap2/drivers/tapdisk2.c index 961bad6c2f..5804f84221 100644 --- a/tools/blktap2/drivers/tapdisk2.c +++ b/tools/blktap2/drivers/tapdisk2.c @@ -330,7 +330,12 @@ tapdisk2_create_device(const char *params) char *path; int err, type; - chdir("/"); + if (chdir("/")) { + DPRINTF("failed to chdir(/): %d\n", errno); + err = 1; + goto out; + } + tapdisk_start_logging("tapdisk2"); err = tapdisk2_set_child_fds(); diff --git a/tools/blktap2/vhd/lib/libvhd-journal.c b/tools/blktap2/vhd/lib/libvhd-journal.c index 24383ff62b..2cd0c9a6af 100644 --- a/tools/blktap2/vhd/lib/libvhd-journal.c +++ b/tools/blktap2/vhd/lib/libvhd-journal.c @@ -332,7 +332,7 @@ vhd_journal_write_entry(vhd_journal_t *j, vhd_journal_entry_t *entry) err = vhd_journal_write(j, &e, sizeof(vhd_journal_entry_t)); if (err) - err; + return err; return 0; } |