um: Update UBD to use pread/pwrite family of functions
This decreases the number of syscalls per read/write by half. Signed-off-by: Anton Ivanov <aivanov@brocade.com> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
470a166e8c
commit
8c6157b6b3
|
@ -535,11 +535,7 @@ static int read_cow_bitmap(int fd, void *buf, int offset, int len)
|
|||
{
|
||||
int err;
|
||||
|
||||
err = os_seek_file(fd, offset);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = os_read_file(fd, buf, len);
|
||||
err = os_pread_file(fd, buf, len, offset);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
|
@ -1377,14 +1373,8 @@ static int update_bitmap(struct io_thread_req *req)
|
|||
if(req->cow_offset == -1)
|
||||
return 0;
|
||||
|
||||
n = os_seek_file(req->fds[1], req->cow_offset);
|
||||
if(n < 0){
|
||||
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));
|
||||
n = os_pwrite_file(req->fds[1], &req->bitmap_words,
|
||||
sizeof(req->bitmap_words), req->cow_offset);
|
||||
if(n != sizeof(req->bitmap_words)){
|
||||
printk("do_io - bitmap update failed, err = %d fd = %d\n", -n,
|
||||
req->fds[1]);
|
||||
|
@ -1399,7 +1389,6 @@ static void do_io(struct io_thread_req *req)
|
|||
char *buf;
|
||||
unsigned long len;
|
||||
int n, nsectors, start, end, bit;
|
||||
int err;
|
||||
__u64 off;
|
||||
|
||||
if (req->op == UBD_FLUSH) {
|
||||
|
@ -1428,18 +1417,12 @@ static void do_io(struct io_thread_req *req)
|
|||
len = (end - 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){
|
||||
n = 0;
|
||||
do {
|
||||
buf = &buf[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) {
|
||||
printk("do_io - read failed, err = %d "
|
||||
"fd = %d\n", -n, req->fds[bit]);
|
||||
|
@ -1449,7 +1432,7 @@ static void do_io(struct io_thread_req *req)
|
|||
} while((n < len) && (n != 0));
|
||||
if (n < len) memset(&buf[n], 0, len - n);
|
||||
} else {
|
||||
n = os_write_file(req->fds[bit], buf, len);
|
||||
n = os_pwrite_file(req->fds[bit], buf, len, off);
|
||||
if(n != len){
|
||||
printk("do_io - write failed err = %d "
|
||||
"fd = %d\n", -n, req->fds[bit]);
|
||||
|
|
|
@ -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_sync_file(int fd);
|
||||
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_pipe(int *fd, int stream, int close_on_exec);
|
||||
extern int os_set_fd_async(int fd);
|
||||
|
|
|
@ -264,6 +264,15 @@ int os_read_file(int fd, void *buf, int len)
|
|||
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 n = write(fd, (void *) buf, len);
|
||||
|
@ -282,6 +291,16 @@ int os_sync_file(int fd)
|
|||
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)
|
||||
{
|
||||
struct uml_stat buf;
|
||||
|
|
Loading…
Reference in New Issue