diff options
| author | Paul Mackerras <paulus@samba.org> | 2007-05-10 21:08:37 +1000 | 
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2007-05-10 21:08:37 +1000 | 
| commit | 2ecf042ef530dd0943e41d84b6344f507941af3e (patch) | |
| tree | 73100361dd74e3f80f14c7c81ba4675948983f44 /fs/buffer.c | |
| parent | 32a56ebb24f23da1bbaf24292acf85b6c04526ab (diff) | |
| parent | de5603748af8bf7deac403e6ba92887f8d18e812 (diff) | |
Merge branch 'linux-2.6'
Diffstat (limited to 'fs/buffer.c')
| -rw-r--r-- | fs/buffer.c | 58 | 
1 files changed, 13 insertions, 45 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index eb820b82a63..aecd057cd0e 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -1846,13 +1846,8 @@ static int __block_prepare_write(struct inode *inode, struct page *page,  		if (block_start >= to)  			break;  		if (buffer_new(bh)) { -			void *kaddr; -  			clear_buffer_new(bh); -			kaddr = kmap_atomic(page, KM_USER0); -			memset(kaddr+block_start, 0, bh->b_size); -			flush_dcache_page(page); -			kunmap_atomic(kaddr, KM_USER0); +			zero_user_page(page, block_start, bh->b_size, KM_USER0);  			set_buffer_uptodate(bh);  			mark_buffer_dirty(bh);  		} @@ -1940,10 +1935,8 @@ int block_read_full_page(struct page *page, get_block_t *get_block)  					SetPageError(page);  			}  			if (!buffer_mapped(bh)) { -				void *kaddr = kmap_atomic(page, KM_USER0); -				memset(kaddr + i * blocksize, 0, blocksize); -				flush_dcache_page(page); -				kunmap_atomic(kaddr, KM_USER0); +				zero_user_page(page, i * blocksize, blocksize, +						KM_USER0);  				if (!err)  					set_buffer_uptodate(bh);  				continue; @@ -2086,7 +2079,6 @@ int cont_prepare_write(struct page *page, unsigned offset,  	long status;  	unsigned zerofrom;  	unsigned blocksize = 1 << inode->i_blkbits; -	void *kaddr;  	while(page->index > (pgpos = *bytes>>PAGE_CACHE_SHIFT)) {  		status = -ENOMEM; @@ -2108,10 +2100,8 @@ int cont_prepare_write(struct page *page, unsigned offset,  						PAGE_CACHE_SIZE, get_block);  		if (status)  			goto out_unmap; -		kaddr = kmap_atomic(new_page, KM_USER0); -		memset(kaddr+zerofrom, 0, PAGE_CACHE_SIZE-zerofrom); -		flush_dcache_page(new_page); -		kunmap_atomic(kaddr, KM_USER0); +		zero_user_page(page, zerofrom, PAGE_CACHE_SIZE - zerofrom, +				KM_USER0);  		generic_commit_write(NULL, new_page, zerofrom, PAGE_CACHE_SIZE);  		unlock_page(new_page);  		page_cache_release(new_page); @@ -2138,10 +2128,7 @@ int cont_prepare_write(struct page *page, unsigned offset,  	if (status)  		goto out1;  	if (zerofrom < offset) { -		kaddr = kmap_atomic(page, KM_USER0); -		memset(kaddr+zerofrom, 0, offset-zerofrom); -		flush_dcache_page(page); -		kunmap_atomic(kaddr, KM_USER0); +		zero_user_page(page, zerofrom, offset - zerofrom, KM_USER0);  		__block_commit_write(inode, page, zerofrom, offset);  	}  	return 0; @@ -2340,10 +2327,7 @@ failed:  	 * Error recovery is pretty slack.  Clear the page and mark it dirty  	 * so we'll later zero out any blocks which _were_ allocated.  	 */ -	kaddr = kmap_atomic(page, KM_USER0); -	memset(kaddr, 0, PAGE_CACHE_SIZE); -	flush_dcache_page(page); -	kunmap_atomic(kaddr, KM_USER0); +	zero_user_page(page, 0, PAGE_CACHE_SIZE, KM_USER0);  	SetPageUptodate(page);  	set_page_dirty(page);  	return ret; @@ -2382,7 +2366,6 @@ int nobh_writepage(struct page *page, get_block_t *get_block,  	loff_t i_size = i_size_read(inode);  	const pgoff_t end_index = i_size >> PAGE_CACHE_SHIFT;  	unsigned offset; -	void *kaddr;  	int ret;  	/* Is the page fully inside i_size? */ @@ -2413,10 +2396,7 @@ int nobh_writepage(struct page *page, get_block_t *get_block,  	 * the  page size, the remaining memory is zeroed when mapped, and  	 * writes to that region are not written out to the file."  	 */ -	kaddr = kmap_atomic(page, KM_USER0); -	memset(kaddr + offset, 0, PAGE_CACHE_SIZE - offset); -	flush_dcache_page(page); -	kunmap_atomic(kaddr, KM_USER0); +	zero_user_page(page, offset, PAGE_CACHE_SIZE - offset, KM_USER0);  out:  	ret = mpage_writepage(page, get_block, wbc);  	if (ret == -EAGAIN) @@ -2437,7 +2417,6 @@ int nobh_truncate_page(struct address_space *mapping, loff_t from)  	unsigned to;  	struct page *page;  	const struct address_space_operations *a_ops = mapping->a_ops; -	char *kaddr;  	int ret = 0;  	if ((offset & (blocksize - 1)) == 0) @@ -2451,10 +2430,8 @@ int nobh_truncate_page(struct address_space *mapping, loff_t from)  	to = (offset + blocksize) & ~(blocksize - 1);  	ret = a_ops->prepare_write(NULL, page, offset, to);  	if (ret == 0) { -		kaddr = kmap_atomic(page, KM_USER0); -		memset(kaddr + offset, 0, PAGE_CACHE_SIZE - offset); -		flush_dcache_page(page); -		kunmap_atomic(kaddr, KM_USER0); +		zero_user_page(page, offset, PAGE_CACHE_SIZE - offset, +				KM_USER0);  		/*  		 * It would be more correct to call aops->commit_write()  		 * here, but this is more efficient. @@ -2480,7 +2457,6 @@ int block_truncate_page(struct address_space *mapping,  	struct inode *inode = mapping->host;  	struct page *page;  	struct buffer_head *bh; -	void *kaddr;  	int err;  	blocksize = 1 << inode->i_blkbits; @@ -2534,11 +2510,7 @@ int block_truncate_page(struct address_space *mapping,  			goto unlock;  	} -	kaddr = kmap_atomic(page, KM_USER0); -	memset(kaddr + offset, 0, length); -	flush_dcache_page(page); -	kunmap_atomic(kaddr, KM_USER0); - +	zero_user_page(page, offset, length, KM_USER0);  	mark_buffer_dirty(bh);  	err = 0; @@ -2559,7 +2531,6 @@ int block_write_full_page(struct page *page, get_block_t *get_block,  	loff_t i_size = i_size_read(inode);  	const pgoff_t end_index = i_size >> PAGE_CACHE_SHIFT;  	unsigned offset; -	void *kaddr;  	/* Is the page fully inside i_size? */  	if (page->index < end_index) @@ -2585,10 +2556,7 @@ int block_write_full_page(struct page *page, get_block_t *get_block,  	 * the  page size, the remaining memory is zeroed when mapped, and  	 * writes to that region are not written out to the file."  	 */ -	kaddr = kmap_atomic(page, KM_USER0); -	memset(kaddr + offset, 0, PAGE_CACHE_SIZE - offset); -	flush_dcache_page(page); -	kunmap_atomic(kaddr, KM_USER0); +	zero_user_page(page, offset, PAGE_CACHE_SIZE - offset, KM_USER0);  	return __block_write_full_page(inode, page, get_block, wbc);  } @@ -2978,7 +2946,7 @@ static void buffer_exit_cpu(int cpu)  static int buffer_cpu_notify(struct notifier_block *self,  			      unsigned long action, void *hcpu)  { -	if (action == CPU_DEAD) +	if (action == CPU_DEAD || action == CPU_DEAD_FROZEN)  		buffer_exit_cpu((unsigned long)hcpu);  	return NOTIFY_OK;  }  | 
