Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge linux 3.0.59 #13

Merged
merged 73 commits into from
Jan 18, 2013
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
dc22f2d
powerpc: Fix CONFIG_RELOCATABLE=y CONFIG_CRASH_DUMP=n build
antonblanchard Nov 11, 2012
aea63e0
powerpc/vdso: Remove redundant locking in update_vsyscall_tz()
Nov 8, 2012
2c77bb3
s390/cio: fix pgid reserved check
Nov 30, 2012
63c5442
mm: compaction: fix echo 1 > compact_memory return error issue
LiuHui-Jason Jan 11, 2013
da0e14f
mm: use aligned zone start for pfn_to_bitidx calculation
labbott Jan 11, 2013
ae172f6
Revert "ath9k_hw: Update AR9003 high_power tx gain table"
Dec 6, 2012
46bea30
ath9k: ar9003: fix OTP register offsets for AR9340
juhosg Dec 9, 2012
f8ef1b3
firewire: net: Fix handling of fragmented multicast/broadcast packets.
gatzka Nov 28, 2012
b9ebaf5
SCSI: mvsas: fix undefined bit shift
xiw Nov 16, 2012
78c9672
SCSI: qla2xxx: Test and clear FCPORT_UPDATE_NEEDED atomically.
Nov 21, 2012
1bf3579
sata_promise: fix hardreset lockdep error
Sep 16, 2012
9b49bdf
libata: set dma_mode to 0xff in reset
aaronlu Dec 3, 2012
454a7d5
libata: fix Null pointer dereference on disk error
xtfeng Dec 13, 2012
52ae560
target/tcm_fc: fix the lockdep warning due to inconsistent lock state
yizou Dec 11, 2012
2c44276
mfd: Only unregister platform devices allocated by the mfd core
charleskeepax Nov 9, 2012
9d4cbf8
ext4: fix memory leak in ext4_xattr_set_acl()'s error path
Nov 8, 2012
113b47f
SUNRPC: Ensure that we free the rpc_task after cleanups are done
Jan 4, 2013
43f5d33
jffs2: hold erase_completion_lock on exit
khoroshilov Nov 5, 2012
03bdf8e
i2400m: add Intel 6150 device IDs
dcbw Dec 14, 2012
f03ef10
drm/i915: make the panel fitter work on pipes B and C on IVB
pzanoni-intel Nov 20, 2012
84181e4
RDMA/nes: Fix for crash when registering zero length MR for CQ
tatyana-en Dec 6, 2012
39126ac
RDMA/nes: Fix for terminate timer crash
tatyana-en Dec 6, 2012
61cdfbb
ring-buffer: Fix race between integrity check and readers
Nov 30, 2012
1cf8193
dm ioctl: prevent unsafe change to dm_ioctl data_size
kergon Dec 21, 2012
a32f2fe
staging: vt6656: [BUG] out of bound array reference in RFbSetPower.
Oct 7, 2012
4f668e4
staging: vt6656: 64 bit fixes: use u32 for QWORD definition.
Nov 11, 2012
f25b877
staging: vt6656: 64 bit fixes : correct all type sizes
Nov 11, 2012
355bda5
staging: vt6656: 64 bit fixes: fix long warning messages.
Nov 11, 2012
afaac0d
staging: vt6656: 64bit fixes: key.c/h change unsigned long to u32
Nov 11, 2012
f125f80
staging: vt6656: 64bit fixes: vCommandTimerWait change calculation of…
Nov 11, 2012
fc65b0b
video: mxsfb: fix crash when unblanking the display
lw-karo Nov 22, 2012
8cbe638
ext4: fix extent tree corruption caused by hole punch
forrest1209 Dec 17, 2012
7c558b7
jbd2: fix assertion failure in jbd2_journal_flush()
jankara Dec 21, 2012
1ba9a27
ext4: do not try to write superblock on ro remount w/o journal
Dec 25, 2012
a4202fd
ext4: lock i_mutex when truncating orphan inodes
tytso Dec 27, 2012
39a7319
aoe: do not call bdi_init after blk_alloc_queue
ecashin Jan 12, 2013
de3ecca
udf: fix memory leak while allocating blocks during write
namjaejeon Oct 9, 2012
cdfcbd8
udf: don't increment lenExtents while writing to a hole
namjaejeon Oct 9, 2012
457a972
thp, memcg: split hugepage for memcg oom on cow
rientjes May 29, 2012
5e3fe67
x86, amd: Disable way access filter on Piledriver CPUs
aprzywar Oct 31, 2012
4a6cf0c
ACPI : do not use Lid and Sleep button for S5 wakeup
zhang-rui Dec 4, 2012
2e3cbde
rtnetlink: Compute and store minimum ifinfo dump size
Jan 4, 2013
a0d3aa1
rtnetlink: Fix problem with buffer allocation
Jan 4, 2013
b18401a
rtnetlink: fix rtnl_calcit() and rtnl_dump_ifinfo()
Jan 4, 2013
93b4026
epoll: prevent missed events on EPOLL_CTL_MOD
Jan 1, 2013
639fd95
ASoC: wm2000: Fix sense of speech clarity enable
broonie Jan 4, 2013
e2abf66
ALSA: pxa27x: fix ac97 cold reset
mike-dunn Jan 7, 2013
bf302ba
staging: comedi: prevent auto-unconfig of manually configured devices
ian-abbott Dec 4, 2012
2d8a66e
staging: comedi: comedi_test: fix race when cancelling command
ian-abbott Jan 4, 2013
3057105
staging: r8712u: Add new device ID
lwfinger Dec 29, 2012
36aa870
staging: speakup: avoid out-of-range access in synth_init()
zeldovich Jan 5, 2013
71a1306
staging: speakup: avoid out-of-range access in synth_add()
sthibaul Jan 7, 2013
0c3b520
radeon/kms: force rn50 chip to always report connected on analog output
Jan 8, 2013
9e2bd12
mac80211: use del_timer_sync for final sta cleanup timer deletion
jmberg-intel Dec 13, 2012
aa6e90f
USB: option: add Nexpring NP10T terminal id
Dec 3, 2012
eaf103d
USB: option: blacklist network interface on ZTE MF880
bmork Dec 19, 2012
40d3aad
USB: option: Add new MEDIATEK PID support
snokw Dec 26, 2012
54923de
USB: option: add Telekom Speedstick LTE II
bmork Dec 28, 2012
edce154
usb: ftdi_sio: Crucible Technologies COMET Caller ID - pid added
qdotme Jan 13, 2013
6d9a5f5
USB: cdc-acm: Add support for "PSC Scanning, Magellan 800i"
Dec 26, 2012
fca884e
usb: gadget: dummy: fix enumeration with g_multi
Nov 20, 2012
e16e202
USB: Increase reset timeout.
Nov 15, 2012
b30765e
USB: hub: handle claim of enabled remote wakeup after reset
Nov 29, 2012
961161c
xhci: Handle HS bulk/ctrl endpoints that don't NAK.
Dec 17, 2012
d668f92
GFS2: Test bufdata with buffer locked and gfs2_log_lock held
bmarzins Nov 7, 2012
5b8692b
intel-iommu: Free old page tables before creating superpage
Dec 19, 2012
9d2fdad
KVM: PPC: 44x: fix DCR read/write
agraf Oct 6, 2012
f387ee8
Revert "drm/i915: no lvds quirk for Zotac ZDBOX SD ID12/ID13"
danvet Jan 7, 2013
57a7502
staging: comedi: don't hijack hardware device private data
ian-abbott Mar 30, 2012
7633459
staging: comedi: Kconfig: COMEDI_NI_AT_A2150 should select COMEDI_FC
ian-abbott Jan 3, 2013
0829a6c
Linux 3.0.59
gregkh Jan 17, 2013
dcc44ae
Merge branch 'linux-3.0.59' into odroid-3.0.y
zehome Jan 18, 2013
42e2885
Fix inexistant modem_if thing
zehome Jan 18, 2013
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
rtnetlink: Fix problem with buffer allocation
commit 115c9b8 upstream.

