From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Aring Date: Tue, 20 Oct 2020 17:09:57 -0400 Subject: [Cluster-devel] [PATCH dlm/next 3/3] fs: dlm: check on existing node address In-Reply-To: <20201020210957.1009638-1-aahringo@redhat.com> References: <20201020210957.1009638-1-aahringo@redhat.com> Message-ID: <20201020210957.1009638-4-aahringo@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit This patch checks if we add twice the same address to a per node address array. This should never be the case and we report -EEXIST to the user space. Signed-off-by: Alexander Aring --- fs/dlm/lowcomms.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index c23d794e82910..0dc651676dfa1 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c @@ -370,10 +370,28 @@ static int addr_to_nodeid(struct sockaddr_storage *addr, int *nodeid) return rv; } +static bool dlm_lowcomms_na_has_addr(const struct dlm_node_addr *na, + const struct sockaddr_storage *addr) +{ + int i; + + spin_lock(&dlm_node_addrs_spin); + for (i = 0; i < na->addr_count; i++) { + if (addr_compare(na->addr[i], addr)) { + spin_unlock(&dlm_node_addrs_spin); + return true; + } + } + spin_unlock(&dlm_node_addrs_spin); + + return false; +} + int dlm_lowcomms_addr(int nodeid, struct sockaddr_storage *addr, int len) { struct sockaddr_storage *new_addr; struct dlm_node_addr *new_node, *na; + bool ret; new_node = kzalloc(sizeof(struct dlm_node_addr), GFP_NOFS); if (!new_node) @@ -398,6 +416,14 @@ int dlm_lowcomms_addr(int nodeid, struct sockaddr_storage *addr, int len) return 0; } + ret = dlm_lowcomms_na_has_addr(na, addr); + if (ret) { + spin_unlock(&dlm_node_addrs_spin); + kfree(new_addr); + kfree(new_node); + return -EEXIST; + } + if (na->addr_count >= DLM_MAX_ADDR_COUNT) { spin_unlock(&dlm_node_addrs_spin); kfree(new_addr); -- 2.26.2