#define RBD_MAX_KEYS_READ 64
#define RBD_SNAP_KEY_PREFIX "snapshot_"
+#define RBD_LOCK_PREFIX "lock_"
+#define RBD_LOCK_TYPE_KEY RBD_LOCK_PREFIX "type"
+#define RBD_LOCKS_KEY RBD_LOCK_PREFIX "lockers"
+#define RBD_LOCK_EXCLUSIVE "exclusive"
+#define RBD_LOCK_SHARED "shared"
- typedef struct cls_rbd_snap {
+ struct cls_rbd_snap {
snapid_t id;
string name;
uint64_t image_size;
if (snap_id == CEPH_NOSNAP) {
int r = read_key(hctx, "features", &features);
- if (r < 0)
+ if (r < 0) {
+ CLS_ERR("failed to read features off disk: %s", strerror(r));
return r;
+ }
} else {
cls_rbd_snap snap;
- int r = read_snapshot_metadata(hctx, snap_id, &snap);
+ string snapshot_key;
+ key_from_snap_id(snap_id, &snapshot_key);
+ int r = read_key(hctx, snapshot_key, &snap);
if (r < 0)
return r;
if (snap_id == CEPH_NOSNAP) {
r = read_key(hctx, "size", &size);
- if (r < 0)
+ if (r < 0) {
+ CLS_ERR("failed to read the image's size off of disk: %s", strerror(r));
return r;
+ }
} else {
cls_rbd_snap snap;
- int r = read_snapshot_metadata(hctx, snap_id, &snap);
+ string snapshot_key;
+ key_from_snap_id(snap_id, &snapshot_key);
+ int r = read_key(hctx, snapshot_key, &snap);
if (r < 0)
return r;
// client lost a race with another snapshot creation.
// snap_seq must be monotonically increasing.
- if (snap_id < cur_snap_seq)
+ if (snap_meta.id < cur_snap_seq)
return -ESTALE;
- uint64_t size;
- r = read_key(hctx, "size", &size);
+ r = read_key(hctx, "size", &snap_meta.image_size);
- if (r < 0)
+ if (r < 0) {
+ CLS_ERR("Could not read image's size off disk: %s", strerror(r));
return r;
- uint64_t features;
- r = read_key(hctx, "features", &features);
+ }
- if (r < 0)
+ r = read_key(hctx, "features", &snap_meta.features);
+ if (r < 0) {
+ CLS_ERR("Could not read image's features off disk: %s", strerror(r));
return r;
+ }
int max_read = RBD_MAX_KEYS_READ;
string last_read = RBD_SNAP_KEY_PREFIX;