cluster-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
* [Cluster-devel] [PATCH dlm/next 0/3] fs: dlm: node address configuration fixes
@ 2020-10-20 21:09 Alexander Aring
  2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 1/3] fs: dlm: cleanup dlm_local_addr properly Alexander Aring
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Alexander Aring @ 2020-10-20 21:09 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Hi,

I got reports of:

kernel: dlm: TCP protocol can't handle multi-homed hosts, try SCTP

there was some reconfiguration involed and my guess it that we
left some dlm_local_addr array pointers in some dangled state. The
first patch should fix the observed behaviour. The other patches is
something what I thought can also happen, it just checks if we
setup a node address twice, if this is the case we return -EEXIST.

This is based on dlm/next with the previous submitted patch series.

- Alex

Alexander Aring (3):
  fs: dlm: cleanup dlm_local_addr properly
  fs: dlm: constify addr_compare
  fs: dlm: check on existing node address

 fs/dlm/lowcomms.c | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

-- 
2.26.2



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Cluster-devel] [PATCH dlm/next 1/3] fs: dlm: cleanup dlm_local_addr properly
  2020-10-20 21:09 [Cluster-devel] [PATCH dlm/next 0/3] fs: dlm: node address configuration fixes Alexander Aring
@ 2020-10-20 21:09 ` Alexander Aring
  2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 2/3] fs: dlm: constify addr_compare Alexander Aring
  2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 3/3] fs: dlm: check on existing node address Alexander Aring
  2 siblings, 0 replies; 5+ messages in thread
From: Alexander Aring @ 2020-10-20 21:09 UTC (permalink / raw)
  To: cluster-devel.redhat.com

This patch assigns the dlm_local_addr entries to NULL after we freeing
the memory of the entry. This required because the user can changed some
settings with less addresses than before and a NULL check on start
functionality will check on a dangled pointer.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
---
 fs/dlm/lowcomms.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 11e5e92148fda..9973293bfddcd 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -1248,8 +1248,10 @@ static void deinit_local(void)
 {
 	int i;
 
-	for (i = 0; i < dlm_local_count; i++)
+	for (i = 0; i < dlm_local_count; i++) {
 		kfree(dlm_local_addr[i]);
+		dlm_local_addr[i] = NULL;
+	}
 }
 
 /* Initialise SCTP socket and bind to all interfaces
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Cluster-devel] [PATCH dlm/next 2/3] fs: dlm: constify addr_compare
  2020-10-20 21:09 [Cluster-devel] [PATCH dlm/next 0/3] fs: dlm: node address configuration fixes Alexander Aring
  2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 1/3] fs: dlm: cleanup dlm_local_addr properly Alexander Aring
@ 2020-10-20 21:09 ` Alexander Aring
  2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 3/3] fs: dlm: check on existing node address Alexander Aring
  2 siblings, 0 replies; 5+ messages in thread
From: Alexander Aring @ 2020-10-20 21:09 UTC (permalink / raw)
  To: cluster-devel.redhat.com

This patch just constify some function parameter which should be have a
read access only.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
---
 fs/dlm/lowcomms.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 9973293bfddcd..c23d794e82910 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -270,7 +270,8 @@ static struct dlm_node_addr *find_node_addr(int nodeid)
 	return NULL;
 }
 
-static int addr_compare(struct sockaddr_storage *x, struct sockaddr_storage *y)
+static int addr_compare(const struct sockaddr_storage *x,
+			const struct sockaddr_storage *y)
 {
 	switch (x->ss_family) {
 	case AF_INET: {
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Cluster-devel] [PATCH dlm/next 3/3] fs: dlm: check on existing node address
  2020-10-20 21:09 [Cluster-devel] [PATCH dlm/next 0/3] fs: dlm: node address configuration fixes Alexander Aring
  2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 1/3] fs: dlm: cleanup dlm_local_addr properly Alexander Aring
  2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 2/3] fs: dlm: constify addr_compare Alexander Aring
@ 2020-10-20 21:09 ` Alexander Aring
  2020-10-20 23:04   ` Alexander Ahring Oder Aring
  2 siblings, 1 reply; 5+ messages in thread
From: Alexander Aring @ 2020-10-20 21:09 UTC (permalink / raw)
  To: cluster-devel.redhat.com

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 <aahringo@redhat.com>
---
 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



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Cluster-devel] [PATCH dlm/next 3/3] fs: dlm: check on existing node address
  2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 3/3] fs: dlm: check on existing node address Alexander Aring
@ 2020-10-20 23:04   ` Alexander Ahring Oder Aring
  0 siblings, 0 replies; 5+ messages in thread
From: Alexander Ahring Oder Aring @ 2020-10-20 23:04 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Hi,

On Tue, Oct 20, 2020 at 5:10 PM Alexander Aring <aahringo@redhat.com> wrote:
>
> 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 <aahringo@redhat.com>
> ---
>  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);

grml, this lock is already held when calling that function, I need to
remove the lock and make some comment that this lock needs to be held
when the user calls it.

Sorry, I will send a v2.

- Alex



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-10-20 23:04 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-20 21:09 [Cluster-devel] [PATCH dlm/next 0/3] fs: dlm: node address configuration fixes Alexander Aring
2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 1/3] fs: dlm: cleanup dlm_local_addr properly Alexander Aring
2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 2/3] fs: dlm: constify addr_compare Alexander Aring
2020-10-20 21:09 ` [Cluster-devel] [PATCH dlm/next 3/3] fs: dlm: check on existing node address Alexander Aring
2020-10-20 23:04   ` Alexander Ahring Oder Aring

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).