block/rbd: report a better error when namespace does not exist
If the namespace does not exist, rbd_create() fails with -ENOENT and QEMU reports a generic "error rbd create: No such file or directory": $ qemu-img create rbd:rbd/namespace/image 1M Formatting 'rbd:rbd/namespace/image', fmt=raw size=1048576 qemu-img: rbd:rbd/namespace/image: error rbd create: No such file or directory Unfortunately rados_ioctx_set_namespace() does not fail if the namespace does not exist, so let's use rbd_namespace_exists() in qemu_rbd_connect() to check if the namespace exists, reporting a more understandable error: $ qemu-img create rbd:rbd/namespace/image 1M Formatting 'rbd:rbd/namespace/image', fmt=raw size=1048576 qemu-img: rbd:rbd/namespace/image: namespace 'namespace' does not exist Reported-by: Tingting Mao <timao@redhat.com> Reviewed-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> Message-Id: <20220517071012.6120-1-sgarzare@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
ca941c406c
commit
66dc5f9606
24
block/rbd.c
24
block/rbd.c
@ -831,6 +831,26 @@ static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
|
||||
error_setg_errno(errp, -r, "error opening pool %s", opts->pool);
|
||||
goto failed_shutdown;
|
||||
}
|
||||
|
||||
#ifdef HAVE_RBD_NAMESPACE_EXISTS
|
||||
if (opts->has_q_namespace && strlen(opts->q_namespace) > 0) {
|
||||
bool exists;
|
||||
|
||||
r = rbd_namespace_exists(*io_ctx, opts->q_namespace, &exists);
|
||||
if (r < 0) {
|
||||
error_setg_errno(errp, -r, "error checking namespace");
|
||||
goto failed_ioctx_destroy;
|
||||
}
|
||||
|
||||
if (!exists) {
|
||||
error_setg(errp, "namespace '%s' does not exist",
|
||||
opts->q_namespace);
|
||||
r = -ENOENT;
|
||||
goto failed_ioctx_destroy;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Set the namespace after opening the io context on the pool,
|
||||
* if nspace == NULL or if nspace == "", it is just as we did nothing
|
||||
@ -840,6 +860,10 @@ static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
|
||||
r = 0;
|
||||
goto out;
|
||||
|
||||
#ifdef HAVE_RBD_NAMESPACE_EXISTS
|
||||
failed_ioctx_destroy:
|
||||
rados_ioctx_destroy(*io_ctx);
|
||||
#endif
|
||||
failed_shutdown:
|
||||
rados_shutdown(*cluster);
|
||||
out:
|
||||
|
@ -1903,6 +1903,12 @@ config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
|
||||
config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
|
||||
config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
|
||||
config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
|
||||
if rbd.found()
|
||||
config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
|
||||
cc.has_function('rbd_namespace_exists',
|
||||
dependencies: rbd,
|
||||
prefix: '#include <rbd/librbd.h>'))
|
||||
endif
|
||||
if rdma.found()
|
||||
config_host_data.set('HAVE_IBV_ADVISE_MR',
|
||||
cc.has_function('ibv_advise_mr',
|
||||
|
Loading…
Reference in New Issue
Block a user