Implement a new netlink attribute type IFLA_EXT_MASK.  The mask
is a 32 bit value that can be used to indicate to the kernel that
certain extended ifinfo values are requested by the user application.
At this time the only mask value defined is RTEXT_FILTER_VF to
indicate that the user wants the ifinfo dump to send information
about the VFs belonging to the interface.

This patch fixes a bug in which certain applications do not have
large enough buffers to accommodate the extra information returned
by the kernel with large numbers of SR-IOV virtual functions.
Those applications will not send the new netlink attribute with
the interface info dump request netlink messages so they will
not get unexpectedly large request buffers returned by the kernel.

Modifies the rtnl_calcit function to traverse the list of net
devices and compute the minimum buffer size that can hold the
info dumps of all matching devices based upon the filter passed
in via the new netlink attribute filter mask.  If no filter
mask is sent then the buffer allocation defaults to NLMSG_GOODSIZE.

With this change it is possible to add yet to be defined netlink
attributes to the dump request which should make it fairly extensible
in the future.

Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Acked-by: Greg Rose <gregory.v.rose@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
[bwh: Backported to 3.0:
 - Adjust context
 - Drop the change in do_setlink() that reverts commit f18da14
   ('net: RTNETLINK adjusting values of min_ifinfo_dump_size'), which
   was never applied here]
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Greg Rose authored and gregkh committed Jan 17, 2013
commit a0d3aa1f04a7430fc80f6f1a7aaaaf495da8d8e1
1 change: 1 addition & 0 deletions include/linux/if_link.h
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ enum {
IFLA_AF_SPEC,
IFLA_GROUP, /* Group the device belongs to */
IFLA_NET_NS_FD,
IFLA_EXT_MASK, /* Extended info mask, VFs, etc */
__IFLA_MAX
};

