Skip to content

Commit

Permalink
netlink: add netlink_dump_control structure for netlink_dump_start()
Browse files Browse the repository at this point in the history
Davem considers that the argument list of this interface is getting
out of control. This patch tries to address this issue following
his proposal:

struct netlink_dump_control c = { .dump = dump, .done = done, ... };

netlink_dump_start(..., &c);

Suggested by David S. Miller.

Signed-off-by: Pablo Neira Ayuso <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
ummakynes authored and davem330 committed Feb 26, 2012
1 parent 48e316b commit 80d326f
Show file tree
Hide file tree
Showing 12 changed files with 87 additions and 43 deletions.
10 changes: 7 additions & 3 deletions crypto/crypto_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -389,9 +389,13 @@ static int crypto_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
(nlh->nlmsg_flags & NLM_F_DUMP))) {
if (link->dump == NULL)
return -EINVAL;

return netlink_dump_start(crypto_nlsk, skb, nlh,
link->dump, link->done, 0);
{
struct netlink_dump_control c = {
.dump = link->dump,
.done = link->done,
};
return netlink_dump_start(crypto_nlsk, skb, nlh, &c);
}
}

err = nlmsg_parse(nlh, crypto_msg_min[type], attrs, CRYPTOCFGA_MAX,
Expand Down
10 changes: 7 additions & 3 deletions drivers/infiniband/core/netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,9 +147,13 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
if (op < 0 || op >= client->nops ||
!client->cb_table[RDMA_NL_GET_OP(op)].dump)
return -EINVAL;
return netlink_dump_start(nls, skb, nlh,
client->cb_table[op].dump,
NULL, 0);

{
struct netlink_dump_control c = {
.dump = client->cb_table[op].dump,
};
return netlink_dump_start(nls, skb, nlh, &c);
}
}
}

Expand Down
10 changes: 7 additions & 3 deletions include/linux/netlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,11 +248,15 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
#define NLMSG_PUT(skb, pid, seq, type, len) \
NLMSG_NEW(skb, pid, seq, type, len, 0)

struct netlink_dump_control {
int (*dump)(struct sk_buff *skb, struct netlink_callback *);
int (*done)(struct netlink_callback*);
u16 min_dump_alloc;
};

extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
const struct nlmsghdr *nlh,
int (*dump)(struct sk_buff *skb, struct netlink_callback*),
int (*done)(struct netlink_callback*),
u16 min_dump_alloc);
struct netlink_dump_control *control);


#define NL_NONROOT_RECV 0x1
Expand Down
9 changes: 7 additions & 2 deletions net/core/rtnetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -1981,8 +1981,13 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)

__rtnl_unlock();
rtnl = net->rtnl;
err = netlink_dump_start(rtnl, skb, nlh, dumpit,
NULL, min_dump_alloc);
{
struct netlink_dump_control c = {
.dump = dumpit,
.min_dump_alloc = min_dump_alloc,
};
err = netlink_dump_start(rtnl, skb, nlh, &c);
}
rtnl_lock();
return err;
}
Expand Down
18 changes: 12 additions & 6 deletions net/ipv4/inet_diag.c
Original file line number Diff line number Diff line change
Expand Up @@ -960,9 +960,12 @@ static int inet_diag_rcv_msg_compat(struct sk_buff *skb, struct nlmsghdr *nlh)
inet_diag_bc_audit(nla_data(attr), nla_len(attr)))
return -EINVAL;
}

return netlink_dump_start(sock_diag_nlsk, skb, nlh,
inet_diag_dump_compat, NULL, 0);
{
struct netlink_dump_control c = {
.dump = inet_diag_dump_compat,
};
return netlink_dump_start(sock_diag_nlsk, skb, nlh, &c);
}
}

return inet_diag_get_exact_compat(skb, nlh);
Expand All @@ -985,9 +988,12 @@ static int inet_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h)
inet_diag_bc_audit(nla_data(attr), nla_len(attr)))
return -EINVAL;
}

return netlink_dump_start(sock_diag_nlsk, skb, h,
inet_diag_dump, NULL, 0);
{
struct netlink_dump_control c = {
.dump = inet_diag_dump,
};
return netlink_dump_start(sock_diag_nlsk, skb, h, &c);
}
}

return inet_diag_get_exact(skb, h, (struct inet_diag_req_v2 *)NLMSG_DATA(h));
Expand Down
10 changes: 7 additions & 3 deletions net/netfilter/ipset/ip_set_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1162,9 +1162,13 @@ ip_set_dump(struct sock *ctnl, struct sk_buff *skb,
if (unlikely(protocol_failed(attr)))
return -IPSET_ERR_PROTOCOL;

return netlink_dump_start(ctnl, skb, nlh,
ip_set_dump_start,
ip_set_dump_done, 0);
{
struct netlink_dump_control c = {
.dump = ip_set_dump_start,
.done = ip_set_dump_done,
};
return netlink_dump_start(ctnl, skb, nlh, &c);
}
}

/* Add, del and test */
Expand Down
18 changes: 12 additions & 6 deletions net/netfilter/nf_conntrack_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -977,9 +977,13 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
u16 zone;
int err;

if (nlh->nlmsg_flags & NLM_F_DUMP)
return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table,
ctnetlink_done, 0);
if (nlh->nlmsg_flags & NLM_F_DUMP) {
struct netlink_dump_control c = {
.dump = ctnetlink_dump_table,
.done = ctnetlink_done,
};
return netlink_dump_start(ctnl, skb, nlh, &c);
}

err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
if (err < 0)
Expand Down Expand Up @@ -1850,9 +1854,11 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
int err;

if (nlh->nlmsg_flags & NLM_F_DUMP) {
return netlink_dump_start(ctnl, skb, nlh,
ctnetlink_exp_dump_table,
ctnetlink_exp_done, 0);
struct netlink_dump_control c = {
.dump = ctnetlink_exp_dump_table,
.done = ctnetlink_exp_done,
};
return netlink_dump_start(ctnl, skb, nlh, &c);
}

err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
Expand Down
6 changes: 4 additions & 2 deletions net/netfilter/nfnetlink_acct.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,10 @@ nfnl_acct_get(struct sock *nfnl, struct sk_buff *skb,
char *acct_name;

if (nlh->nlmsg_flags & NLM_F_DUMP) {
return netlink_dump_start(nfnl, skb, nlh, nfnl_acct_dump,
NULL, 0);
struct netlink_dump_control c = {
.dump = nfnl_acct_dump,
};
return netlink_dump_start(nfnl, skb, nlh, &c);
}

if (!tb[NFACCT_NAME])
Expand Down
11 changes: 4 additions & 7 deletions net/netlink/af_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -1736,10 +1736,7 @@ static int netlink_dump(struct sock *sk)

int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
const struct nlmsghdr *nlh,
int (*dump)(struct sk_buff *skb,
struct netlink_callback *),
int (*done)(struct netlink_callback *),
u16 min_dump_alloc)
struct netlink_dump_control *control)
{
struct netlink_callback *cb;
struct sock *sk;
Expand All @@ -1750,10 +1747,10 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
if (cb == NULL)
return -ENOBUFS;

cb->dump = dump;
cb->done = done;
cb->dump = control->dump;
cb->done = control->done;
cb->nlh = nlh;
cb->min_dump_alloc = min_dump_alloc;
cb->min_dump_alloc = control->min_dump_alloc;
atomic_inc(&skb->users);
cb->skb = skb;

Expand Down
9 changes: 7 additions & 2 deletions net/netlink/genetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -563,8 +563,13 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
return -EOPNOTSUPP;

genl_unlock();
err = netlink_dump_start(net->genl_sock, skb, nlh,
ops->dumpit, ops->done, 0);
{
struct netlink_dump_control c = {
.dump = ops->dumpit,
.done = ops->done,
};
err = netlink_dump_start(net->genl_sock, skb, nlh, &c);
}
genl_lock();
return err;
}
Expand Down
10 changes: 6 additions & 4 deletions net/unix/diag.c
Original file line number Diff line number Diff line change
Expand Up @@ -301,10 +301,12 @@ static int unix_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h)
if (nlmsg_len(h) < hdrlen)
return -EINVAL;

if (h->nlmsg_flags & NLM_F_DUMP)
return netlink_dump_start(sock_diag_nlsk, skb, h,
unix_diag_dump, NULL, 0);
else
if (h->nlmsg_flags & NLM_F_DUMP) {
struct netlink_dump_control c = {
.dump = unix_diag_dump,
};
return netlink_dump_start(sock_diag_nlsk, skb, h, &c);
} else
return unix_diag_get_exact(skb, h, (struct unix_diag_req *)NLMSG_DATA(h));
}

Expand Down
9 changes: 7 additions & 2 deletions net/xfrm/xfrm_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -2299,8 +2299,13 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
if (link->dump == NULL)
return -EINVAL;

return netlink_dump_start(net->xfrm.nlsk, skb, nlh,
link->dump, link->done, 0);
{
struct netlink_dump_control c = {
.dump = link->dump,
.done = link->done,
};
return netlink_dump_start(net->xfrm.nlsk, skb, nlh, &c);
}
}

err = nlmsg_parse(nlh, xfrm_msg_min[type], attrs, XFRMA_MAX,
Expand Down

0 comments on commit 80d326f

Please sign in to comment.