#define NLM_F_MULTI            2       /* Multipart message, terminated by NLMSG_DONE */
 #define NLM_F_ACK              4       /* Reply with ack, with zero or error code */
 #define NLM_F_ECHO             8       /* Echo this request            */
+#define NLM_F_DUMP_INTR                16      /* Dump was inconsistent due to sequence change */
 
 /* Modifiers to GET request */
 #define NLM_F_ROOT     0x100   /* specify tree root    */
                                        struct netlink_callback *cb);
        int                     (*done)(struct netlink_callback *cb);
        int                     family;
+       unsigned int            prev_seq, seq;
        long                    args[6];
 };
 
 
        return (char *) hdr + GENL_HDRLEN;
 }
 
+/**
+ * genlmsg_nlhdr - Obtain netlink header from user specified header
+ * @user_hdr: user header as returned from genlmsg_put()
+ * @family: generic netlink family
+ *
+ * Returns pointer to netlink header.
+ */
+static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr,
+                                            struct genl_family *family)
+{
+       return (struct nlmsghdr *)((char *)user_hdr -
+                                  family->hdrsize -
+                                  GENL_HDRLEN -
+                                  NLMSG_HDRLEN);
+}
+
+/**
+ * genl_dump_check_consistent - check if sequence is consistent and advertise if not
+ * @cb: netlink callback structure that stores the sequence number
+ * @user_hdr: user header as returned from genlmsg_put()
+ * @family: generic netlink family
+ *
+ * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it
+ * simpler to use with generic netlink.
+ */
+static inline void genl_dump_check_consistent(struct netlink_callback *cb,
+                                             void *user_hdr,
+                                             struct genl_family *family)
+{
+       nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr, family));
+}
+
 /**
  * genlmsg_put_reply - Add generic netlink header to a reply message
  * @skb: socket buffer holding the message
 
             nlmsg_ok(pos, rem); \
             pos = nlmsg_next(pos, &(rem)))
 
+/**
+ * nl_dump_check_consistent - check if sequence is consistent and advertise if not
+ * @cb: netlink callback structure that stores the sequence number
+ * @nlh: netlink message header to write the flag to
+ *
+ * This function checks if the sequence (generation) number changed during dump
+ * and if it did, advertises it in the netlink message header.
+ *
+ * The correct way to use it is to set cb->seq to the generation counter when
+ * all locks for dumping have been acquired, and then call this function for
+ * each message that is generated.
+ *
+ * Note that due to initialisation concerns, 0 is an invalid sequence number
+ * and must not be used by code that uses this functionality.
+ */
+static inline void
+nl_dump_check_consistent(struct netlink_callback *cb,
+                        struct nlmsghdr *nlh)
+{
+       if (cb->prev_seq && cb->seq != cb->prev_seq)
+               nlh->nlmsg_flags |= NLM_F_DUMP_INTR;
+       cb->prev_seq = cb->seq;
+}
+
 /**************************************************************************
  * Netlink Attributes
  **************************************************************************/
 
        if (!nlh)
                goto errout_skb;
 
+       nl_dump_check_consistent(cb, nlh);
+
        memcpy(nlmsg_data(nlh), &len, sizeof(len));
 
        if (sk_filter(sk, skb))