summaryrefslogtreecommitdiffstats
path: root/arch/um/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/drivers')
-rw-r--r--arch/um/drivers/cow.h2
-rw-r--r--arch/um/drivers/cow_sys.h6
-rw-r--r--arch/um/drivers/cow_user.c24
-rw-r--r--arch/um/drivers/net_user.c34
-rw-r--r--arch/um/drivers/ubd_kern.c2
5 files changed, 41 insertions, 27 deletions
diff --git a/arch/um/drivers/cow.h b/arch/um/drivers/cow.h
index dc36b22..04e3958 100644
--- a/arch/um/drivers/cow.h
+++ b/arch/um/drivers/cow.h
@@ -46,7 +46,7 @@ extern int file_reader(__u64 offset, char *buf, int len, void *arg);
extern int read_cow_header(int (*reader)(__u64, char *, int, void *),
void *arg, __u32 *version_out,
char **backing_file_out, time_t *mtime_out,
- unsigned long long *size_out, int *sectorsize_out,
+ __u64 *size_out, int *sectorsize_out,
__u32 *align_out, int *bitmap_offset_out);
extern int write_cow_header(char *cow_file, int fd, char *backing_file,
diff --git a/arch/um/drivers/cow_sys.h b/arch/um/drivers/cow_sys.h
index c83fc5d..94de4ea 100644
--- a/arch/um/drivers/cow_sys.h
+++ b/arch/um/drivers/cow_sys.h
@@ -23,17 +23,17 @@ static inline char *cow_strdup(char *str)
return(uml_strdup(str));
}
-static inline int cow_seek_file(int fd, unsigned long long offset)
+static inline int cow_seek_file(int fd, __u64 offset)
{
return(os_seek_file(fd, offset));
}
-static inline int cow_file_size(char *file, unsigned long long *size_out)
+static inline int cow_file_size(char *file, __u64 *size_out)
{
return(os_file_size(file, size_out));
}
-static inline int cow_write_file(int fd, char *buf, int size)
+static inline int cow_write_file(int fd, void *buf, int size)
{
return(os_write_file(fd, buf, size));
}
diff --git a/arch/um/drivers/cow_user.c b/arch/um/drivers/cow_user.c
index fbe2217..61951b7 100644
--- a/arch/um/drivers/cow_user.c
+++ b/arch/um/drivers/cow_user.c
@@ -176,7 +176,7 @@ int write_cow_header(char *cow_file, int fd, char *backing_file,
err = -ENOMEM;
header = cow_malloc(sizeof(*header));
if(header == NULL){
- cow_printf("Failed to allocate COW V3 header\n");
+ cow_printf("write_cow_header - failed to allocate COW V3 header\n");
goto out;
}
header->magic = htonl(COW_MAGIC);
@@ -196,15 +196,17 @@ int write_cow_header(char *cow_file, int fd, char *backing_file,
err = os_file_modtime(header->backing_file, &modtime);
if(err < 0){
- cow_printf("Backing file '%s' mtime request failed, "
- "err = %d\n", header->backing_file, -err);
+ cow_printf("write_cow_header - backing file '%s' mtime "
+ "request failed, err = %d\n", header->backing_file,
+ -err);
goto out_free;
}
err = cow_file_size(header->backing_file, size);
if(err < 0){
- cow_printf("Couldn't get size of backing file '%s', "
- "err = %d\n", header->backing_file, -err);
+ cow_printf("write_cow_header - couldn't get size of "
+ "backing file '%s', err = %d\n",
+ header->backing_file, -err);
goto out_free;
}
@@ -214,10 +216,11 @@ int write_cow_header(char *cow_file, int fd, char *backing_file,
header->alignment = htonl(alignment);
header->cow_format = COW_BITMAP;
- err = os_write_file(fd, header, sizeof(*header));
+ err = cow_write_file(fd, header, sizeof(*header));
if(err != sizeof(*header)){
- cow_printf("Write of header to new COW file '%s' failed, "
- "err = %d\n", cow_file, -err);
+ cow_printf("write_cow_header - write of header to "
+ "new COW file '%s' failed, err = %d\n", cow_file,
+ -err);
goto out_free;
}
err = 0;
@@ -299,7 +302,7 @@ int read_cow_header(int (*reader)(__u64, char *, int, void *), void *arg,
}
else if(version == 3){
if(n < sizeof(header->v3)){
- cow_printf("read_cow_header - failed to read V2 "
+ cow_printf("read_cow_header - failed to read V3 "
"header\n");
goto out;
}
@@ -359,7 +362,8 @@ int init_cow_file(int fd, char *cow_file, char *backing_file, int sectorsize,
if(err != sizeof(zero)){
cow_printf("Write of bitmap to new COW file '%s' failed, "
"err = %d\n", cow_file, -err);
- err = -EINVAL;
+ if (err >= 0)
+ err = -EINVAL;
goto out;
}
diff --git a/arch/um/drivers/net_user.c b/arch/um/drivers/net_user.c
index 098fa65..0e2f061 100644
--- a/arch/um/drivers/net_user.c
+++ b/arch/um/drivers/net_user.c
@@ -47,10 +47,12 @@ void tap_check_ips(char *gate_addr, unsigned char *eth_addr)
}
}
+/* Do reliable error handling as this fails frequently enough. */
void read_output(int fd, char *output, int len)
{
- int remain, n, actual;
+ int remain, ret, expected;
char c;
+ char *str;
if(output == NULL){
output = &c;
@@ -58,23 +60,31 @@ void read_output(int fd, char *output, int len)
}
*output = '\0';
- n = os_read_file(fd, &remain, sizeof(remain));
- if(n != sizeof(remain)){
- printk("read_output - read of length failed, err = %d\n", -n);
- return;
+ ret = os_read_file(fd, &remain, sizeof(remain));
+
+ if (ret != sizeof(remain)) {
+ expected = sizeof(remain);
+ str = "length";
+ goto err;
}
while(remain != 0){
- n = (remain < len) ? remain : len;
- actual = os_read_file(fd, output, n);
- if(actual != n){
- printk("read_output - read of data failed, "
- "err = %d\n", -actual);
- return;
+ expected = (remain < len) ? remain : len;
+ ret = os_read_file(fd, output, expected);
+ if (ret != expected) {
+ str = "data";
+ goto err;
}
- remain -= actual;
+ remain -= ret;
}
+
return;
+
+err:
+ if (ret < 0)
+ printk("read_output - read of %s failed, errno = %d\n", str, -ret);
+ else
+ printk("read_output - read of %s failed, read only %d of %d bytes\n", str, ret, expected);
}
int net_read(int fd, void *buf, int len)
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 101efd2..fa617e0 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -1135,7 +1135,7 @@ static int path_requires_switch(char *from_cmdline, char *from_cow, char *cow)
static int backing_file_mismatch(char *file, __u64 size, time_t mtime)
{
unsigned long modtime;
- long long actual;
+ unsigned long long actual;
int err;
err = os_file_modtime(file, &modtime);
OpenPOWER on IntegriCloud