aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2012-05-14 17:02:16 +0100
committerKeir Fraser <keir@xen.org>2012-05-14 17:02:16 +0100
commit9dc1e494c80cfcc7114826e582e733c551968a55 (patch)
treecace68395854e35d43048c27455fa3142d0a8108
parent0eaff56cd6278f3ed91379ed941ad01056af5236 (diff)
downloadxen-9dc1e494c80cfcc7114826e582e733c551968a55.tar.gz
xen-9dc1e494c80cfcc7114826e582e733c551968a55.tar.bz2
xen-9dc1e494c80cfcc7114826e582e733c551968a55.zip
blktap2: Fix naked unchecked uses of read/write/chdir.
These cause warnings under warn_unused_result, and for read/write we ought to deal with partial io results. Signed-off-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 25299:01d64a3dea71 xen-unstable date: Fri May 11 18:30:29 2012 +0100 blktap2: Fix another uninitialised value error gcc -O1 -fno-omit-frame-pointer -m32 -march=i686 -g -fno-strict-aliasing -std=gnu99 -Wall -Wstrict-prototypes -Wdeclaration-after-statement -D__XEN_TOOLS__ -MMD -MF .block-remus.o.d -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -fno-optimize-sibling-calls -mno-tls-direct-seg-refs -Werror -g -Wno-unused -fno-strict-aliasing -I../include -I../drivers -I/home/osstest/build.12828.build-i386/xen-unstable/tools/blktap2/drivers/../../../tools/libxc -I/home/osstest/build.12828.build-i386/xen-unstable/tools/blktap2/drivers/../../../tools/include -D_GNU_SOURCE -DUSE_NFS_LOCKS -c -o block-remus.o block-remus.c block-remus.c: In function 'ramdisk_flush': block-remus.c:508: error: 'buf' may be used uninitialized in this function make[5]: *** [block-remus.o] Error 1 This is because gcc can see that merge_requests doesn't always set *mergedbuf but gcc isn't able to prove that it always does so if merge_requests returns 0 and that in that case the value of ramdisk_flush::buf isn't used. This is too useful a warning to disable, despite the occasional false positive of this form. The conventional approach is to suppress the warning by explicitly initialising the variable to 0. This has just come to light because 25275:27d63b9f111a reenabled optimisation for this area of code, and gcc's data flow analysis (which is required to trigger the uninitialised variable warning) only occurs when optimisation is turned on. Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com> xen-unstable changeset: 25281:60064411a8a9 xen-unstable date: Thu May 10 14:26:14 2012 +0100 blktap2: Do not build with -O0 Signed-off-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 25275:27d63b9f111a xen-unstable date: Thu May 10 11:22:18 2012 +0100 blktap2: Fix uninitialised value error. Signed-off-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 25274:cb82b5aa73bd xen-unstable date: Thu May 10 11:21:59 2012 +0100 tools/blktap2: fix out of bounds access in block-log.c block-log.c: In function 'ctl_close_sock': block-log.c:363:23: warning: array subscript is above array bounds [-Warray-bounds] Adjust loop condition in ctl_close_sock() to fix warning. Adjust array acccess in ctl_close() to actually access the array member. Signed-off-by: Olaf Hering <olaf@aepfle.de> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 25273:83a02f225bde xen-unstable date: Thu May 10 11:20:04 2012 +0100 tools/blktap2: fix build errors caused by Werror in vhd_journal_write_entry -O2 -Wall -Werror triggers these warnings: libvhd-journal.c: In function 'vhd_journal_write_entry': libvhd-journal.c:335: warning: statement with no effect Really return the error from vhd_journal_write() to caller. v2: - simplify the patch by just adding the missing return statement Signed-off-by: Olaf Hering <olaf@aepfle.de> Committed-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 25272:ca02580986d2 xen-unstable date: Thu May 10 11:19:05 2012 +0100
-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;
}