[tipc-discussion] [net-next v2 2/2] tipc: clean up warnings detected by sparse

2021-03-11 Thread Hoang Huu Le
This patch fixes the following warning from sparse:

net/tipc/monitor.c:263:35: warning: incorrect type in assignment (different 
base types)
net/tipc/monitor.c:263:35:expected unsigned int
net/tipc/monitor.c:263:35:got restricted __be32 [usertype]
[...]
net/tipc/node.c:374:13: warning: context imbalance in 'tipc_node_read_lock' - 
wrong count at exit
net/tipc/node.c:379:13: warning: context imbalance in 'tipc_node_read_unlock' - 
unexpected unlock
net/tipc/node.c:384:13: warning: context imbalance in 'tipc_node_write_lock' - 
wrong count at exit
net/tipc/node.c:389:13: warning: context imbalance in 
'tipc_node_write_unlock_fast' - unexpected unlock
net/tipc/node.c:404:17: warning: context imbalance in 'tipc_node_write_unlock' 
- unexpected unlock
[...]
net/tipc/crypto.c:1201:9: warning: incorrect type in initializer (different 
address spaces)
net/tipc/crypto.c:1201:9:expected struct tipc_aead [noderef] __rcu *__tmp
net/tipc/crypto.c:1201:9:got struct tipc_aead *
[...]

v2: switch to use the keyword "__always_inline" for inline function

Acked-by: Jon Maloy 
Signed-off-by: Hoang Huu Le 
---
 net/tipc/crypto.c  | 13 +-
 net/tipc/monitor.c | 63 ++
 net/tipc/node.c|  5 
 3 files changed, 59 insertions(+), 22 deletions(-)

diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c
index f4fca8f7f63f..b428fa1c3241 100644
--- a/net/tipc/crypto.c
+++ b/net/tipc/crypto.c
@@ -317,7 +317,7 @@ static int tipc_aead_key_generate(struct tipc_aead_key 
*skey);
 
 #define tipc_aead_rcu_replace(rcu_ptr, ptr, lock)  \
 do {   \
-   typeof(rcu_ptr) __tmp = rcu_dereference_protected((rcu_ptr),\
+   struct tipc_aead *__tmp = rcu_dereference_protected((rcu_ptr),  \
lockdep_is_held(lock)); \
rcu_assign_pointer((rcu_ptr), (ptr));   \
tipc_aead_put(__tmp);   \
@@ -798,7 +798,7 @@ static int tipc_aead_encrypt(struct tipc_aead *aead, struct 
sk_buff *skb,
ehdr = (struct tipc_ehdr *)skb->data;
salt = aead->salt;
if (aead->mode == CLUSTER_KEY)
-   salt ^= ehdr->addr; /* __be32 */
+   salt ^= __be32_to_cpu(ehdr->addr);
else if (__dnode)
salt ^= tipc_node_get_addr(__dnode);
memcpy(iv, , 4);
@@ -929,7 +929,7 @@ static int tipc_aead_decrypt(struct net *net, struct 
tipc_aead *aead,
ehdr = (struct tipc_ehdr *)skb->data;
salt = aead->salt;
if (aead->mode == CLUSTER_KEY)
-   salt ^= ehdr->addr; /* __be32 */
+   salt ^= __be32_to_cpu(ehdr->addr);
else if (ehdr->destined)
salt ^= tipc_own_addr(net);
memcpy(iv, , 4);
@@ -1946,16 +1946,17 @@ static void tipc_crypto_rcv_complete(struct net *net, 
struct tipc_aead *aead,
goto rcv;
}
tipc_aead_put(aead);
-   aead = tipc_aead_get(tmp);
+   aead = tipc_aead_get((struct tipc_aead __force __rcu *)tmp);
}
 
if (unlikely(err)) {
-   tipc_aead_users_dec(aead, INT_MIN);
+   tipc_aead_users_dec((struct tipc_aead __force __rcu *)aead,
+   INT_MIN);
goto free_skb;
}
 
/* Set the RX key's user */
-   tipc_aead_users_set(aead, 1);
+   tipc_aead_users_set((struct tipc_aead __force __rcu *)aead, 1);
 
/* Mark this point, RX works */
rx->timer1 = jiffies;
diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c
index 48fac3b17e40..1b514cb7a7d3 100644
--- a/net/tipc/monitor.c
+++ b/net/tipc/monitor.c
@@ -104,6 +104,36 @@ static struct tipc_monitor *tipc_monitor(struct net *net, 
int bearer_id)
 
 const int tipc_max_domain_size = sizeof(struct tipc_mon_domain);
 
+static __always_inline u16 mon_cpu_to_le16(u16 val)
+{
+   return (__force __u16)htons(val);
+}
+
+static __always_inline u32 mon_cpu_to_le32(u32 val)
+{
+   return (__force __u32)htonl(val);
+}
+
+static __always_inline u64 mon_cpu_to_le64(u64 val)
+{
+   return (__force __u64)cpu_to_be64(val);
+}
+
+static __always_inline u16 mon_le16_to_cpu(u16 val)
+{
+   return ntohs((__force __be16)val);
+}
+
+static __always_inline u32 mon_le32_to_cpu(u32 val)
+{
+   return ntohl((__force __be32)val);
+}
+
+static __always_inline u64 mon_le64_to_cpu(u64 val)
+{
+   return be64_to_cpu((__force __be64)val);
+}
+
 /* dom_rec_len(): actual length of domain record for transport
  */
 static int dom_rec_len(struct tipc_mon_domain *dom, u16 mcnt)
@@ -260,16 +290,16 @@ static void mon_update_local_domain(struct tipc_monitor 
*mon)
diff |= dom->members[i] != peer->addr;
dom->members[i] = peer->addr;
map_set(>up_map, i, peer->is_up);
-   

[tipc-discussion] [net-next v2 2/2] tipc: clean up warnings detected by sparse

2021-01-18 Thread Hoang Huu Le
This patch fixes the following warning from sparse:

net/tipc/monitor.c:263:35: warning: incorrect type in assignment (different 
base types)
net/tipc/monitor.c:263:35:expected unsigned int
net/tipc/monitor.c:263:35:got restricted __be32 [usertype]
[...]
net/tipc/node.c:374:13: warning: context imbalance in 'tipc_node_read_lock' - 
wrong count at exit
net/tipc/node.c:379:13: warning: context imbalance in 'tipc_node_read_unlock' - 
unexpected unlock
net/tipc/node.c:384:13: warning: context imbalance in 'tipc_node_write_lock' - 
wrong count at exit
net/tipc/node.c:389:13: warning: context imbalance in 
'tipc_node_write_unlock_fast' - unexpected unlock
net/tipc/node.c:404:17: warning: context imbalance in 'tipc_node_write_unlock' 
- unexpected unlock
[...]
net/tipc/crypto.c:1201:9: warning: incorrect type in initializer (different 
address spaces)
net/tipc/crypto.c:1201:9:expected struct tipc_aead [noderef] __rcu *__tmp
net/tipc/crypto.c:1201:9:got struct tipc_aead *
[...]

Signed-off-by: Hoang Huu Le 
---
 net/tipc/crypto.c  | 12 -
 net/tipc/monitor.c | 63 ++
 net/tipc/node.c|  5 
 3 files changed, 58 insertions(+), 22 deletions(-)

diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c
index f4fca8f7f63f..6f64acef73dc 100644
--- a/net/tipc/crypto.c
+++ b/net/tipc/crypto.c
@@ -317,7 +317,7 @@ static int tipc_aead_key_generate(struct tipc_aead_key 
*skey);
 
 #define tipc_aead_rcu_replace(rcu_ptr, ptr, lock)  \
 do {   \
-   typeof(rcu_ptr) __tmp = rcu_dereference_protected((rcu_ptr),\
+   struct tipc_aead *__tmp = rcu_dereference_protected((rcu_ptr),  \
lockdep_is_held(lock)); \
rcu_assign_pointer((rcu_ptr), (ptr));   \
tipc_aead_put(__tmp);   \
@@ -798,7 +798,7 @@ static int tipc_aead_encrypt(struct tipc_aead *aead, struct 
sk_buff *skb,
ehdr = (struct tipc_ehdr *)skb->data;
salt = aead->salt;
if (aead->mode == CLUSTER_KEY)
-   salt ^= ehdr->addr; /* __be32 */
+   salt ^= __be32_to_cpu(ehdr->addr);
else if (__dnode)
salt ^= tipc_node_get_addr(__dnode);
memcpy(iv, , 4);
@@ -929,7 +929,7 @@ static int tipc_aead_decrypt(struct net *net, struct 
tipc_aead *aead,
ehdr = (struct tipc_ehdr *)skb->data;
salt = aead->salt;
if (aead->mode == CLUSTER_KEY)
-   salt ^= ehdr->addr; /* __be32 */
+   salt ^= __be32_to_cpu(ehdr->addr);
else if (ehdr->destined)
salt ^= tipc_own_addr(net);
memcpy(iv, , 4);
@@ -1946,16 +1946,16 @@ static void tipc_crypto_rcv_complete(struct net *net, 
struct tipc_aead *aead,
goto rcv;
}
tipc_aead_put(aead);
-   aead = tipc_aead_get(tmp);
+   aead = tipc_aead_get((struct tipc_aead __force __rcu *)tmp);
}
 
if (unlikely(err)) {
-   tipc_aead_users_dec(aead, INT_MIN);
+   tipc_aead_users_dec((struct tipc_aead __force __rcu *)aead, 
INT_MIN);
goto free_skb;
}
 
/* Set the RX key's user */
-   tipc_aead_users_set(aead, 1);
+   tipc_aead_users_set((struct tipc_aead __force __rcu *)aead, 1);
 
/* Mark this point, RX works */
rx->timer1 = jiffies;
diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c
index 48fac3b17e40..407619697292 100644
--- a/net/tipc/monitor.c
+++ b/net/tipc/monitor.c
@@ -104,6 +104,36 @@ static struct tipc_monitor *tipc_monitor(struct net *net, 
int bearer_id)
 
 const int tipc_max_domain_size = sizeof(struct tipc_mon_domain);
 
+static inline u16 mon_cpu_to_le16(u16 val)
+{
+   return (__force __u16)htons(val);
+}
+
+static inline u32 mon_cpu_to_le32(u32 val)
+{
+   return (__force __u32)htonl(val);
+}
+
+static inline u64 mon_cpu_to_le64(u64 val)
+{
+   return (__force __u64)cpu_to_be64(val);
+}
+
+static inline u16 mon_le16_to_cpu(u16 val)
+{
+   return ntohs((__force __be16)val);
+}
+
+static inline u32 mon_le32_to_cpu(u32 val)
+{
+   return ntohl((__force __be32)val);
+}
+
+static inline u64 mon_le64_to_cpu(u64 val)
+{
+   return be64_to_cpu((__force __be64)val);
+}
+
 /* dom_rec_len(): actual length of domain record for transport
  */
 static int dom_rec_len(struct tipc_mon_domain *dom, u16 mcnt)
@@ -260,16 +290,16 @@ static void mon_update_local_domain(struct tipc_monitor 
*mon)
diff |= dom->members[i] != peer->addr;
dom->members[i] = peer->addr;
map_set(>up_map, i, peer->is_up);
-   cache->members[i] = htonl(peer->addr);
+   cache->members[i] = mon_cpu_to_le32(peer->addr);
}
diff |= dom->up_map != prev_up_map;
if (!diff)