Expand Down
3 changes: 3 additions & 0 deletions include/linux/rtnetlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -600,6 +600,9 @@ struct tcamsg {
#define TCA_ACT_TAB 1 /* attr type must be >=1 */
#define TCAA_MAX 1

/* New extended info filters for IFLA_EXT_MASK */
#define RTEXT_FILTER_VF (1 << 0)

/* End of information exported to user level */

#ifdef __KERNEL__
Expand Down
2 changes: 1 addition & 1 deletion include/net/rtnetlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, void *);
typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *);
typedef u16 (*rtnl_calcit_func)(struct sk_buff *);
typedef u16 (*rtnl_calcit_func)(struct sk_buff *, struct nlmsghdr *);

extern int __rtnl_register(int protocol, int msgtype,
rtnl_doit_func, rtnl_dumpit_func,
Expand Down
77 changes: 58 additions & 19 deletions net/core/rtnetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ struct rtnl_link {
};

static DEFINE_MUTEX(rtnl_mutex);
static u16 min_ifinfo_dump_size;

void rtnl_lock(void)
{
Expand Down Expand Up @@ -727,10 +726,11 @@ static void copy_rtnl_link_stats64(void *v, const struct rtnl_link_stats64 *b)
}

/* All VF info */
static inline int rtnl_vfinfo_size(const struct net_device *dev)
static inline int rtnl_vfinfo_size(const struct net_device *dev,
u32 ext_filter_mask)
{
if (dev->dev.parent && dev_is_pci(dev->dev.parent)) {

if (dev->dev.parent && dev_is_pci(dev->dev.parent) &&
(ext_filter_mask & RTEXT_FILTER_VF)) {
int num_vfs = dev_num_vf(dev->dev.parent);
size_t size = nla_total_size(sizeof(struct nlattr));
size += nla_total_size(num_vfs * sizeof(struct nlattr));
Expand Down Expand Up @@ -768,7 +768,8 @@ static size_t rtnl_port_size(const struct net_device *dev)
return port_self_size;
}

static noinline size_t if_nlmsg_size(const struct net_device *dev)
static noinline size_t if_nlmsg_size(const struct net_device *dev,
u32 ext_filter_mask)
{
return NLMSG_ALIGN(sizeof(struct ifinfomsg))
+ nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */
Expand All @@ -786,8 +787,9 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev)
+ nla_total_size(4) /* IFLA_MASTER */
+ nla_total_size(1) /* IFLA_OPERSTATE */
+ nla_total_size(1) /* IFLA_LINKMODE */
+ nla_total_size(4) /* IFLA_NUM_VF */
+ rtnl_vfinfo_size(dev) /* IFLA_VFINFO_LIST */
+ nla_total_size(ext_filter_mask
& RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */
+ rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */
+ rtnl_port_size(dev) /* IFLA_VF_PORTS + IFLA_PORT_SELF */
+ rtnl_link_get_size(dev) /* IFLA_LINKINFO */
+ rtnl_link_get_af_size(dev); /* IFLA_AF_SPEC */
Expand Down Expand Up @@ -870,7 +872,7 @@ static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev)

static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
int type, u32 pid, u32 seq, u32 change,
unsigned int flags)
unsigned int flags, u32 ext_filter_mask)
{
struct ifinfomsg *ifm;
struct nlmsghdr *nlh;
Expand Down Expand Up @@ -943,10 +945,11 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
goto nla_put_failure;
copy_rtnl_link_stats64(nla_data(attr), stats);

if (dev->dev.parent)
if (dev->dev.parent && (ext_filter_mask & RTEXT_FILTER_VF))
NLA_PUT_U32(skb, IFLA_NUM_VF, dev_num_vf(dev->dev.parent));

if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent) {
if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent
&& (ext_filter_mask & RTEXT_FILTER_VF)) {
int i;

struct nlattr *vfinfo, *vf;
Expand Down Expand Up @@ -1033,11 +1036,20 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
struct net_device *dev;
struct hlist_head *head;
struct hlist_node *node;
struct nlattr *tb[IFLA_MAX+1];
u32 ext_filter_mask = 0;

s_h = cb->args[0];
s_idx = cb->args[1];

rcu_read_lock();

nlmsg_parse(cb->nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX,
ifla_policy);

if (tb[IFLA_EXT_MASK])
ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);

for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
idx = 0;
head = &net->dev_index_head[h];
Expand All @@ -1047,7 +1059,8 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK,
NETLINK_CB(cb->skb).pid,
cb->nlh->nlmsg_seq, 0,
NLM_F_MULTI) <= 0)
NLM_F_MULTI,
ext_filter_mask) <= 0)
goto out;
cont:
idx++;
Expand Down Expand Up @@ -1081,6 +1094,7 @@ const struct nla_policy ifla_policy[IFLA_MAX+1] = {
[IFLA_VF_PORTS] = { .type = NLA_NESTED },
[IFLA_PORT_SELF] = { .type = NLA_NESTED },
[IFLA_AF_SPEC] = { .type = NLA_NESTED },
[IFLA_EXT_MASK] = { .type = NLA_U32 },
};
EXPORT_SYMBOL(ifla_policy);

