diff --git a/bfd.c b/bfd.c index 1a6d78b73..3e1a3a62d 100644 --- a/bfd.c +++ b/bfd.c @@ -97,6 +97,12 @@ int bfdopen(struct bfd *f) } 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) { @@ -107,15 +113,18 @@ void bclose(struct bfd *f) * becase we read _all_ data from them and the * 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 * checking it, but setting a static * flag, failing further bfdopen-s and * checking one at the end would work. */ + flush_failed = true; pr_perror("Error flushing image"); + } + buf_put(&f->b); } close(f->fd); diff --git a/cr-dump.c b/cr-dump.c index 7d33e3d4e..3057a47b1 100644 --- a/cr-dump.c +++ b/cr-dump.c @@ -1766,6 +1766,9 @@ err: if (disconnect_from_page_server()) ret = -1; + if (bfd_flush_images()) + ret = -1; + if (ret) pr_err("Pre-dumping FAILED.\n"); else { @@ -1891,6 +1894,9 @@ err: close_cr_imgset(&glob_imgset); + if (bfd_flush_images()) + ret = -1; + cr_plugin_fini(CR_PLUGIN_STAGE__DUMP, ret); if (!ret) { diff --git a/include/bfd.h b/include/bfd.h index f40ae5f90..55e2e9d7c 100644 --- a/include/bfd.h +++ b/include/bfd.h @@ -33,4 +33,5 @@ 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); +int bfd_flush_images(void); #endif