netlink: make nlmsg_end() and genlmsg_end() void
authorJohannes Berg <johannes.berg@intel.com>
Fri, 16 Jan 2015 21:09:00 +0000 (22:09 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 18 Jan 2015 06:03:45 +0000 (01:03 -0500)
Contrary to common expectations for an "int" return, these functions
return only a positive value -- if used correctly they cannot even
return 0 because the message header will necessarily be in the skb.

This makes the very common pattern of

  if (genlmsg_end(...) < 0) { ... }

be a whole bunch of dead code. Many places also simply do

  return nlmsg_end(...);

and the caller is expected to deal with it.

This also commonly (at least for me) causes errors, because it is very
common to write

  if (my_function(...))
    /* error condition */

and if my_function() does "return nlmsg_end()" this is of course wrong.

Additionally, there's not a single place in the kernel that actually
needs the message length returned, and if anyone needs it later then
it'll be very easy to just use skb->len there.

Remove this, and make the functions void. This removes a bunch of dead
code as described above. The patch adds lines because I did

- return nlmsg_end(...);
+ nlmsg_end(...);
+ return 0;

I could have preserved all the function's return values by returning
skb->len, but instead I've audited all the places calling the affected
functions and found that none cared. A few places actually compared
the return value with <= 0 in dump functionality, but that could just
be changed to < 0 with no change in behaviour, so I opted for the more
efficient version.

One instance of the error I've made numerous times now is also present
in net/phonet/pn_netlink.c in the route_dumpit() function - it didn't
check for <0 or <=0 and thus broke out of the loop every single time.
I've preserved this since it will (I think) have caused the messages to
userspace to be formatted differently with just a single message for
every SKB returned to userspace. It's possible that this isn't needed
for the tools that actually use this, but I don't even know what they
are so couldn't test that changing this behaviour would be acceptable.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
51 files changed:
drivers/acpi/event.c
drivers/net/ethernet/rocker/rocker.c
drivers/net/vxlan.c
drivers/net/wireless/mac80211_hwsim.c
drivers/scsi/pmcraid.c
drivers/target/target_core_user.c
drivers/thermal/thermal_core.c
fs/dlm/netlink.c
include/net/genetlink.h
include/net/netlink.h
kernel/taskstats.c
net/bridge/br_fdb.c
net/bridge/br_mdb.c
net/bridge/br_netlink.c
net/can/gw.c
net/core/fib_rules.c
net/core/neighbour.c
net/core/rtnetlink.c
net/decnet/dn_dev.c
net/decnet/dn_route.c
net/decnet/dn_table.c
net/ieee802154/netlink.c
net/ieee802154/nl-mac.c
net/ieee802154/nl-phy.c
net/ieee802154/nl802154.c
net/ipv4/devinet.c
net/ipv4/fib_semantics.c
net/ipv4/inet_diag.c
net/ipv4/ipmr.c
net/ipv4/route.c
net/ipv4/tcp_metrics.c
net/ipv6/addrconf.c
net/ipv6/addrlabel.c
net/ipv6/ip6_fib.c
net/ipv6/ip6mr.c
net/ipv6/route.c
net/l2tp/l2tp_netlink.c
net/netfilter/ipvs/ip_vs_ctl.c
net/netfilter/nf_tables_api.c
net/netlabel/netlabel_cipso_v4.c
net/netlabel/netlabel_mgmt.c
net/netlabel/netlabel_unlabeled.c
net/netlink/diag.c
net/netlink/genetlink.c
net/nfc/netlink.c
net/openvswitch/datapath.c
net/packet/diag.c
net/phonet/pn_netlink.c
net/unix/diag.c
net/wireless/nl80211.c
net/xfrm/xfrm_user.c

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/can/gw.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/ipv4/ipmr.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/unix/diag.c
Simple merge
Simple merge
Simple merge