diff options
author | Markus Armbruster <armbru@redhat.com> | 2014-05-16 11:00:22 +0200 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2014-05-28 14:28:47 +0200 |
commit | 7d2d3e74e56b9a341e5206b8749b3d4e67c66959 (patch) | |
tree | 151ebb8a47f32fcbd850a33f87557395ad619eb0 /block/sheepdog.c | |
parent | 318df29e103ab8a3a5fe25106d0120e956db31aa (diff) |
block/sheepdog: Propagate errors through do_sd_create()
Cc: MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'block/sheepdog.c')
-rw-r--r-- | block/sheepdog.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/block/sheepdog.c b/block/sheepdog.c index 4df45a1591..d01cc8867c 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -1481,19 +1481,17 @@ out: return ret; } -static int do_sd_create(BDRVSheepdogState *s, uint32_t *vdi_id, int snapshot) +static int do_sd_create(BDRVSheepdogState *s, uint32_t *vdi_id, int snapshot, + Error **errp) { - Error *local_err = NULL; SheepdogVdiReq hdr; SheepdogVdiRsp *rsp = (SheepdogVdiRsp *)&hdr; int fd, ret; unsigned int wlen, rlen = 0; char buf[SD_MAX_VDI_LEN]; - fd = connect_to_sdog(s, &local_err); + fd = connect_to_sdog(s, errp); if (fd < 0) { - qerror_report_err(local_err); - error_free(local_err); return fd; } @@ -1522,11 +1520,12 @@ static int do_sd_create(BDRVSheepdogState *s, uint32_t *vdi_id, int snapshot) closesocket(fd); if (ret) { + error_setg_errno(errp, -ret, "create failed"); return ret; } if (rsp->result != SD_RES_SUCCESS) { - error_report("%s, %s", sd_strerror(rsp->result), s->inode.name); + error_setg(errp, "%s, %s", sd_strerror(rsp->result), s->inode.name); return -EIO; } @@ -1731,15 +1730,19 @@ static int sd_create(const char *filename, QEMUOptionParameter *options, bdrv_unref(bs); } - ret = do_sd_create(s, &vid, 0); - if (!prealloc || ret) { + ret = do_sd_create(s, &vid, 0, &local_err); + if (ret) { + qerror_report_err(local_err); + error_free(local_err); goto out; } - ret = sd_prealloc(filename, &local_err); - if (ret < 0) { - qerror_report_err(local_err); - error_free(local_err); + if (prealloc) { + ret = sd_prealloc(filename, &local_err); + if (ret < 0) { + qerror_report_err(local_err); + error_free(local_err); + } } out: g_free(s); @@ -1928,8 +1931,10 @@ static int sd_create_branch(BDRVSheepdogState *s) * false bail out. */ deleted = sd_delete(s); - ret = do_sd_create(s, &vid, !deleted); + ret = do_sd_create(s, &vid, !deleted, &local_err); if (ret) { + qerror_report_err(local_err); + error_free(local_err); goto out; } @@ -2197,8 +2202,10 @@ static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info) goto cleanup; } - ret = do_sd_create(s, &new_vid, 1); + ret = do_sd_create(s, &new_vid, 1, &local_err); if (ret < 0) { + qerror_report_err(local_err); + error_free(local_err); error_report("failed to create inode for snapshot. %s", strerror(errno)); goto cleanup; |