Now it looks good. You can add an "Acked-by" from me and send it to netdev. Note that the patch must be directed to 'net', not 'net-next', since it is a bug correction. You should also add a line "Fixes: " with reference to the patch that introduced the problem.
BR ///jon > -----Original Message----- > From: Haiqing Bai <haiqing....@windriver.com> > Sent: Wednesday, 22 August, 2018 02:40 > To: tipc-discussion@lists.sourceforge.net > Cc: Jon Maloy <jon.ma...@ericsson.com>; ying....@windriver.com; > da...@davemloft.net; zhenbo....@windriver.com; > haiqing....@windriver.com > Subject: [tipc-discussion][PATCH] tipc: fix the big/little endian issue in > tipc_dest > > In function tipc_dest_push, the 32bit variables 'node' and 'port' > are stored separately in uppper and lower part of 64bit 'value'. > Then this value is assigned to dst->value which is a union like: > union > { > struct { > u32 port; > u32 node; > }; > u64 value; > } > This works on little-endian machines like x86 but fails on big-endian > machines. > > The fix remove the 'value' stack parameter and even the 'value' > member of the union in tipc_dest, assign the 'node' and 'port' member > directly with the input parameter to avoid the endian issue. > > Signed-off-by: Zhenbo Gao <zhenbo....@windriver.com> > Signed-off-by: Haiqing Bai <haiqing....@windriver.com> > --- > net/tipc/name_table.c | 10 ++++------ > net/tipc/name_table.h | 9 ++------- > 2 files changed, 6 insertions(+), 13 deletions(-) > > diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c > index ed0457c..664c644 100644 > --- a/net/tipc/name_table.c > +++ b/net/tipc/name_table.c > @@ -1117,20 +1117,17 @@ int tipc_nl_name_table_dump(struct sk_buff *skb, > struct netlink_callback *cb) > > struct tipc_dest *tipc_dest_find(struct list_head *l, u32 node, u32 port) > { > - u64 value = (u64)node << 32 | port; > struct tipc_dest *dst; > > list_for_each_entry(dst, l, list) { > - if (dst->value != value) > - continue; > - return dst; > + if (dst->node == node && dst->port == port) > + return dst; > } > return NULL; > } > > bool tipc_dest_push(struct list_head *l, u32 node, u32 port) > { > - u64 value = (u64)node << 32 | port; > struct tipc_dest *dst; > > if (tipc_dest_find(l, node, port)) > @@ -1139,7 +1136,8 @@ bool tipc_dest_push(struct list_head *l, u32 node, u32 > port) > dst = kmalloc(sizeof(*dst), GFP_ATOMIC); > if (unlikely(!dst)) > return false; > - dst->value = value; > + dst->node = node; > + dst->port = port; > list_add(&dst->list, l); > return true; > } > diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h > index f56e7cb..2395408 100644 > --- a/net/tipc/name_table.h > +++ b/net/tipc/name_table.h > @@ -127,13 +127,8 @@ void tipc_nametbl_stop(struct net *net); > > struct tipc_dest { > struct list_head list; > - union { > - struct { > - u32 port; > - u32 node; > - }; > - u64 value; > - }; > + u32 port; > + u32 node; > }; > > struct tipc_dest *tipc_dest_find(struct list_head *l, u32 node, u32 port); > -- > 1.9.1 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion