Commit b90ae65c authored by Pavel Emelyanov's avatar Pavel Emelyanov

img: Prepare to use bfd engine

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 67bbc7ea
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <stdio.h> #include <stdio.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/uio.h>
#include "log.h" #include "log.h"
#include "bfd.h" #include "bfd.h"
...@@ -95,7 +96,8 @@ int bfdopen(struct bfd *f) ...@@ -95,7 +96,8 @@ int bfdopen(struct bfd *f)
void bclose(struct bfd *f) void bclose(struct bfd *f)
{ {
buf_put(&f->b); if (bfd_buffered(f))
buf_put(&f->b);
close(f->fd); close(f->fd);
} }
...@@ -185,3 +187,18 @@ again: ...@@ -185,3 +187,18 @@ again:
goto again; goto again;
} }
int bwrite(struct bfd *bfd, const void *buf, int size)
{
return write(bfd->fd, buf, size);
}
int bwritev(struct bfd *bfd, const struct iovec *iov, int cnt)
{
return writev(bfd->fd, iov, cnt);
}
int bread(struct bfd *bfd, void *buf, int size)
{
return read(bfd->fd, buf, size);
}
...@@ -229,7 +229,12 @@ struct cr_img *open_image_at(int dfd, int type, unsigned long flags, ...) ...@@ -229,7 +229,12 @@ struct cr_img *open_image_at(int dfd, int type, unsigned long flags, ...)
goto err; goto err;
} }
img->_fd = ret; img->_x.fd = ret;
if (oflags & O_NOBUF)
bfd_setraw(&img->_x);
else if (bfdopen(&img->_x))
goto err;
if (imgset_template[type].magic == RAW_IMAGE_MAGIC) if (imgset_template[type].magic == RAW_IMAGE_MAGIC)
goto skip_magic; goto skip_magic;
...@@ -258,7 +263,7 @@ errn: ...@@ -258,7 +263,7 @@ errn:
void close_image(struct cr_img *img) void close_image(struct cr_img *img)
{ {
close(img->_fd); bclose(&img->_x);
xfree(img); xfree(img);
} }
...@@ -267,8 +272,11 @@ struct cr_img *img_from_fd(int fd) ...@@ -267,8 +272,11 @@ struct cr_img *img_from_fd(int fd)
struct cr_img *img; struct cr_img *img;
img = xmalloc(sizeof(*img)); img = xmalloc(sizeof(*img));
if (img) if (img) {
img->_fd = fd; img->_x.fd = fd;
bfd_setraw(&img->_x);
}
return img; return img;
} }
...@@ -355,10 +363,9 @@ struct cr_img *open_pages_image(unsigned long flags, struct cr_img *pmi) ...@@ -355,10 +363,9 @@ struct cr_img *open_pages_image(unsigned long flags, struct cr_img *pmi)
*/ */
int write_img_buf(struct cr_img *img, const void *ptr, int size) int write_img_buf(struct cr_img *img, const void *ptr, int size)
{ {
int fd = img->_fd;
int ret; int ret;
ret = write(fd, ptr, size); ret = bwrite(&img->_x, ptr, size);
if (ret == size) if (ret == size)
return 0; return 0;
...@@ -378,10 +385,9 @@ int write_img_buf(struct cr_img *img, const void *ptr, int size) ...@@ -378,10 +385,9 @@ int write_img_buf(struct cr_img *img, const void *ptr, int size)
*/ */
int read_img_buf_eof(struct cr_img *img, void *ptr, int size) int read_img_buf_eof(struct cr_img *img, void *ptr, int size)
{ {
int fd = img->_fd;
int ret; int ret;
ret = read(fd, ptr, size); ret = bread(&img->_x, ptr, size);
if (ret == size) if (ret == size)
return 1; return 1;
if (ret == 0) if (ret == 0)
......
...@@ -13,8 +13,22 @@ struct bfd { ...@@ -13,8 +13,22 @@ struct bfd {
struct xbuf b; struct xbuf b;
}; };
static inline bool bfd_buffered(struct bfd *b)
{
return b->b.mem != NULL;
}
static inline void bfd_setraw(struct bfd *b)
{
b->b.mem = NULL;
}
#define BREADERR ((char *)-1) #define BREADERR ((char *)-1)
int bfdopen(struct bfd *f); int bfdopen(struct bfd *f);
void bclose(struct bfd *f); void bclose(struct bfd *f);
char *breadline(struct bfd *f); char *breadline(struct bfd *f);
int bwrite(struct bfd *f, const void *buf, int sz);
struct iovec;
int bwritev(struct bfd *f, const struct iovec *iov, int cnt);
int bread(struct bfd *f, void *buf, int sz);
#endif #endif
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#include "image-desc.h" #include "image-desc.h"
#include "fcntl.h" #include "fcntl.h"
#include "magic.h" #include "magic.h"
#include "bfd.h"
#include "bug.h"
#define PAGE_IMAGE_SIZE 4096 #define PAGE_IMAGE_SIZE 4096
#define PAGE_RSS 1 #define PAGE_RSS 1
...@@ -77,12 +79,13 @@ extern bool ns_per_id; ...@@ -77,12 +79,13 @@ extern bool ns_per_id;
#define O_RSTR (O_RDONLY) #define O_RSTR (O_RDONLY)
struct cr_img { struct cr_img {
int _fd; struct bfd _x;
}; };
static inline int img_raw_fd(struct cr_img *img) static inline int img_raw_fd(struct cr_img *img)
{ {
return img->_fd; BUG_ON(bfd_buffered(&img->_x));
return img->_x.fd;
} }
extern int open_image_dir(char *dir); extern int open_image_dir(char *dir);
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "string.h" #include "string.h"
#include "sockets.h" #include "sockets.h"
#include "cr_options.h" #include "cr_options.h"
#include "bfd.h"
#include "protobuf.h" #include "protobuf.h"
/* /*
...@@ -494,7 +494,7 @@ void do_pb_show_plain(struct cr_img *img, int type, int single_entry, ...@@ -494,7 +494,7 @@ void do_pb_show_plain(struct cr_img *img, int type, int single_entry,
static char *image_name(struct cr_img *img) static char *image_name(struct cr_img *img)
{ {
int fd = img->_fd; int fd = img->_x.fd;
static char image_path[PATH_MAX]; static char image_path[PATH_MAX];
if (read_fd_link(fd, image_path, sizeof(image_path)) > 0) if (read_fd_link(fd, image_path, sizeof(image_path)) > 0)
...@@ -515,7 +515,6 @@ static char *image_name(struct cr_img *img) ...@@ -515,7 +515,6 @@ static char *image_name(struct cr_img *img)
int do_pb_read_one(struct cr_img *img, void **pobj, int type, bool eof) int do_pb_read_one(struct cr_img *img, void **pobj, int type, bool eof)
{ {
int fd = img->_fd;
u8 local[PB_PKOBJ_LOCAL_SIZE]; u8 local[PB_PKOBJ_LOCAL_SIZE];
void *buf = (void *)&local; void *buf = (void *)&local;
u32 size; u32 size;
...@@ -529,7 +528,7 @@ int do_pb_read_one(struct cr_img *img, void **pobj, int type, bool eof) ...@@ -529,7 +528,7 @@ int do_pb_read_one(struct cr_img *img, void **pobj, int type, bool eof)
*pobj = NULL; *pobj = NULL;
ret = read(fd, &size, sizeof(size)); ret = bread(&img->_x, &size, sizeof(size));
if (ret == 0) { if (ret == 0) {
if (eof) { if (eof) {
return 0; return 0;
...@@ -552,7 +551,7 @@ int do_pb_read_one(struct cr_img *img, void **pobj, int type, bool eof) ...@@ -552,7 +551,7 @@ int do_pb_read_one(struct cr_img *img, void **pobj, int type, bool eof)
goto err; goto err;
} }
ret = read(fd, buf, size); ret = bread(&img->_x, buf, size);
if (ret < 0) { if (ret < 0) {
pr_perror("Can't read %d bytes from file %s", pr_perror("Can't read %d bytes from file %s",
size, image_name(img)); size, image_name(img));
...@@ -590,7 +589,6 @@ err: ...@@ -590,7 +589,6 @@ err:
*/ */
int pb_write_one(struct cr_img *img, void *obj, int type) int pb_write_one(struct cr_img *img, void *obj, int type)
{ {
int fd = img->_fd;
u8 local[PB_PKOBJ_LOCAL_SIZE]; u8 local[PB_PKOBJ_LOCAL_SIZE];
void *buf = (void *)&local; void *buf = (void *)&local;
u32 size, packed; u32 size, packed;
...@@ -620,7 +618,7 @@ int pb_write_one(struct cr_img *img, void *obj, int type) ...@@ -620,7 +618,7 @@ int pb_write_one(struct cr_img *img, void *obj, int type)
iov[1].iov_base = buf; iov[1].iov_base = buf;
iov[1].iov_len = size; iov[1].iov_len = size;
ret = writev(fd, iov, 2); ret = bwritev(&img->_x, iov, 2);
if (ret != size + sizeof(size)) { if (ret != size + sizeof(size)) {
pr_perror("Can't write %d bytes", (int)(size + sizeof(size))); pr_perror("Can't write %d bytes", (int)(size + sizeof(size)));
goto err; goto err;
......
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