aboutsummaryrefslogtreecommitdiffstats
path: root/tools/blktap2
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2012-05-11 18:30:29 +0100
committerKeir Fraser <keir@xen.org>2012-05-11 18:30:29 +0100
commit343d66a666478e06e98b54be9ec8e9abfdfcd696 (patch)
tree58d77fb9f9b032ecf9286ac547dd9735f0815ebc /tools/blktap2
parentfebad9712fc544cdca87f5791872d4aa0d944f6a (diff)
downloadxen-343d66a666478e06e98b54be9ec8e9abfdfcd696.tar.gz
xen-343d66a666478e06e98b54be9ec8e9abfdfcd696.tar.bz2
xen-343d66a666478e06e98b54be9ec8e9abfdfcd696.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>
Diffstat (limited to 'tools/blktap2')
-rw-r--r--tools/blktap2/drivers/tapdisk-diff.c5
-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.c7
-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
7 files changed, 56 insertions, 8 deletions
diff --git a/tools/blktap2/drivers/tapdisk-diff.c b/tools/blktap2/drivers/tapdisk-diff.c
index 1d2ba8e682..056d4c9f60 100644
--- a/tools/blktap2/drivers/tapdisk-diff.c
+++ b/tools/blktap2/drivers/tapdisk-diff.c
@@ -39,6 +39,7 @@
#include "tapdisk-vbd.h"
#include "tapdisk-server.h"
#include "tapdisk-disktype.h"
+#include "tapdisk-utils.h"
#include "libvhd.h"
#define POLL_READ 0
@@ -170,7 +171,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;
}
@@ -180,7 +181,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 1795abddfd..b5b0fa7869 100644
--- a/tools/blktap2/drivers/tapdisk-stream.c
+++ b/tools/blktap2/drivers/tapdisk-stream.c
@@ -38,6 +38,7 @@
#include "tapdisk-vbd.h"
#include "tapdisk-server.h"
#include "tapdisk-disktype.h"
+#include "tapdisk-utils.h"
#define POLL_READ 0
#define POLL_WRITE 1
@@ -145,7 +146,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;
}
@@ -155,7 +156,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;
}
}
@@ -203,7 +204,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 1b15f12154..44840efbf8 100644
--- a/tools/blktap2/drivers/tapdisk-utils.c
+++ b/tools/blktap2/drivers/tapdisk-utils.c
@@ -175,3 +175,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 7b7c3d5e92..aced8ef492 100644
--- a/tools/blktap2/drivers/tapdisk-utils.h
+++ b/tools/blktap2/drivers/tapdisk-utils.h
@@ -39,4 +39,7 @@ int tapdisk_namedup(char **, const char *);
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 dae0b81efe..aebd861aa5 100644
--- a/tools/blktap2/drivers/tapdisk2.c
+++ b/tools/blktap2/drivers/tapdisk2.c
@@ -79,7 +79,12 @@ main(int argc, char *argv[])
if (optind != argc)
usage(argv[0], EINVAL);
- chdir("/");
+ if (chdir("/")) {
+ DPRINTF("failed to chdir(/): %d\n", errno);
+ err = 1;
+ goto out;
+ }
+
tapdisk_start_logging("tapdisk2");
err = tapdisk_server_init();