Commit 313771e8 authored by Ilya Dryomov's avatar Ilya Dryomov

libceph, rbd: ignore addr->type while comparing in some cases

For libceph, this ensures that libceph instance sharing (share option)
continues to work.  For rbd, this avoids blocklisting alive lock owners
(locker addr is always LEGACY, while watcher addr is ANY in nautilus).
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent a5cbd5fc
...@@ -3957,8 +3957,12 @@ static int find_watcher(struct rbd_device *rbd_dev, ...@@ -3957,8 +3957,12 @@ static int find_watcher(struct rbd_device *rbd_dev,
sscanf(locker->id.cookie, RBD_LOCK_COOKIE_PREFIX " %llu", &cookie); sscanf(locker->id.cookie, RBD_LOCK_COOKIE_PREFIX " %llu", &cookie);
for (i = 0; i < num_watchers; i++) { for (i = 0; i < num_watchers; i++) {
if (!memcmp(&watchers[i].addr, &locker->info.addr, /*
sizeof(locker->info.addr)) && * Ignore addr->type while comparing. This mimics
* entity_addr_t::get_legacy_str() + strcmp().
*/
if (ceph_addr_equal_no_type(&watchers[i].addr,
&locker->info.addr) &&
watchers[i].cookie == cookie) { watchers[i].cookie == cookie) {
struct rbd_client_id cid = { struct rbd_client_id cid = {
.gid = le64_to_cpu(watchers[i].name.num), .gid = le64_to_cpu(watchers[i].name.num),
......
...@@ -52,11 +52,18 @@ extern const char *ceph_entity_type_name(int type); ...@@ -52,11 +52,18 @@ extern const char *ceph_entity_type_name(int type);
* entity_addr -- network address * entity_addr -- network address
*/ */
struct ceph_entity_addr { struct ceph_entity_addr {
__le32 type; __le32 type; /* CEPH_ENTITY_ADDR_TYPE_* */
__le32 nonce; /* unique id for process (e.g. pid) */ __le32 nonce; /* unique id for process (e.g. pid) */
struct sockaddr_storage in_addr; struct sockaddr_storage in_addr;
} __attribute__ ((packed)); } __attribute__ ((packed));
static inline bool ceph_addr_equal_no_type(const struct ceph_entity_addr *lhs,
const struct ceph_entity_addr *rhs)
{
return !memcmp(&lhs->in_addr, &rhs->in_addr, sizeof(lhs->in_addr)) &&
lhs->nonce == rhs->nonce;
}
struct ceph_entity_inst { struct ceph_entity_inst {
struct ceph_entity_name name; struct ceph_entity_name name;
struct ceph_entity_addr addr; struct ceph_entity_addr addr;
......
...@@ -161,9 +161,11 @@ int ceph_monmap_contains(struct ceph_monmap *m, struct ceph_entity_addr *addr) ...@@ -161,9 +161,11 @@ int ceph_monmap_contains(struct ceph_monmap *m, struct ceph_entity_addr *addr)
{ {
int i; int i;
for (i = 0; i < m->num_mon; i++) for (i = 0; i < m->num_mon; i++) {
if (memcmp(addr, &m->mon_inst[i].addr, sizeof(*addr)) == 0) if (ceph_addr_equal_no_type(addr, &m->mon_inst[i].addr))
return 1; return 1;
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment