diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-08-24 12:25:44 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-08-24 12:25:54 +0200 | 
| commit | 5f9ece02401116b29eb04396b99ea092acb75dd8 (patch) | |
| tree | e10386e2dc63c275646b4eb0bed857da7bf86c6a /fs/ext3/inode.c | |
| parent | 9f51e24ee8b5a1595b6a5ac0c2be278a16488e75 (diff) | |
| parent | 422bef879e84104fee6dc68ded0e371dbeb5f88e (diff) | |
| download | olio-linux-3.10-5f9ece02401116b29eb04396b99ea092acb75dd8.tar.xz olio-linux-3.10-5f9ece02401116b29eb04396b99ea092acb75dd8.zip  | |
Merge commit 'v2.6.31-rc7' into x86/cleanups
Merge reason: we were on -rc1 before - go up to -rc7
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'fs/ext3/inode.c')
| -rw-r--r-- | fs/ext3/inode.c | 32 | 
1 files changed, 13 insertions, 19 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 5f51fed5c75..b49908a167a 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -788,7 +788,7 @@ err_out:  int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,  		sector_t iblock, unsigned long maxblocks,  		struct buffer_head *bh_result, -		int create, int extend_disksize) +		int create)  {  	int err = -EIO;  	int offsets[4]; @@ -911,13 +911,6 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,  	if (!err)  		err = ext3_splice_branch(handle, inode, iblock,  					partial, indirect_blks, count); -	/* -	 * i_disksize growing is protected by truncate_mutex.  Don't forget to -	 * protect it if you're about to implement concurrent -	 * ext3_get_block() -bzzz -	*/ -	if (!err && extend_disksize && inode->i_size > ei->i_disksize) -		ei->i_disksize = inode->i_size;  	mutex_unlock(&ei->truncate_mutex);  	if (err)  		goto cleanup; @@ -972,7 +965,7 @@ static int ext3_get_block(struct inode *inode, sector_t iblock,  	}  	ret = ext3_get_blocks_handle(handle, inode, iblock, -					max_blocks, bh_result, create, 0); +					max_blocks, bh_result, create);  	if (ret > 0) {  		bh_result->b_size = (ret << inode->i_blkbits);  		ret = 0; @@ -1005,7 +998,7 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode,  	dummy.b_blocknr = -1000;  	buffer_trace_init(&dummy.b_history);  	err = ext3_get_blocks_handle(handle, inode, block, 1, -					&dummy, create, 1); +					&dummy, create);  	/*  	 * ext3_get_blocks_handle() returns number of blocks  	 * mapped. 0 in case of a HOLE. @@ -1193,15 +1186,16 @@ write_begin_failed:  		 * i_size_read because we hold i_mutex.  		 *  		 * Add inode to orphan list in case we crash before truncate -		 * finishes. +		 * finishes. Do this only if ext3_can_truncate() agrees so +		 * that orphan processing code is happy.  		 */ -		if (pos + len > inode->i_size) +		if (pos + len > inode->i_size && ext3_can_truncate(inode))  			ext3_orphan_add(handle, inode);  		ext3_journal_stop(handle);  		unlock_page(page);  		page_cache_release(page);  		if (pos + len > inode->i_size) -			vmtruncate(inode, inode->i_size); +			ext3_truncate(inode);  	}  	if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries))  		goto retry; @@ -1287,7 +1281,7 @@ static int ext3_ordered_write_end(struct file *file,  	 * There may be allocated blocks outside of i_size because  	 * we failed to copy some data. Prepare for truncate.  	 */ -	if (pos + len > inode->i_size) +	if (pos + len > inode->i_size && ext3_can_truncate(inode))  		ext3_orphan_add(handle, inode);  	ret2 = ext3_journal_stop(handle);  	if (!ret) @@ -1296,7 +1290,7 @@ static int ext3_ordered_write_end(struct file *file,  	page_cache_release(page);  	if (pos + len > inode->i_size) -		vmtruncate(inode, inode->i_size); +		ext3_truncate(inode);  	return ret ? ret : copied;  } @@ -1315,14 +1309,14 @@ static int ext3_writeback_write_end(struct file *file,  	 * There may be allocated blocks outside of i_size because  	 * we failed to copy some data. Prepare for truncate.  	 */ -	if (pos + len > inode->i_size) +	if (pos + len > inode->i_size && ext3_can_truncate(inode))  		ext3_orphan_add(handle, inode);  	ret = ext3_journal_stop(handle);  	unlock_page(page);  	page_cache_release(page);  	if (pos + len > inode->i_size) -		vmtruncate(inode, inode->i_size); +		ext3_truncate(inode);  	return ret ? ret : copied;  } @@ -1358,7 +1352,7 @@ static int ext3_journalled_write_end(struct file *file,  	 * There may be allocated blocks outside of i_size because  	 * we failed to copy some data. Prepare for truncate.  	 */ -	if (pos + len > inode->i_size) +	if (pos + len > inode->i_size && ext3_can_truncate(inode))  		ext3_orphan_add(handle, inode);  	EXT3_I(inode)->i_state |= EXT3_STATE_JDATA;  	if (inode->i_size > EXT3_I(inode)->i_disksize) { @@ -1375,7 +1369,7 @@ static int ext3_journalled_write_end(struct file *file,  	page_cache_release(page);  	if (pos + len > inode->i_size) -		vmtruncate(inode, inode->i_size); +		ext3_truncate(inode);  	return ret ? ret : copied;  }  |