Commit 1ef5ca82 authored by Pavel Emelyanov's avatar Pavel Emelyanov

bfd: Check images got flushed at the end

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 7688fbc1
...@@ -97,6 +97,12 @@ int bfdopen(struct bfd *f) ...@@ -97,6 +97,12 @@ int bfdopen(struct bfd *f)
} }
static int bflush(struct bfd *bfd); static int bflush(struct bfd *bfd);
static bool flush_failed = false;
int bfd_flush_images(void)
{
return flush_failed ? -1 : 0;
}
void bclose(struct bfd *f) void bclose(struct bfd *f)
{ {
...@@ -107,15 +113,18 @@ void bclose(struct bfd *f) ...@@ -107,15 +113,18 @@ void bclose(struct bfd *f)
* becase we read _all_ data from them and the * becase we read _all_ data from them and the
* b->sz would be 0 by the time we close them. * b->sz would be 0 by the time we close them.
*/ */
if (bflush(f) < 0) if (bflush(f) < 0) {
/* /*
* FIXME -- propagate error up. It's * This is to propagate error up. It's
* hardly possible by returning and * hardly possible by returning and
* checking it, but setting a static * checking it, but setting a static
* flag, failing further bfdopen-s and * flag, failing further bfdopen-s and
* checking one at the end would work. * checking one at the end would work.
*/ */
flush_failed = true;
pr_perror("Error flushing image"); pr_perror("Error flushing image");
}
buf_put(&f->b); buf_put(&f->b);
} }
close(f->fd); close(f->fd);
......
...@@ -1766,6 +1766,9 @@ err: ...@@ -1766,6 +1766,9 @@ err:
if (disconnect_from_page_server()) if (disconnect_from_page_server())
ret = -1; ret = -1;
if (bfd_flush_images())
ret = -1;
if (ret) if (ret)
pr_err("Pre-dumping FAILED.\n"); pr_err("Pre-dumping FAILED.\n");
else { else {
...@@ -1891,6 +1894,9 @@ err: ...@@ -1891,6 +1894,9 @@ err:
close_cr_imgset(&glob_imgset); close_cr_imgset(&glob_imgset);
if (bfd_flush_images())
ret = -1;
cr_plugin_fini(CR_PLUGIN_STAGE__DUMP, ret); cr_plugin_fini(CR_PLUGIN_STAGE__DUMP, ret);
if (!ret) { if (!ret) {
......
...@@ -33,4 +33,5 @@ int bwrite(struct bfd *f, const void *buf, int sz); ...@@ -33,4 +33,5 @@ int bwrite(struct bfd *f, const void *buf, int sz);
struct iovec; struct iovec;
int bwritev(struct bfd *f, const struct iovec *iov, int cnt); int bwritev(struct bfd *f, const struct iovec *iov, int cnt);
int bread(struct bfd *f, void *buf, int sz); int bread(struct bfd *f, void *buf, int sz);
int bfd_flush_images(void);
#endif #endif
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