From: Jason Dillaman Date: Wed, 6 May 2015 18:48:50 +0000 (-0400) Subject: librbd: ignore lack of support for metadata on older OSDs X-Git-Tag: v9.0.2~231^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f25aa5f39336a24523c5299664f6ed54ba74b75c;p=ceph.git librbd: ignore lack of support for metadata on older OSDs If an Infernalis librbd attempts to open an image stored on a pre-Infernalis OSD, the new config metadata operations won't be supported. This error can be safely ignored. Fixes: #11549 Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 8bdeec9b9c0c..46ea1c0066cc 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -847,8 +847,11 @@ namespace librbd { map pairs, res; r = cls_client::metadata_list(&md_ctx, header_oid, start, max_conf_items, &pairs); - if (r < 0) { - lderr(cct) << __func__ << " couldn't list conf metadatas: " << r + if (r == -EOPNOTSUPP || r == -EIO) { + ldout(cct, 10) << "config metadata not supported by OSD" << dendl; + break; + } else if (r < 0) { + lderr(cct) << __func__ << " couldn't list config metadata: " << r << dendl; break; } diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index bb2413632108..293e9b3ae7a2 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1415,14 +1415,15 @@ reprotect_and_return_err: } r = cls_client::metadata_list(&p_ioctx, p_imctx->header_oid, "", 0, &pairs); - if (r < 0) { + if (r < 0 && r != -EOPNOTSUPP && r != -EIO) { lderr(cct) << "couldn't list metadata: " << r << dendl; goto err_close_child; - } - r = cls_client::metadata_set(&c_ioctx, c_imctx->header_oid, pairs); - if (r < 0) { - lderr(cct) << "couldn't set metadata: " << r << dendl; - goto err_close_child; + } else if (r == 0 && !pairs.empty()) { + r = cls_client::metadata_set(&c_ioctx, c_imctx->header_oid, pairs); + if (r < 0) { + lderr(cct) << "couldn't set metadata: " << r << dendl; + goto err_close_child; + } } p_imctx->md_lock.get_write(); @@ -2656,14 +2657,15 @@ reprotect_and_return_err: map pairs; r = cls_client::metadata_list(&src->md_ctx, src->header_oid, "", 0, &pairs); - if (r < 0) { + if (r < 0 && r != -EOPNOTSUPP && r != -EIO) { lderr(cct) << "couldn't list metadata: " << r << dendl; return r; - } - r = cls_client::metadata_set(&dest->md_ctx, dest->header_oid, pairs); - if (r < 0) { - lderr(cct) << "couldn't set metadata: " << r << dendl; - return r; + } else if (r == 0 && !pairs.empty()) { + r = cls_client::metadata_set(&dest->md_ctx, dest->header_oid, pairs); + if (r < 0) { + lderr(cct) << "couldn't set metadata: " << r << dendl; + return r; + } } SimpleThrottle throttle(src->concurrent_management_ops, false);