@@ -3103,8 +3103,9 @@ out:
return ret;
}
-static void rbd_watch_cb(u64 ver, u64 notify_id, u8 opcode, void *data,
- void *payload, int payload_len)
+static void rbd_watch_cb(u64 ver, u64 notify_id, u8 opcode, s32 return_code,
+ u64 notifier_gid, void *data, void *payload,
+ u32 payload_len)
{
struct rbd_device *rbd_dev = (struct rbd_device *)data;
int ret;
@@ -184,7 +184,7 @@ struct ceph_osd_event {
u64 cookie;
int one_shot;
struct ceph_osd_client *osdc;
- void (*cb)(u64, u64, u8, void *, void *, int);
+ void (*cb)(u64, u64, u8, s32, u64, void *, void *, u32);
void *data;
struct rb_node node;
struct list_head osd_node;
@@ -197,8 +197,10 @@ struct ceph_osd_event_work {
u64 ver;
u64 notify_id;
u8 opcode;
+ s32 return_code;
+ u64 notifier_gid;
void *payload;
- int payload_len;
+ u32 payload_len;
};
struct ceph_osd_client {
@@ -371,8 +373,8 @@ extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,
/* watch/notify events */
extern int ceph_osdc_create_event(struct ceph_osd_client *osdc,
- void (*event_cb)(u64, u64, u8, void *, void *,
- int),
+ void (*event_cb)(u64, u64, u8, s32, u64,
+ void *, void *, u32),
void *data, struct ceph_osd_event **pevent);
extern void ceph_osdc_cancel_event(struct ceph_osd_event *event);
extern void ceph_osdc_put_event(struct ceph_osd_event *event);
@@ -2277,7 +2277,8 @@ static void __remove_event(struct ceph_osd_event *event)
}
int ceph_osdc_create_event(struct ceph_osd_client *osdc,
- void (*event_cb)(u64, u64, u8, void *, void *, int),
+ void (*event_cb)(u64, u64, u8, s32, u64, void *,
+ void *, u32),
void *data, struct ceph_osd_event **pevent)
{
struct ceph_osd_event *event;
@@ -2327,10 +2328,12 @@ static void do_event_work(struct work_struct *work)
u64 ver = event_work->ver;
u64 notify_id = event_work->notify_id;
u8 opcode = event_work->opcode;
+ s32 return_code = event_work->return_code;
+ u64 notifier_gid = event_work->notifier_gid;
dout("do_event_work completing %p\n", event);
- event->cb(ver, notify_id, opcode, event->data, event_work->payload,
- event_work->payload_len);
+ event->cb(ver, notify_id, opcode, return_code, notifier_gid,
+ event->data, event_work->payload, event_work->payload_len);
dout("do_event_work completed %p\n", event);
ceph_osdc_put_event(event);
kfree(event_work);
@@ -2345,9 +2348,10 @@ static void handle_watch_notify(struct ceph_osd_client *osdc,
{
void *p, *end, *payload = NULL;
u8 proto_ver;
- u64 cookie, ver, notify_id;
+ u64 cookie, ver, notify_id, notifier_gid = 0;
u8 opcode;
u32 payload_len = 0;
+ s32 return_code = 0;
struct ceph_osd_event *event;
struct ceph_osd_event_work *event_work;
@@ -2365,8 +2369,15 @@ static void handle_watch_notify(struct ceph_osd_client *osdc,
if (end - p < payload_len)
goto bad;
payload = p;
+ p += payload_len;
}
+ if (msg->hdr.version >= 2)
+ ceph_decode_32_safe(&p, end, return_code, bad);
+
+ if (msg->hdr.version >= 3)
+ ceph_decode_64_safe(&p, end, notifier_gid, bad);
+
spin_lock(&osdc->event_lock);
event = __find_event(osdc, cookie);
if (event) {
@@ -2374,8 +2385,8 @@ static void handle_watch_notify(struct ceph_osd_client *osdc,
get_event(event);
}
spin_unlock(&osdc->event_lock);
- dout("handle_watch_notify cookie %lld ver %lld event %p notify id %llu payload len %u\n",
- cookie, ver, event, notify_id, payload_len);
+ dout("handle_watch_notify cookie %lld ver %lld event %p notify id %llu payload len %u return code %d notifier gid %llu\n",
+ cookie, ver, event, notify_id, payload_len, return_code, notifier_gid);
if (event) {
event_work = kmalloc(sizeof(*event_work), GFP_NOIO);
if (!event_work) {
@@ -2388,6 +2399,8 @@ static void handle_watch_notify(struct ceph_osd_client *osdc,
event_work->ver = ver;
event_work->notify_id = notify_id;
event_work->opcode = opcode;
+ event_work->return_code = return_code;
+ event_work->notifier_gid = notifier_gid;
event_work->payload = payload;
event_work->payload_len = payload_len;