]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: ignore lack of support for metadata on older OSDs 4589/head
authorJason Dillaman <dillaman@redhat.com>
Wed, 6 May 2015 18:48:50 +0000 (14:48 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 6 May 2015 20:30:27 +0000 (16:30 -0400)
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 <dillaman@redhat.com>
src/librbd/ImageCtx.cc
src/librbd/internal.cc

index 8bdeec9b9c0cf098e35bfa4d1d5f4f9bfc337bce..46ea1c0066cc142c5232646f19a42a8a9d6e353f 100644 (file)
@@ -847,8 +847,11 @@ namespace librbd {
       map<string, bufferlist> 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;
       }
index bb24136321081c65f7360e43543669ac2a367b74..293e9b3ae7a21e6d668a6241b769ee1963297810 100644 (file)
@@ -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<string, bufferlist> 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);