}
int get_flags(librados::IoCtx *ioctx, const std::string &oid,
- snapid_t snap_id, uint64_t *flags)
+ uint64_t *flags, const std::vector<snapid_t> &snap_ids,
+ vector<uint64_t> *snap_flags)
{
bufferlist inbl;
- ::encode(snap_id, inbl);
+ ::encode(static_cast<snapid_t>(CEPH_NOSNAP), inbl);
+
+ librados::ObjectReadOperation op;
+ op.exec("rbd", "get_flags", inbl);
+ for (size_t i = 0; i < snap_ids.size(); ++i) {
+ bufferlist snapbl;
+ ::encode(snap_ids[i], snapbl);
+ op.exec("rbd", "get_flags", snapbl);
+ }
+
+ snap_flags->clear();
+ snap_flags->resize(snap_ids.size());
bufferlist outbl;
- int r = ioctx->exec(oid, "rbd", "get_flags", inbl, outbl);
+ int r = ioctx->operate(oid, &op, &outbl);
if (r < 0) {
return r;
}
try {
bufferlist::iterator iter = outbl.begin();
::decode(*flags, iter);
+ for (size_t i = 0; i < snap_ids.size(); ++i) {
+ ::decode((*snap_flags)[i], iter);
+ }
} catch (const buffer::error &err) {
return -EBADMSG;
}
int set_parent(librados::IoCtx *ioctx, const std::string &oid,
parent_spec pspec, uint64_t parent_overlap);
int get_flags(librados::IoCtx *ioctx, const std::string &oid,
- snapid_t snap_id, uint64_t *flags);
+ uint64_t *flags, const std::vector<snapid_t> &snap_ids,
+ vector<uint64_t> *snap_flags);
void set_flags(librados::ObjectWriteOperation *op,
uint64_t flags, uint64_t mask);
int remove_parent(librados::IoCtx *ioctx, const std::string &oid);
ASSERT_EQ(0, create_image(&ioctx, oid, 0, 22, 0, oid));
uint64_t flags;
- ASSERT_EQ(0, get_flags(&ioctx, oid, CEPH_NOSNAP, &flags));
+ std::vector<snapid_t> snap_ids;
+ std::vector<uint64_t> snap_flags;
+ ASSERT_EQ(0, get_flags(&ioctx, oid, &flags, snap_ids, &snap_flags));
ASSERT_EQ(0U, flags);
librados::ObjectWriteOperation op1;
set_flags(&op1, 3, 2);
ASSERT_EQ(0, ioctx.operate(oid, &op1));
- ASSERT_EQ(0, get_flags(&ioctx, oid, CEPH_NOSNAP, &flags));
+ ASSERT_EQ(0, get_flags(&ioctx, oid, &flags, snap_ids, &snap_flags));
ASSERT_EQ(2U, flags);
uint64_t snap_id = 10;
- ASSERT_EQ(-ENOENT, get_flags(&ioctx, oid, snap_id, &flags));
+ snap_ids.push_back(snap_id);
+ ASSERT_EQ(-ENOENT, get_flags(&ioctx, oid, &flags, snap_ids, &snap_flags));
ASSERT_EQ(0, snapshot_add(&ioctx, oid, snap_id, "snap"));
librados::ObjectWriteOperation op2;
set_flags(&op2, 31, 4);
ASSERT_EQ(0, ioctx.operate(oid, &op2));
- ASSERT_EQ(0, get_flags(&ioctx, oid, CEPH_NOSNAP, &flags));
+ ASSERT_EQ(0, get_flags(&ioctx, oid, &flags, snap_ids, &snap_flags));
ASSERT_EQ(6U, flags);
-
- ASSERT_EQ(0, get_flags(&ioctx, oid, snap_id, &flags));
- ASSERT_EQ(2U, flags);
+ ASSERT_EQ(snap_ids.size(), snap_flags.size());
+ ASSERT_EQ(2U, snap_flags[0]);
ioctx.close();
}