diff options
Diffstat (limited to 'net/core/gen_stats.c')
-rw-r--r-- | net/core/gen_stats.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/net/core/gen_stats.c b/net/core/gen_stats.c index b2b2323bdc84..188d693cb251 100644 --- a/net/core/gen_stats.c +++ b/net/core/gen_stats.c | |||
@@ -77,8 +77,20 @@ gnet_stats_start_copy_compat(struct sk_buff *skb, int type, int tc_stats_type, | |||
77 | d->lock = lock; | 77 | d->lock = lock; |
78 | spin_lock_bh(lock); | 78 | spin_lock_bh(lock); |
79 | } | 79 | } |
80 | if (d->tail) | 80 | if (d->tail) { |
81 | return gnet_stats_copy(d, type, NULL, 0, padattr); | 81 | int ret = gnet_stats_copy(d, type, NULL, 0, padattr); |
82 | |||
83 | /* The initial attribute added in gnet_stats_copy() may be | ||
84 | * preceded by a padding attribute, in which case d->tail will | ||
85 | * end up pointing at the padding instead of the real attribute. | ||
86 | * Fix this so gnet_stats_finish_copy() adjusts the length of | ||
87 | * the right attribute. | ||
88 | */ | ||
89 | if (ret == 0 && d->tail->nla_type == padattr) | ||
90 | d->tail = (struct nlattr *)((char *)d->tail + | ||
91 | NLA_ALIGN(d->tail->nla_len)); | ||
92 | return ret; | ||
93 | } | ||
82 | 94 | ||
83 | return 0; | 95 | return 0; |
84 | } | 96 | } |