|
@@ -721,19 +721,18 @@ fn_hash_dump_zone(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
{
|
|
|
int h, s_h;
|
|
|
|
|
|
+ if (fz->fz_hash == NULL)
|
|
|
+ return skb->len;
|
|
|
s_h = cb->args[3];
|
|
|
- for (h=0; h < fz->fz_divisor; h++) {
|
|
|
- if (h < s_h) continue;
|
|
|
- if (h > s_h)
|
|
|
- memset(&cb->args[4], 0,
|
|
|
- sizeof(cb->args) - 4*sizeof(cb->args[0]));
|
|
|
- if (fz->fz_hash == NULL ||
|
|
|
- hlist_empty(&fz->fz_hash[h]))
|
|
|
+ for (h = s_h; h < fz->fz_divisor; h++) {
|
|
|
+ if (hlist_empty(&fz->fz_hash[h]))
|
|
|
continue;
|
|
|
- if (fn_hash_dump_bucket(skb, cb, tb, fz, &fz->fz_hash[h])<0) {
|
|
|
+ if (fn_hash_dump_bucket(skb, cb, tb, fz, &fz->fz_hash[h]) < 0) {
|
|
|
cb->args[3] = h;
|
|
|
return -1;
|
|
|
}
|
|
|
+ memset(&cb->args[4], 0,
|
|
|
+ sizeof(cb->args) - 4*sizeof(cb->args[0]));
|
|
|
}
|
|
|
cb->args[3] = h;
|
|
|
return skb->len;
|
|
@@ -749,14 +748,13 @@ static int fn_hash_dump(struct fib_table *tb, struct sk_buff *skb, struct netlin
|
|
|
read_lock(&fib_hash_lock);
|
|
|
for (fz = table->fn_zone_list, m=0; fz; fz = fz->fz_next, m++) {
|
|
|
if (m < s_m) continue;
|
|
|
- if (m > s_m)
|
|
|
- memset(&cb->args[3], 0,
|
|
|
- sizeof(cb->args) - 3*sizeof(cb->args[0]));
|
|
|
if (fn_hash_dump_zone(skb, cb, tb, fz) < 0) {
|
|
|
cb->args[2] = m;
|
|
|
read_unlock(&fib_hash_lock);
|
|
|
return -1;
|
|
|
}
|
|
|
+ memset(&cb->args[3], 0,
|
|
|
+ sizeof(cb->args) - 3*sizeof(cb->args[0]));
|
|
|
}
|
|
|
read_unlock(&fib_hash_lock);
|
|
|
cb->args[2] = m;
|