|
@@ -939,6 +939,7 @@ static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset,
|
|
|
int len, unsigned long sum)
|
|
|
{
|
|
|
int start = skb_headlen(skb);
|
|
|
+ struct sk_buff *frag_iter;
|
|
|
int i, copy;
|
|
|
|
|
|
/* checksum stuff in header space */
|
|
@@ -977,26 +978,22 @@ static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset,
|
|
|
start = end;
|
|
|
}
|
|
|
|
|
|
- if (skb_shinfo(skb)->frag_list) {
|
|
|
- struct sk_buff *list = skb_shinfo(skb)->frag_list;
|
|
|
-
|
|
|
- for (; list; list = list->next) {
|
|
|
- int end;
|
|
|
+ skb_walk_frags(skb, frag_iter) {
|
|
|
+ int end;
|
|
|
|
|
|
- WARN_ON(start > offset + len);
|
|
|
+ WARN_ON(start > offset + len);
|
|
|
|
|
|
- end = start + list->len;
|
|
|
- if ((copy = end - offset) > 0) {
|
|
|
- if (copy > len)
|
|
|
- copy = len;
|
|
|
- sum = atalk_sum_skb(list, offset - start,
|
|
|
- copy, sum);
|
|
|
- if ((len -= copy) == 0)
|
|
|
- return sum;
|
|
|
- offset += copy;
|
|
|
- }
|
|
|
- start = end;
|
|
|
+ end = start + frag_iter->len;
|
|
|
+ if ((copy = end - offset) > 0) {
|
|
|
+ if (copy > len)
|
|
|
+ copy = len;
|
|
|
+ sum = atalk_sum_skb(frag_iter, offset - start,
|
|
|
+ copy, sum);
|
|
|
+ if ((len -= copy) == 0)
|
|
|
+ return sum;
|
|
|
+ offset += copy;
|
|
|
}
|
|
|
+ start = end;
|
|
|
}
|
|
|
|
|
|
BUG_ON(len > 0);
|