* @param snap_id which snapshot to query, or CEPH_NOSNAP (uint64_t)
*
* Output:
- * @param pool parent pool id
+ * @param pool parent pool id (-1 if parent does not exist)
* @param image parent image id
* @param snapid parent snapid
* @param size portion of parent mapped under the child
*
- * @returns 0 on success, -ENOENT if no parent, other negative error code on failure
+ * @returns 0 on success or parent does not exist, negative error code on failure
*/
int get_parent(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
cls_rbd_parent parent;
if (snap_id == CEPH_NOSNAP) {
r = read_key(hctx, "parent", &parent);
- if (r < 0)
+ if (r < 0 && r != -ENOENT)
return r;
} else {
cls_rbd_snap snap;
string snapshot_key;
key_from_snap_id(snap_id, &snapshot_key);
r = read_key(hctx, snapshot_key, &snap);
- if (r < 0)
+ if (r < 0 && r != -ENOENT)
return r;
parent = snap.parent;
}
- if (!parent.exists())
- return -ENOENT;
-
::encode(parent.pool, *out);
::encode(parent.id, *out);
::encode(parent.snapid, *out);
// new image will work
ASSERT_EQ(0, create_image(&ioctx, "foo", 33<<20, 22, RBD_FEATURE_LAYERING, "foo."));
- ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
- ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", 123, &pool, &parent, &snapid, &size));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
+ ASSERT_EQ(-1, pool);
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 123, &pool, &parent, &snapid, &size));
+ ASSERT_EQ(-1, pool);
ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", -1, "parent", 3, 10<<20));
ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", 1, "", 3, 10<<20));
ASSERT_EQ(0, remove_parent(&ioctx, "foo"));
ASSERT_EQ(-ENOENT, remove_parent(&ioctx, "foo"));
- ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
+ ASSERT_EQ(-1, pool);
// snapshots
ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 10<<20));
ASSERT_EQ(parent, "parent2");
ASSERT_EQ(snapid, snapid_t(6));
ASSERT_EQ(size, 5ull<<20);
- ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", 12, &pool, &parent, &snapid, &size));
+ ASSERT_EQ(0, get_parent(&ioctx, "foo", 12, &pool, &parent, &snapid, &size));
+ ASSERT_EQ(-1, pool);
// make sure set_parent takes min of our size and parent's size
ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 1<<20));