aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/blktap2/drivers/Makefile2
-rw-r--r--tools/blktap2/drivers/block-log.c4
-rw-r--r--tools/blktap2/drivers/block-qcow.c2
-rw-r--r--tools/blktap2/drivers/block-remus.c2
-rw-r--r--tools/blktap2/drivers/tapdisk-diff.c4
-rw-r--r--tools/blktap2/drivers/tapdisk-log.c3
-rw-r--r--tools/blktap2/drivers/tapdisk-queue.c2
-rw-r--r--tools/blktap2/drivers/tapdisk-stream.c6
-rw-r--r--tools/blktap2/drivers/tapdisk-utils.c37
-rw-r--r--tools/blktap2/drivers/tapdisk-utils.h3
-rw-r--r--tools/blktap2/drivers/tapdisk2.c7
-rw-r--r--tools/blktap2/vhd/lib/libvhd-journal.c2
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;
}