hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/ceph/cls_lock_client.c
....@@ -6,6 +6,7 @@
66
77 #include <linux/ceph/cls_lock_client.h>
88 #include <linux/ceph/decode.h>
9
+#include <linux/ceph/libceph.h>
910
1011 /**
1112 * ceph_cls_lock - grab rados lock for object
....@@ -264,14 +265,17 @@
264265 return ret;
265266
266267 *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
+
269273 len = ceph_decode_32(p);
270274 *p += len; /* skip description */
271275
272276 dout("%s %s%llu cookie %s addr %s\n", __func__,
273277 ENTITY_NAME(locker->id.name), locker->id.cookie,
274
- ceph_pr_addr(&locker->info.addr.in_addr));
278
+ ceph_pr_addr(&locker->info.addr));
275279 return 0;
276280 }
277281
....@@ -360,7 +364,7 @@
360364 dout("%s lock_name %s\n", __func__, lock_name);
361365 ret = ceph_osdc_call(osdc, oid, oloc, "lock", "get_info",
362366 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);
364368
365369 dout("%s: status %d\n", __func__, ret);
366370 if (ret >= 0) {
....@@ -375,3 +379,47 @@
375379 return ret;
376380 }
377381 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);