diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
| -rw-r--r-- | fs/btrfs/extent_io.c | 67 | 
1 files changed, 13 insertions, 54 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 89bbde46bd8..76ecbb8ed0e 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -3114,7 +3114,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree,  		i = 0;  	}  	for (; i < num_pages; i++, index++) { -		p = find_or_create_page(mapping, index, GFP_NOFS | __GFP_HIGHMEM); +		p = find_or_create_page(mapping, index, GFP_NOFS);  		if (!p) {  			WARN_ON(1);  			goto free_eb; @@ -3487,9 +3487,8 @@ void read_extent_buffer(struct extent_buffer *eb, void *dstv,  		page = extent_buffer_page(eb, i);  		cur = min(len, (PAGE_CACHE_SIZE - offset)); -		kaddr = kmap_atomic(page, KM_USER1); +		kaddr = page_address(page);  		memcpy(dst, kaddr + offset, cur); -		kunmap_atomic(kaddr, KM_USER1);  		dst += cur;  		len -= cur; @@ -3499,9 +3498,9 @@ void read_extent_buffer(struct extent_buffer *eb, void *dstv,  }  int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start, -			       unsigned long min_len, char **token, char **map, +			       unsigned long min_len, char **map,  			       unsigned long *map_start, -			       unsigned long *map_len, int km) +			       unsigned long *map_len)  {  	size_t offset = start & (PAGE_CACHE_SIZE - 1);  	char *kaddr; @@ -3531,42 +3530,12 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,  	}  	p = extent_buffer_page(eb, i); -	kaddr = kmap_atomic(p, km); -	*token = kaddr; +	kaddr = page_address(p);  	*map = kaddr + offset;  	*map_len = PAGE_CACHE_SIZE - offset;  	return 0;  } -int map_extent_buffer(struct extent_buffer *eb, unsigned long start, -		      unsigned long min_len, -		      char **token, char **map, -		      unsigned long *map_start, -		      unsigned long *map_len, int km) -{ -	int err; -	int save = 0; -	if (eb->map_token) { -		unmap_extent_buffer(eb, eb->map_token, km); -		eb->map_token = NULL; -		save = 1; -	} -	err = map_private_extent_buffer(eb, start, min_len, token, map, -				       map_start, map_len, km); -	if (!err && save) { -		eb->map_token = *token; -		eb->kaddr = *map; -		eb->map_start = *map_start; -		eb->map_len = *map_len; -	} -	return err; -} - -void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km) -{ -	kunmap_atomic(token, km); -} -  int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,  			  unsigned long start,  			  unsigned long len) @@ -3590,9 +3559,8 @@ int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,  		cur = min(len, (PAGE_CACHE_SIZE - offset)); -		kaddr = kmap_atomic(page, KM_USER0); +		kaddr = page_address(page);  		ret = memcmp(ptr, kaddr + offset, cur); -		kunmap_atomic(kaddr, KM_USER0);  		if (ret)  			break; @@ -3625,9 +3593,8 @@ void write_extent_buffer(struct extent_buffer *eb, const void *srcv,  		WARN_ON(!PageUptodate(page));  		cur = min(len, PAGE_CACHE_SIZE - offset); -		kaddr = kmap_atomic(page, KM_USER1); +		kaddr = page_address(page);  		memcpy(kaddr + offset, src, cur); -		kunmap_atomic(kaddr, KM_USER1);  		src += cur;  		len -= cur; @@ -3656,9 +3623,8 @@ void memset_extent_buffer(struct extent_buffer *eb, char c,  		WARN_ON(!PageUptodate(page));  		cur = min(len, PAGE_CACHE_SIZE - offset); -		kaddr = kmap_atomic(page, KM_USER0); +		kaddr = page_address(page);  		memset(kaddr + offset, c, cur); -		kunmap_atomic(kaddr, KM_USER0);  		len -= cur;  		offset = 0; @@ -3689,9 +3655,8 @@ void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,  		cur = min(len, (unsigned long)(PAGE_CACHE_SIZE - offset)); -		kaddr = kmap_atomic(page, KM_USER0); +		kaddr = page_address(page);  		read_extent_buffer(src, kaddr + offset, src_offset, cur); -		kunmap_atomic(kaddr, KM_USER0);  		src_offset += cur;  		len -= cur; @@ -3704,20 +3669,17 @@ static void move_pages(struct page *dst_page, struct page *src_page,  		       unsigned long dst_off, unsigned long src_off,  		       unsigned long len)  { -	char *dst_kaddr = kmap_atomic(dst_page, KM_USER0); +	char *dst_kaddr = page_address(dst_page);  	if (dst_page == src_page) {  		memmove(dst_kaddr + dst_off, dst_kaddr + src_off, len);  	} else { -		char *src_kaddr = kmap_atomic(src_page, KM_USER1); +		char *src_kaddr = page_address(src_page);  		char *p = dst_kaddr + dst_off + len;  		char *s = src_kaddr + src_off + len;  		while (len--)  			*--p = *--s; - -		kunmap_atomic(src_kaddr, KM_USER1);  	} -	kunmap_atomic(dst_kaddr, KM_USER0);  }  static inline bool areas_overlap(unsigned long src, unsigned long dst, unsigned long len) @@ -3730,20 +3692,17 @@ static void copy_pages(struct page *dst_page, struct page *src_page,  		       unsigned long dst_off, unsigned long src_off,  		       unsigned long len)  { -	char *dst_kaddr = kmap_atomic(dst_page, KM_USER0); +	char *dst_kaddr = page_address(dst_page);  	char *src_kaddr;  	if (dst_page != src_page) { -		src_kaddr = kmap_atomic(src_page, KM_USER1); +		src_kaddr = page_address(src_page);  	} else {  		src_kaddr = dst_kaddr;  		BUG_ON(areas_overlap(src_off, dst_off, len));  	}  	memcpy(dst_kaddr + dst_off, src_kaddr + src_off, len); -	kunmap_atomic(dst_kaddr, KM_USER0); -	if (dst_page != src_page) -		kunmap_atomic(src_kaddr, KM_USER1);  }  void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,  |