.. | .. |
---|
6 | 6 | |
---|
7 | 7 | #include <linux/ceph/cls_lock_client.h> |
---|
8 | 8 | #include <linux/ceph/decode.h> |
---|
| 9 | +#include <linux/ceph/libceph.h> |
---|
9 | 10 | |
---|
10 | 11 | /** |
---|
11 | 12 | * ceph_cls_lock - grab rados lock for object |
---|
.. | .. |
---|
264 | 265 | return ret; |
---|
265 | 266 | |
---|
266 | 267 | *p += sizeof(struct ceph_timespec); /* skip expiration */ |
---|
267 | | - ceph_decode_copy(p, &locker->info.addr, sizeof(locker->info.addr)); |
---|
268 | | - ceph_decode_addr(&locker->info.addr); |
---|
| 268 | + |
---|
| 269 | + ret = ceph_decode_entity_addr(p, end, &locker->info.addr); |
---|
| 270 | + if (ret) |
---|
| 271 | + return ret; |
---|
| 272 | + |
---|
269 | 273 | len = ceph_decode_32(p); |
---|
270 | 274 | *p += len; /* skip description */ |
---|
271 | 275 | |
---|
272 | 276 | dout("%s %s%llu cookie %s addr %s\n", __func__, |
---|
273 | 277 | ENTITY_NAME(locker->id.name), locker->id.cookie, |
---|
274 | | - ceph_pr_addr(&locker->info.addr.in_addr)); |
---|
| 278 | + ceph_pr_addr(&locker->info.addr)); |
---|
275 | 279 | return 0; |
---|
276 | 280 | } |
---|
277 | 281 | |
---|
.. | .. |
---|
360 | 364 | dout("%s lock_name %s\n", __func__, lock_name); |
---|
361 | 365 | ret = ceph_osdc_call(osdc, oid, oloc, "lock", "get_info", |
---|
362 | 366 | CEPH_OSD_FLAG_READ, get_info_op_page, |
---|
363 | | - get_info_op_buf_size, reply_page, &reply_len); |
---|
| 367 | + get_info_op_buf_size, &reply_page, &reply_len); |
---|
364 | 368 | |
---|
365 | 369 | dout("%s: status %d\n", __func__, ret); |
---|
366 | 370 | if (ret >= 0) { |
---|
.. | .. |
---|
375 | 379 | return ret; |
---|
376 | 380 | } |
---|
377 | 381 | EXPORT_SYMBOL(ceph_cls_lock_info); |
---|
| 382 | + |
---|
| 383 | +int ceph_cls_assert_locked(struct ceph_osd_request *req, int which, |
---|
| 384 | + char *lock_name, u8 type, char *cookie, char *tag) |
---|
| 385 | +{ |
---|
| 386 | + int assert_op_buf_size; |
---|
| 387 | + int name_len = strlen(lock_name); |
---|
| 388 | + int cookie_len = strlen(cookie); |
---|
| 389 | + int tag_len = strlen(tag); |
---|
| 390 | + struct page **pages; |
---|
| 391 | + void *p, *end; |
---|
| 392 | + int ret; |
---|
| 393 | + |
---|
| 394 | + assert_op_buf_size = name_len + sizeof(__le32) + |
---|
| 395 | + cookie_len + sizeof(__le32) + |
---|
| 396 | + tag_len + sizeof(__le32) + |
---|
| 397 | + sizeof(u8) + CEPH_ENCODING_START_BLK_LEN; |
---|
| 398 | + if (assert_op_buf_size > PAGE_SIZE) |
---|
| 399 | + return -E2BIG; |
---|
| 400 | + |
---|
| 401 | + ret = osd_req_op_cls_init(req, which, "lock", "assert_locked"); |
---|
| 402 | + if (ret) |
---|
| 403 | + return ret; |
---|
| 404 | + |
---|
| 405 | + pages = ceph_alloc_page_vector(1, GFP_NOIO); |
---|
| 406 | + if (IS_ERR(pages)) |
---|
| 407 | + return PTR_ERR(pages); |
---|
| 408 | + |
---|
| 409 | + p = page_address(pages[0]); |
---|
| 410 | + end = p + assert_op_buf_size; |
---|
| 411 | + |
---|
| 412 | + /* encode cls_lock_assert_op struct */ |
---|
| 413 | + ceph_start_encoding(&p, 1, 1, |
---|
| 414 | + assert_op_buf_size - CEPH_ENCODING_START_BLK_LEN); |
---|
| 415 | + ceph_encode_string(&p, end, lock_name, name_len); |
---|
| 416 | + ceph_encode_8(&p, type); |
---|
| 417 | + ceph_encode_string(&p, end, cookie, cookie_len); |
---|
| 418 | + ceph_encode_string(&p, end, tag, tag_len); |
---|
| 419 | + WARN_ON(p != end); |
---|
| 420 | + |
---|
| 421 | + osd_req_op_cls_request_data_pages(req, which, pages, assert_op_buf_size, |
---|
| 422 | + 0, false, true); |
---|
| 423 | + return 0; |
---|
| 424 | +} |
---|
| 425 | +EXPORT_SYMBOL(ceph_cls_assert_locked); |
---|