ceph-rbd: osdc support for osd call and rollback operations
Yehuda Sadeh [Tue, 18 May 2010 23:38:08 +0000 (16:38 -0700)]
This will be used for rbd snapshots administration.

Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>

fs/ceph/decode.h
fs/ceph/osd_client.c
fs/ceph/osd_client.h

index 3d25415..c5b6939 100644 (file)
@@ -191,6 +191,11 @@ static inline void ceph_encode_string(void **p, void *end,
                ceph_encode_need(p, end, n, bad);               \
                ceph_encode_copy(p, pv, n);                     \
        } while (0)
+#define ceph_encode_string_safe(p, end, s, n, bad)             \
+       do {                                                    \
+               ceph_encode_need(p, end, n, bad);               \
+               ceph_encode_string(p, end, s, n);               \
+       } while (0)
 
 
 #endif
index c5d818e..0edb43f 100644 (file)
@@ -161,6 +161,7 @@ static int op_needs_trail(int op)
        case CEPH_OSD_OP_GETXATTR:
        case CEPH_OSD_OP_SETXATTR:
        case CEPH_OSD_OP_CMPXATTR:
+       case CEPH_OSD_OP_CALL:
                return 1;
        default:
                return 0;
@@ -301,6 +302,23 @@ static void osd_req_encode_op(struct ceph_osd_request *req,
                ceph_pagelist_append(req->r_trail, src->xattr.val,
                                     src->xattr.value_len);
                break;
+       case CEPH_OSD_OP_CALL:
+               BUG_ON(!req->r_trail);
+
+               dst->cls.class_len = src->cls.class_len;
+               dst->cls.method_len = src->cls.method_len;
+               dst->cls.indata_len = cpu_to_le32(src->cls.indata_len);
+
+               ceph_pagelist_append(req->r_trail, src->cls.class_name,
+                                    src->cls.class_len);
+               ceph_pagelist_append(req->r_trail, src->cls.method_name,
+                                    src->cls.method_len);
+               ceph_pagelist_append(req->r_trail, src->cls.indata,
+                                    src->cls.indata_len);
+               break;
+       case CEPH_OSD_OP_ROLLBACK:
+               dst->snap.snapid = cpu_to_le64(src->snap.snapid);
+               break;
        case CEPH_OSD_OP_STARTSYNC:
                break;
        default:
index d583d1b..65c9c56 100644 (file)
@@ -134,14 +134,20 @@ struct ceph_osd_req_op {
                        __u8 cmp_mode;     /* CEPH_OSD_CMPXATTR_MODE_* */
                } xattr;
                struct {
+                       const char *class_name;
                        __u8 class_len;
+                       const char *method_name;
                        __u8 method_len;
                        __u8 argc;
+                       const char *indata;
                        u32 indata_len;
                } cls;
                struct {
                        u64 cookie, count;
                } pgls;
+               struct {
+                       u64 snapid;
+               } snap;
        };
        u32 payload_len;
 };