--- linux-2.6.27.2/net/core/datagram.c 2009-05-06 17:43:08.000000000 +0200 +++ my-linux-2.6.27.2/net/core/datagram.c 2009-05-06 17:52:44.000000000 +0200 @@ -56,6 +56,8 @@ #include #include +#include "kmap_skb.h" + /* * Is a socket 'connection oriented' ? */ @@ -292,14 +294,13 @@ int err; u8 *vaddr; skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - struct page *page = frag->page; if (copy > len) copy = len; - vaddr = kmap(page); + vaddr = kmap_skb_frag(frag); err = memcpy_toiovec(to, vaddr + frag->page_offset + offset - start, copy); - kunmap(page); + kunmap_skb_frag(vaddr); if (err) goto fault; if (!(len -= copy)) @@ -377,14 +378,13 @@ int err; u8 *vaddr; skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - struct page *page = frag->page; if (copy > len) copy = len; - vaddr = kmap(page); + vaddr = kmap_skb_frag(frag); err = memcpy_fromiovec(vaddr + frag->page_offset + offset - start, from, copy); - kunmap(page); + kunmap_skb_frag(vaddr); if (err) goto fault; @@ -461,16 +461,15 @@ int err = 0; u8 *vaddr; skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - struct page *page = frag->page; if (copy > len) copy = len; - vaddr = kmap(page); + vaddr = kmap_skb_frag(frag); csum2 = csum_and_copy_to_user(vaddr + frag->page_offset + offset - start, to, copy, 0, &err); - kunmap(page); + kunmap_skb_frag(vaddr); if (err) goto fault; *csump = csum_block_add(*csump, csum2, pos);