Commit 8c6157b6 authored by Anton Ivanov's avatar Anton Ivanov Committed by Richard Weinberger

um: Update UBD to use pread/pwrite family of functions

This decreases the number of syscalls per read/write by half.
Signed-off-by: default avatarAnton Ivanov <aivanov@brocade.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 470a166e
...@@ -535,11 +535,7 @@ static int read_cow_bitmap(int fd, void *buf, int offset, int len) ...@@ -535,11 +535,7 @@ static int read_cow_bitmap(int fd, void *buf, int offset, int len)
{ {
int err; int err;
err = os_seek_file(fd, offset); err = os_pread_file(fd, buf, len, offset);
if (err < 0)
return err;
err = os_read_file(fd, buf, len);
if (err < 0) if (err < 0)
return err; return err;
...@@ -1377,14 +1373,8 @@ static int update_bitmap(struct io_thread_req *req) ...@@ -1377,14 +1373,8 @@ static int update_bitmap(struct io_thread_req *req)
if(req->cow_offset == -1) if(req->cow_offset == -1)
return 0; return 0;
n = os_seek_file(req->fds[1], req->cow_offset); n = os_pwrite_file(req->fds[1], &req->bitmap_words,
if(n < 0){ sizeof(req->bitmap_words), req->cow_offset);
printk("do_io - bitmap lseek failed : err = %d\n", -n);
return 1;
}
n = os_write_file(req->fds[1], &req->bitmap_words,
sizeof(req->bitmap_words));
if(n != sizeof(req->bitmap_words)){ if(n != sizeof(req->bitmap_words)){
printk("do_io - bitmap update failed, err = %d fd = %d\n", -n, printk("do_io - bitmap update failed, err = %d fd = %d\n", -n,
req->fds[1]); req->fds[1]);
...@@ -1399,7 +1389,6 @@ static void do_io(struct io_thread_req *req) ...@@ -1399,7 +1389,6 @@ static void do_io(struct io_thread_req *req)
char *buf; char *buf;
unsigned long len; unsigned long len;
int n, nsectors, start, end, bit; int n, nsectors, start, end, bit;
int err;
__u64 off; __u64 off;
if (req->op == UBD_FLUSH) { if (req->op == UBD_FLUSH) {
...@@ -1428,18 +1417,12 @@ static void do_io(struct io_thread_req *req) ...@@ -1428,18 +1417,12 @@ static void do_io(struct io_thread_req *req)
len = (end - start) * req->sectorsize; len = (end - start) * req->sectorsize;
buf = &req->buffer[start * req->sectorsize]; buf = &req->buffer[start * req->sectorsize];
err = os_seek_file(req->fds[bit], off);
if(err < 0){
printk("do_io - lseek failed : err = %d\n", -err);
req->error = 1;
return;
}
if(req->op == UBD_READ){ if(req->op == UBD_READ){
n = 0; n = 0;
do { do {
buf = &buf[n]; buf = &buf[n];
len -= n; len -= n;
n = os_read_file(req->fds[bit], buf, len); n = os_pread_file(req->fds[bit], buf, len, off);
if (n < 0) { if (n < 0) {
printk("do_io - read failed, err = %d " printk("do_io - read failed, err = %d "
"fd = %d\n", -n, req->fds[bit]); "fd = %d\n", -n, req->fds[bit]);
...@@ -1449,7 +1432,7 @@ static void do_io(struct io_thread_req *req) ...@@ -1449,7 +1432,7 @@ static void do_io(struct io_thread_req *req)
} while((n < len) && (n != 0)); } while((n < len) && (n != 0));
if (n < len) memset(&buf[n], 0, len - n); if (n < len) memset(&buf[n], 0, len - n);
} else { } else {
n = os_write_file(req->fds[bit], buf, len); n = os_pwrite_file(req->fds[bit], buf, len, off);
if(n != len){ if(n != len){
printk("do_io - write failed err = %d " printk("do_io - write failed err = %d "
"fd = %d\n", -n, req->fds[bit]); "fd = %d\n", -n, req->fds[bit]);
......
...@@ -146,6 +146,8 @@ extern int os_read_file(int fd, void *buf, int len); ...@@ -146,6 +146,8 @@ extern int os_read_file(int fd, void *buf, int len);
extern int os_write_file(int fd, const void *buf, int count); extern int os_write_file(int fd, const void *buf, int count);
extern int os_sync_file(int fd); extern int os_sync_file(int fd);
extern int os_file_size(const char *file, unsigned long long *size_out); extern int os_file_size(const char *file, unsigned long long *size_out);
extern int os_pread_file(int fd, void *buf, int len, unsigned long long offset);
extern int os_pwrite_file(int fd, const void *buf, int count, unsigned long long offset);
extern int os_file_modtime(const char *file, unsigned long *modtime); extern int os_file_modtime(const char *file, unsigned long *modtime);
extern int os_pipe(int *fd, int stream, int close_on_exec); extern int os_pipe(int *fd, int stream, int close_on_exec);
extern int os_set_fd_async(int fd); extern int os_set_fd_async(int fd);
......
...@@ -264,6 +264,15 @@ int os_read_file(int fd, void *buf, int len) ...@@ -264,6 +264,15 @@ int os_read_file(int fd, void *buf, int len)
return n; return n;
} }
int os_pread_file(int fd, void *buf, int len, unsigned long long offset)
{
int n = pread(fd, buf, len, offset);
if (n < 0)
return -errno;
return n;
}
int os_write_file(int fd, const void *buf, int len) int os_write_file(int fd, const void *buf, int len)
{ {
int n = write(fd, (void *) buf, len); int n = write(fd, (void *) buf, len);
...@@ -282,6 +291,16 @@ int os_sync_file(int fd) ...@@ -282,6 +291,16 @@ int os_sync_file(int fd)
return n; return n;
} }
int os_pwrite_file(int fd, const void *buf, int len, unsigned long long offset)
{
int n = pwrite(fd, (void *) buf, len, offset);
if (n < 0)
return -errno;
return n;
}
int os_file_size(const char *file, unsigned long long *size_out) int os_file_size(const char *file, unsigned long long *size_out)
{ {
struct uml_stat buf; struct uml_stat buf;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment