int ceph_crypto_key_encode(struct ceph_crypto_key *key, void **p, void *end) { if (*p + sizeof(u16) + sizeof(key->created) + sizeof(u16) + key->len > end) return -ERANGE; ceph_encode_16(p, key->type); ceph_encode_copy(p, &key->created, sizeof(key->created)); ceph_encode_16(p, key->len); ceph_encode_copy(p, key->key, key->len); return 0; }
int ceph_entity_name_encode(const char *name, void **p, void *end) { int len = strlen(name); if (*p + 2*sizeof(u32) + len > end) return -ERANGE; ceph_encode_32(p, CEPH_ENTITY_TYPE_CLIENT); ceph_encode_32(p, len); ceph_encode_copy(p, name, len); return 0; }
/** * ceph_cls_break_lock - release rados lock for object for specified client * @oid, @oloc: object to lock * @lock_name: the name of the lock * @cookie: user-defined identifier for this instance of the lock * @locker: current lock owner */ int ceph_cls_break_lock(struct ceph_osd_client *osdc, struct ceph_object_id *oid, struct ceph_object_locator *oloc, char *lock_name, char *cookie, struct ceph_entity_name *locker) { int break_op_buf_size; int name_len = strlen(lock_name); int cookie_len = strlen(cookie); struct page *break_op_page; void *p, *end; int ret; break_op_buf_size = name_len + sizeof(__le32) + cookie_len + sizeof(__le32) + sizeof(u8) + sizeof(__le64) + CEPH_ENCODING_START_BLK_LEN; if (break_op_buf_size > PAGE_SIZE) return -E2BIG; break_op_page = alloc_page(GFP_NOIO); if (!break_op_page) return -ENOMEM; p = page_address(break_op_page); end = p + break_op_buf_size; /* encode cls_lock_break_op struct */ ceph_start_encoding(&p, 1, 1, break_op_buf_size - CEPH_ENCODING_START_BLK_LEN); ceph_encode_string(&p, end, lock_name, name_len); ceph_encode_copy(&p, locker, sizeof(*locker)); ceph_encode_string(&p, end, cookie, cookie_len); dout("%s lock_name %s cookie %s locker %s%llu\n", __func__, lock_name, cookie, ENTITY_NAME(*locker)); ret = ceph_osdc_call(osdc, oid, oloc, "lock", "break_lock", CEPH_OSD_FLAG_WRITE, break_op_page, break_op_buf_size, NULL, NULL); dout("%s: status %d\n", __func__, ret); __free_page(break_op_page); return ret; }