|
@@ -709,19 +709,11 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
- struct inet_diag_req *r, struct nlattr *bc)
|
|
|
+static void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *skb,
|
|
|
+ struct netlink_callback *cb, struct inet_diag_req *r, struct nlattr *bc)
|
|
|
{
|
|
|
int i, num;
|
|
|
int s_i, s_num;
|
|
|
- const struct inet_diag_handler *handler;
|
|
|
- struct inet_hashinfo *hashinfo;
|
|
|
-
|
|
|
- handler = inet_diag_lock_handler(r->sdiag_protocol);
|
|
|
- if (IS_ERR(handler))
|
|
|
- goto unlock;
|
|
|
-
|
|
|
- hashinfo = handler->idiag_hashinfo;
|
|
|
|
|
|
s_i = cb->args[1];
|
|
|
s_num = num = cb->args[2];
|
|
@@ -790,7 +782,7 @@ skip_listen_ht:
|
|
|
}
|
|
|
|
|
|
if (!(r->idiag_states & ~(TCPF_LISTEN | TCPF_SYN_RECV)))
|
|
|
- goto unlock;
|
|
|
+ goto out;
|
|
|
|
|
|
for (i = s_i; i <= hashinfo->ehash_mask; i++) {
|
|
|
struct inet_ehash_bucket *head = &hashinfo->ehash[i];
|
|
@@ -863,8 +855,20 @@ next_dying:
|
|
|
done:
|
|
|
cb->args[1] = i;
|
|
|
cb->args[2] = num;
|
|
|
-unlock:
|
|
|
+out:
|
|
|
+ ;
|
|
|
+}
|
|
|
+
|
|
|
+static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
+ struct inet_diag_req *r, struct nlattr *bc)
|
|
|
+{
|
|
|
+ const struct inet_diag_handler *handler;
|
|
|
+
|
|
|
+ handler = inet_diag_lock_handler(r->sdiag_protocol);
|
|
|
+ if (!IS_ERR(handler))
|
|
|
+ inet_diag_dump_icsk(handler->idiag_hashinfo, skb, cb, r, bc);
|
|
|
inet_diag_unlock_handler(handler);
|
|
|
+
|
|
|
return skb->len;
|
|
|
}
|
|
|
|