diff options
Diffstat (limited to 'fs/ocfs2/aops.c')
| -rw-r--r-- | fs/ocfs2/aops.c | 23 | 
1 files changed, 16 insertions, 7 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index f906a250da6a..1a35c6139656 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -523,7 +523,7 @@ static int ocfs2_direct_IO_get_blocks(struct inode *inode, sector_t iblock,  	unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits;  	unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits;  	unsigned long len = bh_result->b_size; -	unsigned int clusters_to_alloc = 0; +	unsigned int clusters_to_alloc = 0, contig_clusters = 0;  	cpos = ocfs2_blocks_to_clusters(inode->i_sb, iblock); @@ -560,8 +560,10 @@ static int ocfs2_direct_IO_get_blocks(struct inode *inode, sector_t iblock,  		/* fill hole, allocate blocks can't be larger than the size  		 * of the hole */  		clusters_to_alloc = ocfs2_clusters_for_bytes(inode->i_sb, len); -		if (clusters_to_alloc > contig_blocks) -			clusters_to_alloc = contig_blocks; +		contig_clusters = ocfs2_clusters_for_blocks(inode->i_sb, +				contig_blocks); +		if (clusters_to_alloc > contig_clusters) +			clusters_to_alloc = contig_clusters;  		/* allocate extent and insert them into the extent tree */  		ret = ocfs2_extend_allocation(inode, cpos, @@ -619,9 +621,6 @@ static void ocfs2_dio_end_io(struct kiocb *iocb,  	/* this io's submitter should not have unlocked this before we could */  	BUG_ON(!ocfs2_iocb_is_rw_locked(iocb)); -	if (ocfs2_iocb_is_sem_locked(iocb)) -		ocfs2_iocb_clear_sem_locked(iocb); -  	if (ocfs2_iocb_is_unaligned_aio(iocb)) {  		ocfs2_iocb_clear_unaligned_aio(iocb); @@ -925,13 +924,23 @@ clean_orphan:  		int update_isize = written > 0 ? 1 : 0;  		loff_t end = update_isize ? offset + written : 0; -		tmp_ret = ocfs2_del_inode_from_orphan(osb, inode, +		tmp_ret = ocfs2_inode_lock(inode, &di_bh, 1); +		if (tmp_ret < 0) { +			ret = tmp_ret; +			mlog_errno(ret); +			goto out; +		} + +		tmp_ret = ocfs2_del_inode_from_orphan(osb, inode, di_bh,  				update_isize, end);  		if (tmp_ret < 0) {  			ret = tmp_ret; +			mlog_errno(ret);  			goto out;  		} +		ocfs2_inode_unlock(inode, 1); +  		tmp_ret = jbd2_journal_force_commit(journal);  		if (tmp_ret < 0) {  			ret = tmp_ret;  |