mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 08:56:48 +07:00
ocfs2: Fix a race in o2dlm lockres mastery
In o2dlm, the master of a lock resource keeps a map of all interested nodes. This prevents the master from purging the resource before an interested node can create a lock. A race between the mastery thread and the mastery handler allowed an interested node to discover who the master is without informing the master directly. This is easily fixed by holding the dlm spinlock a little longer in the mastery handler. Signed-off-by: Srinivas Eeda <srinivas.eeda@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com>
This commit is contained in:
parent
b54c2ca475
commit
14741472a0
@ -1875,7 +1875,6 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
|
||||
ok:
|
||||
spin_unlock(&res->spinlock);
|
||||
}
|
||||
spin_unlock(&dlm->spinlock);
|
||||
|
||||
// mlog(0, "woo! got an assert_master from node %u!\n",
|
||||
// assert->node_idx);
|
||||
@ -1926,7 +1925,6 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
|
||||
/* master is known, detach if not already detached.
|
||||
* ensures that only one assert_master call will happen
|
||||
* on this mle. */
|
||||
spin_lock(&dlm->spinlock);
|
||||
spin_lock(&dlm->master_lock);
|
||||
|
||||
rr = atomic_read(&mle->mle_refs.refcount);
|
||||
@ -1959,7 +1957,6 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
|
||||
__dlm_put_mle(mle);
|
||||
}
|
||||
spin_unlock(&dlm->master_lock);
|
||||
spin_unlock(&dlm->spinlock);
|
||||
} else if (res) {
|
||||
if (res->owner != assert->node_idx) {
|
||||
mlog(0, "assert_master from %u, but current "
|
||||
@ -1967,6 +1964,7 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
|
||||
res->owner, namelen, name);
|
||||
}
|
||||
}
|
||||
spin_unlock(&dlm->spinlock);
|
||||
|
||||
done:
|
||||
ret = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user