I missed that you used Partha's non-existing Ericsson mail address in the signed-off field. This must be corrected to his current address.
///jon > -----Original Message----- > From: Mohan Krishna Ghanta Krishnamurthy > Sent: Tuesday, March 13, 2018 11:20 > To: [email protected]; Jon Maloy > <[email protected]>; [email protected]; Ying Xue > <[email protected]> > Cc: Parthasarathy Bhuvaragan <[email protected]> > Subject: [net-next 1/3] tipc: modify socket iterator for sock_diag > > The current socket iterator function tipc_nl_sk_dump, handles socket locks > and calls __tipc_nl_add_sk for each socket. > To reuse this logic in sock_diag implementation, we do minor modifications > to make these functions generic as described below. > > In this commit, we add a two new functions __tipc_nl_sk_walk, > __tipc_nl_add_sk_info and modify tipc_nl_sk_dump, __tipc_nl_add_sk > accordingly. > > In __tipc_nl_sk_walk we: > 1. acquire and release socket locks > 2. for each socket, execute the specified callback function > > In __tipc_nl_add_sk we: > - Move the netlink attribute insertion to __tipc_nl_add_sk_info. > > tipc_nl_sk_dump calls tipc_nl_sk_walk with __tipc_nl_add_sk as argument. > > sock_diag will use these generic functions in a later commit. > > There is no functional change in this commit. > Signed-off-by: GhantaKrishnamurthy MohanKrishna > <[email protected]> > Signed-off-by: Parthasarathy Bhuvaragan > <[email protected]> > --- > net/tipc/socket.c | 63 +++++++++++++++++++++++++++++++++++---------- > ---------- > 1 file changed, 40 insertions(+), 23 deletions(-) > > diff --git a/net/tipc/socket.c b/net/tipc/socket.c index > f93477187a90..cc0c701fc71b 100644 > --- a/net/tipc/socket.c > +++ b/net/tipc/socket.c > @@ -3154,16 +3154,33 @@ static int __tipc_nl_add_sk_con(struct sk_buff > *skb, struct tipc_sock *tsk) > return -EMSGSIZE; > } > > +static int __tipc_nl_add_sk_info(struct sk_buff *skb, struct tipc_sock > + *tsk) > +{ > + struct net *net = sock_net(skb->sk); > + struct tipc_net *tn = net_generic(net, tipc_net_id); > + struct sock *sk = &tsk->sk; > + > + if (nla_put_u32(skb, TIPC_NLA_SOCK_REF, tsk->portid) || > + nla_put_u32(skb, TIPC_NLA_SOCK_ADDR, tn->own_addr)) > + return -EMSGSIZE; > + > + if (tipc_sk_connected(sk)) { > + if (__tipc_nl_add_sk_con(skb, tsk)) > + return -EMSGSIZE; > + } else if (!list_empty(&tsk->publications)) { > + if (nla_put_flag(skb, TIPC_NLA_SOCK_HAS_PUBL)) > + return -EMSGSIZE; > + } > + return 0; > +} > + > /* Caller should hold socket lock for the passed tipc socket. */ static int > __tipc_nl_add_sk(struct sk_buff *skb, struct netlink_callback *cb, > struct tipc_sock *tsk) > { > - int err; > - void *hdr; > struct nlattr *attrs; > - struct net *net = sock_net(skb->sk); > - struct tipc_net *tn = net_generic(net, tipc_net_id); > - struct sock *sk = &tsk->sk; > + void *hdr; > > hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh- > >nlmsg_seq, > &tipc_genl_family, NLM_F_MULTI, > TIPC_NL_SOCK_GET); @@ -3173,19 +3190,10 @@ static int > __tipc_nl_add_sk(struct sk_buff *skb, struct netlink_callback *cb, > attrs = nla_nest_start(skb, TIPC_NLA_SOCK); > if (!attrs) > goto genlmsg_cancel; > - if (nla_put_u32(skb, TIPC_NLA_SOCK_REF, tsk->portid)) > - goto attr_msg_cancel; > - if (nla_put_u32(skb, TIPC_NLA_SOCK_ADDR, tn->own_addr)) > + > + if (__tipc_nl_add_sk_info(skb, tsk)) > goto attr_msg_cancel; > > - if (tipc_sk_connected(sk)) { > - err = __tipc_nl_add_sk_con(skb, tsk); > - if (err) > - goto attr_msg_cancel; > - } else if (!list_empty(&tsk->publications)) { > - if (nla_put_flag(skb, TIPC_NLA_SOCK_HAS_PUBL)) > - goto attr_msg_cancel; > - } > nla_nest_end(skb, attrs); > genlmsg_end(skb, hdr); > > @@ -3199,16 +3207,19 @@ static int __tipc_nl_add_sk(struct sk_buff *skb, > struct netlink_callback *cb, > return -EMSGSIZE; > } > > -int tipc_nl_sk_dump(struct sk_buff *skb, struct netlink_callback *cb) > +static int __tipc_nl_sk_walk(struct sk_buff *skb, struct netlink_callback > *cb, > + int (*skb_handler)(struct sk_buff *skb, > + struct netlink_callback *cb, > + struct tipc_sock *tsk)) > { > - int err; > - struct tipc_sock *tsk; > - const struct bucket_table *tbl; > - struct rhash_head *pos; > struct net *net = sock_net(skb->sk); > struct tipc_net *tn = net_generic(net, tipc_net_id); > - u32 tbl_id = cb->args[0]; > + const struct bucket_table *tbl; > u32 prev_portid = cb->args[1]; > + u32 tbl_id = cb->args[0]; > + struct rhash_head *pos; > + struct tipc_sock *tsk; > + int err; > > rcu_read_lock(); > tbl = rht_dereference_rcu((&tn->sk_rht)->tbl, &tn->sk_rht); @@ - > 3220,12 +3231,13 @@ int tipc_nl_sk_dump(struct sk_buff *skb, struct > netlink_callback *cb) > continue; > } > > - err = __tipc_nl_add_sk(skb, cb, tsk); > + err = skb_handler(skb, cb, tsk); > if (err) { > prev_portid = tsk->portid; > spin_unlock_bh(&tsk->sk.sk_lock.slock); > goto out; > } > + > prev_portid = 0; > spin_unlock_bh(&tsk->sk.sk_lock.slock); > } > @@ -3238,6 +3250,11 @@ int tipc_nl_sk_dump(struct sk_buff *skb, struct > netlink_callback *cb) > return skb->len; > } > > +int tipc_nl_sk_dump(struct sk_buff *skb, struct netlink_callback *cb) { > + return __tipc_nl_sk_walk(skb, cb, __tipc_nl_add_sk); } > + > /* Caller should hold socket lock for the passed tipc socket. */ static int > __tipc_nl_add_sk_publ(struct sk_buff *skb, > struct netlink_callback *cb, > -- > 2.1.4 ------------------------------------------------------------------------------ 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 [email protected] https://lists.sourceforge.net/lists/listinfo/tipc-discussion
