copy_actor(desc, (char *)xdr->tail[0].iov_base + base, len - base);  return 0; 
copied += copy_actor(desc, (char *)xdr->tail[0].iov_base + base, len - base); out: return copied; 
xdr_partial_copy_from_skb(struct xdr_buf *xdr, unsigned int base,			  skb_reader_t *desc,			  skb_read_actor_t copy_actor){	struct page	**ppage = xdr->pages;	unsigned int	len, pglen = xdr->page_len;	int		ret;	len = xdr->head[0].iov_len;	if (base < len) {		len -= base;		ret = copy_actor(desc, (char *)xdr->head[0].iov_base + base, len);		if (ret != len || !desc->count)			return 0;		base = 0;	} else		base -= len;	if (pglen == 0)		goto copy_tail;	if (base >= pglen) {		base -= pglen;		goto copy_tail;	}	if (base || xdr->page_base) {		pglen -= base;		base  += xdr->page_base;		ppage += base >> PAGE_CACHE_SHIFT;		base &= ~PAGE_CACHE_MASK;	}	do {		char *kaddr;		/* ACL likes to be lazy in allocating pages - ACLs		 * are small by default but can get huge. */		if (unlikely(*ppage == NULL)) {			*ppage = alloc_page(GFP_ATOMIC);			if (unlikely(*ppage == NULL))				return -ENOMEM;		}		len = PAGE_CACHE_SIZE;		kaddr = kmap_atomic(*ppage, KM_SKB_SUNRPC_DATA);		if (base) {			len -= base;			if (pglen < len)				len = pglen;			ret = copy_actor(desc, kaddr + base, len);			base = 0;		} else {			if (pglen < len)				len = pglen;			ret = copy_actor(desc, kaddr, len);		}		flush_dcache_page(*ppage);		kunmap_atomic(kaddr, KM_SKB_SUNRPC_DATA);		if (ret != len || !desc->count)			return 0;		ppage++;	} while ((pglen -= len) != 0);copy_tail:	len = xdr->tail[0].iov_len;	if (base < len)		copy_actor(desc, (char *)xdr->tail[0].iov_base + base, len - base);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/7e06b53d796a3740307b54aa2799077f8a0c84e7/xdr.c/buggy/net/sunrpc/xdr.c