]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix error path cleanup for opening an image 2239/head
authorJosh Durgin <josh.durgin@inktank.com>
Mon, 11 Aug 2014 23:41:26 +0000 (16:41 -0700)
committerJosh Durgin <josh.durgin@inktank.com>
Mon, 11 Aug 2014 23:43:07 +0000 (16:43 -0700)
If the image doesn't exist and caching is enabled, the ObjectCacher
was not being shutdown, and the ImageCtx was leaked. The IoCtx could
later be closed while the ObjectCacher was still running, resulting in
a segfault. Simply use the usual cleanup path in open_image(), which
works fine here.

Fixes: #8912
Backport: dumpling, firefly
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
src/librbd/internal.cc
src/test/pybind/test_rbd.py

index 2f4a88eb0f8b860c5006a2c2d98f2f91eeea33cf..b05e958eb4c5f885fe33d244c3197c1b5605ddf0 100644 (file)
@@ -2080,7 +2080,7 @@ reprotect_and_return_err:
                         << ictx->snap_name << "'" << dendl;
     int r = ictx->init();
     if (r < 0)
-      return r;
+      goto err_close;
 
     if (!ictx->read_only) {
       r = ictx->register_watch();
index 6036b527531ae325d3258ccbddf94db2a82d5c31..9b3c6e839c81ee11a4a3686752fa69ff32a638b4 100644 (file)
@@ -189,6 +189,16 @@ def test_open_read_only():
             RBD().remove(ioctx, IMG_NAME)
             eq(data, read)
 
+def test_open_dne():
+    for i in xrange(100):
+        assert_raises(ImageNotFound, Image, ioctx, IMG_NAME + 'dne')
+        assert_raises(ImageNotFound, Image, ioctx, IMG_NAME, 'snap')
+
+def test_open_readonly_dne():
+    for i in xrange(100):
+        assert_raises(ImageNotFound, Image, ioctx, IMG_NAME + 'dne', read_only=True)
+        assert_raises(ImageNotFound, Image, ioctx, IMG_NAME, 'snap', read_only=True)
+
 def test_remove_dne():
     assert_raises(ImageNotFound, remove_image)