Expand Down Expand Up @@ -1813,6 +1827,7 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
struct net_device *dev = NULL;
struct sk_buff *nskb;
int err;
u32 ext_filter_mask = 0;

err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy);
if (err < 0)
Expand All @@ -1821,6 +1836,9 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
if (tb[IFLA_IFNAME])
nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);

if (tb[IFLA_EXT_MASK])
ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);

ifm = nlmsg_data(nlh);
if (ifm->ifi_index > 0)
dev = __dev_get_by_index(net, ifm->ifi_index);
Expand All @@ -1832,12 +1850,12 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
if (dev == NULL)
return -ENODEV;

nskb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL);
nskb = nlmsg_new(if_nlmsg_size(dev, ext_filter_mask), GFP_KERNEL);
if (nskb == NULL)
return -ENOBUFS;

err = rtnl_fill_ifinfo(nskb, dev, RTM_NEWLINK, NETLINK_CB(skb).pid,
nlh->nlmsg_seq, 0, 0);
nlh->nlmsg_seq, 0, 0, ext_filter_mask);
if (err < 0) {
/* -EMSGSIZE implies BUG in if_nlmsg_size */
WARN_ON(err == -EMSGSIZE);
Expand All @@ -1848,8 +1866,31 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
return err;
}

static u16 rtnl_calcit(struct sk_buff *skb)
static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh)
{
struct net *net = sock_net(skb->sk);
struct net_device *dev;
struct nlattr *tb[IFLA_MAX+1];
u32 ext_filter_mask = 0;
u16 min_ifinfo_dump_size = 0;

nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX, ifla_policy);

if (tb[IFLA_EXT_MASK])
ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);

if (!ext_filter_mask)
return NLMSG_GOODSIZE;
/*
* traverse the list of net devices and compute the minimum
* buffer size based upon the filter mask.
*/
list_for_each_entry(dev, &net->dev_base_head, dev_list) {
min_ifinfo_dump_size = max_t(u16, min_ifinfo_dump_size,
if_nlmsg_size(dev,
ext_filter_mask));
}

return min_ifinfo_dump_size;
}

Expand Down Expand Up @@ -1884,13 +1925,11 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change)
int err = -ENOBUFS;
size_t if_info_size;

skb = nlmsg_new((if_info_size = if_nlmsg_size(dev)), GFP_KERNEL);
skb = nlmsg_new((if_info_size = if_nlmsg_size(dev, 0)), GFP_KERNEL);
if (skb == NULL)
goto errout;

min_ifinfo_dump_size = max_t(u16, if_info_size, min_ifinfo_dump_size);

err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0);
err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0, 0);
if (err < 0) {
/* -EMSGSIZE implies BUG in if_nlmsg_size() */
WARN_ON(err == -EMSGSIZE);
Expand Down Expand Up @@ -1948,7 +1987,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
return -EOPNOTSUPP;
calcit = rtnl_get_calcit(family, type);
if (calcit)
min_dump_alloc = calcit(skb);
min_dump_alloc = calcit(skb, nlh);

__rtnl_unlock();
rtnl = net->rtnl;
Expand Down