netlink_broadcast(rtnl, skb, 0, RTNLGRP_LINK, GFP_KERNEL);
 }
 
-static int rtnetlink_done(struct netlink_callback *cb)
-{
-       return 0;
-}
-
 /* Protected by RTNL sempahore.  */
 static struct rtattr **rta_buf;
 static int rtattr_max;
                        goto err_inval;
 
                if ((*errp = netlink_dump_start(rtnl, skb, nlh,
-                                               link->dumpit,
-                                               rtnetlink_done)) != 0) {
+                                               link->dumpit, NULL)) != 0) {
                        return -1;
                }
                rlen = NLMSG_ALIGN(nlh->nlmsg_len);
 
        return skb->len;
 }
 
-static int inet_diag_dump_done(struct netlink_callback *cb)
-{
-       return 0;
-}
-
-
 static __inline__ int
 inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 {
                                goto err_inval;
                }
                return netlink_dump_start(idiagnl, skb, nlh,
-                                         inet_diag_dump,
-                                         inet_diag_dump_done);
+                                         inet_diag_dump, NULL);
        } else {
                return inet_diag_get_exact(skb, nlh);
        }
 
 static int fib6_dump_done(struct netlink_callback *cb)
 {
        fib6_dump_end(cb);
-       return cb->done(cb);
+       return cb->done ? cb->done(cb) : 0;
 }
 
 int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
 
 
        spin_lock(&nlk->cb_lock);
        if (nlk->cb) {
-               nlk->cb->done(nlk->cb);
+               if (nlk->cb->done)
+                       nlk->cb->done(nlk->cb);
                netlink_destroy_callback(nlk->cb);
                nlk->cb = NULL;
        }
        skb_queue_tail(&sk->sk_receive_queue, skb);
        sk->sk_data_ready(sk, skb->len);
 
-       cb->done(cb);
+       if (cb->done)
+               cb->done(cb);
        nlk->cb = NULL;
        spin_unlock(&nlk->cb_lock);
 
 
        [XFRM_MSG_FLUSHPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_flush_policy  },
 };
 
-static int xfrm_done(struct netlink_callback *cb)
-{
-       return 0;
-}
-
 static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, int *errp)
 {
        struct rtattr *xfrma[XFRMA_MAX];
                        goto err_einval;
 
                if ((*errp = netlink_dump_start(xfrm_nl, skb, nlh,
-                                               link->dump,
-                                               xfrm_done)) != 0) {
+                                               link->dump, NULL)) != 0) {
                        return -1;
                }
                rlen = NLMSG_ALIGN(nlh->nlmsg_len);