[libvirt] [PATCH v3] storage_backend_rbd: check the return value of rados_conf_set

From: Chen Hanxiao <chenhanxiao@gmail.com> We forget to check the return value of some rados_conf_set. Signed-off-by: Chen Hanxiao <chenhanxiao@gmail.com> --- v2: add another missing return value check v3: fix a copy-paste error src/storage/storage_backend_rbd.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c index 718c4d6..a286af0 100644 --- a/src/storage/storage_backend_rbd.c +++ b/src/storage/storage_backend_rbd.c @@ -159,13 +159,28 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr, * Operations in librados will return -ETIMEDOUT when the timeout is reached. */ VIR_DEBUG("Setting RADOS option client_mount_timeout to %s", client_mount_timeout); - rados_conf_set(ptr->cluster, "client_mount_timeout", client_mount_timeout); + if (rados_conf_set(ptr->cluster, "client_mount_timeout", client_mount_timeout) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to set RADOS option: %s"), + "client_mount_timeout"); + goto cleanup; + } VIR_DEBUG("Setting RADOS option rados_mon_op_timeout to %s", mon_op_timeout); - rados_conf_set(ptr->cluster, "rados_mon_op_timeout", mon_op_timeout); + if (rados_conf_set(ptr->cluster, "rados_mon_op_timeout", mon_op_timeout) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to set RADOS option: %s"), + "rados_mon_op_timeout"); + goto cleanup; + } VIR_DEBUG("Setting RADOS option rados_osd_op_timeout to %s", osd_op_timeout); - rados_conf_set(ptr->cluster, "rados_osd_op_timeout", osd_op_timeout); + if (rados_conf_set(ptr->cluster, "rados_osd_op_timeout", osd_op_timeout) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to set RADOS option: %s"), + "rados_osd_op_timeout"); + goto cleanup; + } /* * Librbd supports creating RBD format 2 images. We no longer have to invoke @@ -173,7 +188,12 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr, * This leaves us to simply use rbd_create() and use the default behavior of librbd */ VIR_DEBUG("Setting RADOS option rbd_default_format to %s", rbd_default_format); - rados_conf_set(ptr->cluster, "rbd_default_format", rbd_default_format); + if (rados_conf_set(ptr->cluster, "rbd_default_format", rbd_default_format) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to set RADOS option: %s"), + "rbd_default_format"); + goto cleanup; + } ptr->starttime = time(0); if ((r = rados_connect(ptr->cluster)) < 0) { -- 1.8.3.1

At 2016-11-12 17:22:02, "Chen Hanxiao" <chen_han_xiao@126.com> wrote:
From: Chen Hanxiao <chenhanxiao@gmail.com>
We forget to check the return value of some rados_conf_set.
Signed-off-by: Chen Hanxiao <chenhanxiao@gmail.com> --- v2: add another missing return value check v3: fix a copy-paste error
ping Regards, - Chen

On 11/12/2016 04:22 AM, Chen Hanxiao wrote:
From: Chen Hanxiao <chenhanxiao@gmail.com>
We forget to check the return value of some rados_conf_set.
Signed-off-by: Chen Hanxiao <chenhanxiao@gmail.com> --- v2: add another missing return value check v3: fix a copy-paste error
src/storage/storage_backend_rbd.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-)
Take one more step... Rather than replicating the same message in so many different places, why not create a helper static int virStorageBackendRBDRADOSConfSet(rados_t cluster, const char *option, const char *value) { VIR_DEBUG("Setting RADOS option '%s' to '%s'", option, value); if (rados_conf_set(cluster, option, value) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set RADOS option: %s"), option); return -1; } return 0; } And all those other places just have: if (virStorageBackendRBDRADOSConfSet(ptr->cluster, arg2, arg3) < 0) goto cleanup; And be sure also remove the VIR_DEBUG("Found cephx key: %s", rados_key); Also, try to not have lines longer than 80 cols... makes it tough to read the code. John
diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c index 718c4d6..a286af0 100644 --- a/src/storage/storage_backend_rbd.c +++ b/src/storage/storage_backend_rbd.c @@ -159,13 +159,28 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr, * Operations in librados will return -ETIMEDOUT when the timeout is reached. */ VIR_DEBUG("Setting RADOS option client_mount_timeout to %s", client_mount_timeout); - rados_conf_set(ptr->cluster, "client_mount_timeout", client_mount_timeout); + if (rados_conf_set(ptr->cluster, "client_mount_timeout", client_mount_timeout) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to set RADOS option: %s"), + "client_mount_timeout"); + goto cleanup; + }
VIR_DEBUG("Setting RADOS option rados_mon_op_timeout to %s", mon_op_timeout); - rados_conf_set(ptr->cluster, "rados_mon_op_timeout", mon_op_timeout); + if (rados_conf_set(ptr->cluster, "rados_mon_op_timeout", mon_op_timeout) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to set RADOS option: %s"), + "rados_mon_op_timeout"); + goto cleanup; + }
VIR_DEBUG("Setting RADOS option rados_osd_op_timeout to %s", osd_op_timeout); - rados_conf_set(ptr->cluster, "rados_osd_op_timeout", osd_op_timeout); + if (rados_conf_set(ptr->cluster, "rados_osd_op_timeout", osd_op_timeout) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to set RADOS option: %s"), + "rados_osd_op_timeout"); + goto cleanup; + }
/* * Librbd supports creating RBD format 2 images. We no longer have to invoke @@ -173,7 +188,12 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr, * This leaves us to simply use rbd_create() and use the default behavior of librbd */ VIR_DEBUG("Setting RADOS option rbd_default_format to %s", rbd_default_format); - rados_conf_set(ptr->cluster, "rbd_default_format", rbd_default_format); + if (rados_conf_set(ptr->cluster, "rbd_default_format", rbd_default_format) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to set RADOS option: %s"), + "rbd_default_format"); + goto cleanup; + }
ptr->starttime = time(0); if ((r = rados_connect(ptr->cluster)) < 0) {

At 2016-11-24 01:29:45, "John Ferlan" <jferlan@redhat.com> wrote:
On 11/12/2016 04:22 AM, Chen Hanxiao wrote:
From: Chen Hanxiao <chenhanxiao@gmail.com>
We forget to check the return value of some rados_conf_set.
Signed-off-by: Chen Hanxiao <chenhanxiao@gmail.com> --- v2: add another missing return value check v3: fix a copy-paste error
src/storage/storage_backend_rbd.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-)
Take one more step... Rather than replicating the same message in so many different places, why not create a helper
static int virStorageBackendRBDRADOSConfSet(rados_t cluster, const char *option, const char *value) { VIR_DEBUG("Setting RADOS option '%s' to '%s'", option, value); if (rados_conf_set(cluster, option, value) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set RADOS option: %s"), option); return -1; } return 0; }
And all those other places just have:
if (virStorageBackendRBDRADOSConfSet(ptr->cluster, arg2, arg3) < 0) goto cleanup;
And be sure also remove the VIR_DEBUG("Found cephx key: %s", rados_key);
Also, try to not have lines longer than 80 cols... makes it tough to read the code.
Thanks for the review. I'll send a new patch soon. Regards, - Chen
participants (2)
-
Chen Hanxiao
-
John Ferlan