};
 
 static int
-call_ad(struct sk_buff *skb, struct ip_set *set,
+call_ad(struct sock *ctnl, struct sk_buff *skb, struct ip_set *set,
        struct nlattr *tb[], enum ipset_adt adt,
        u32 flags, bool use_lineno)
 {
                return 0;
        if (lineno && use_lineno) {
                /* Error in restore/batch mode: send back lineno */
-               struct nlmsghdr *nlh = nlmsg_hdr(skb);
+               struct nlmsghdr *rep, *nlh = nlmsg_hdr(skb);
+               struct sk_buff *skb2;
+               struct nlmsgerr *errmsg;
+               size_t payload = sizeof(*errmsg) + nlmsg_len(nlh);
                int min_len = NLMSG_SPACE(sizeof(struct nfgenmsg));
                struct nlattr *cda[IPSET_ATTR_CMD_MAX+1];
-               struct nlattr *cmdattr = (void *)nlh + min_len;
+               struct nlattr *cmdattr;
                u32 *errline;
 
+               skb2 = nlmsg_new(payload, GFP_KERNEL);
+               if (skb2 == NULL)
+                       return -ENOMEM;
+               rep = __nlmsg_put(skb2, NETLINK_CB(skb).pid,
+                                 nlh->nlmsg_seq, NLMSG_ERROR, payload, 0);
+               errmsg = nlmsg_data(rep);
+               errmsg->error = ret;
+               memcpy(&errmsg->msg, nlh, nlh->nlmsg_len);
+               cmdattr = (void *)&errmsg->msg + min_len;
+
                nla_parse(cda, IPSET_ATTR_CMD_MAX,
                          cmdattr, nlh->nlmsg_len - min_len,
                          ip_set_adt_policy);
                errline = nla_data(cda[IPSET_ATTR_LINENO]);
 
                *errline = lineno;
+
+               netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT);
+               /* Signal netlink not to send its ACK/errmsg.  */
+               return -EINTR;
        }
 
        return ret;
                                     attr[IPSET_ATTR_DATA],
                                     set->type->adt_policy))
                        return -IPSET_ERR_PROTOCOL;
-               ret = call_ad(skb, set, tb, IPSET_ADD, flags, use_lineno);
+               ret = call_ad(ctnl, skb, set, tb, IPSET_ADD, flags,
+                             use_lineno);
        } else {
                int nla_rem;
 
                            nla_parse_nested(tb, IPSET_ATTR_ADT_MAX, nla,
                                             set->type->adt_policy))
                                return -IPSET_ERR_PROTOCOL;
-                       ret = call_ad(skb, set, tb, IPSET_ADD,
+                       ret = call_ad(ctnl, skb, set, tb, IPSET_ADD,
                                      flags, use_lineno);
                        if (ret < 0)
                                return ret;
                                     attr[IPSET_ATTR_DATA],
                                     set->type->adt_policy))
                        return -IPSET_ERR_PROTOCOL;
-               ret = call_ad(skb, set, tb, IPSET_DEL, flags, use_lineno);
+               ret = call_ad(ctnl, skb, set, tb, IPSET_DEL, flags,
+                             use_lineno);
        } else {
                int nla_rem;
 
                            nla_parse_nested(tb, IPSET_ATTR_ADT_MAX, nla,
                                             set->type->adt_policy))
                                return -IPSET_ERR_PROTOCOL;
-                       ret = call_ad(skb, set, tb, IPSET_DEL,
+                       ret = call_ad(ctnl, skb, set, tb, IPSET_DEL,
                                      flags, use_lineno);
                        if (ret < 0)
                                return ret;