mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	xfs: Check for extent overflow when trivally adding a new extent
When adding a new data extent (without modifying an inode's existing extents) the extent count increases only by 1. This commit checks for extent count overflow in such cases. Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Allison Henderson <allison.henderson@oracle.com> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
		
							parent
							
								
									b9b7e1dc56
								
							
						
					
					
						commit
						727e1acd29
					
				
					 7 changed files with 41 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -4527,6 +4527,12 @@ xfs_bmapi_convert_delalloc(
 | 
			
		|||
		return error;
 | 
			
		||||
 | 
			
		||||
	xfs_ilock(ip, XFS_ILOCK_EXCL);
 | 
			
		||||
 | 
			
		||||
	error = xfs_iext_count_may_overflow(ip, whichfork,
 | 
			
		||||
			XFS_IEXT_ADD_NOSPLIT_CNT);
 | 
			
		||||
	if (error)
 | 
			
		||||
		goto out_trans_cancel;
 | 
			
		||||
 | 
			
		||||
	xfs_trans_ijoin(tp, ip, 0);
 | 
			
		||||
 | 
			
		||||
	if (!xfs_iext_lookup_extent(ip, ifp, offset_fsb, &bma.icur, &bma.got) ||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,12 @@ struct xfs_ifork {
 | 
			
		|||
#define	XFS_IFEXTENTS	0x02	/* All extent pointers are read in */
 | 
			
		||||
#define	XFS_IFBROOT	0x04	/* i_broot points to the bmap b-tree root */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Worst-case increase in the fork extent count when we're adding a single
 | 
			
		||||
 * extent to a fork and there's no possibility of splitting an existing mapping.
 | 
			
		||||
 */
 | 
			
		||||
#define XFS_IEXT_ADD_NOSPLIT_CNT	(1)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Fork handling.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -508,6 +508,13 @@ xfs_bui_item_recover(
 | 
			
		|||
	xfs_ilock(ip, XFS_ILOCK_EXCL);
 | 
			
		||||
	xfs_trans_ijoin(tp, ip, 0);
 | 
			
		||||
 | 
			
		||||
	if (bui_type == XFS_BMAP_MAP) {
 | 
			
		||||
		error = xfs_iext_count_may_overflow(ip, whichfork,
 | 
			
		||||
				XFS_IEXT_ADD_NOSPLIT_CNT);
 | 
			
		||||
		if (error)
 | 
			
		||||
			goto err_cancel;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	count = bmap->me_len;
 | 
			
		||||
	error = xfs_trans_log_finish_bmap_update(tp, budp, bui_type, ip,
 | 
			
		||||
			whichfork, bmap->me_startoff, bmap->me_startblock,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -822,6 +822,11 @@ xfs_alloc_file_space(
 | 
			
		|||
		if (error)
 | 
			
		||||
			goto error1;
 | 
			
		||||
 | 
			
		||||
		error = xfs_iext_count_may_overflow(ip, XFS_DATA_FORK,
 | 
			
		||||
				XFS_IEXT_ADD_NOSPLIT_CNT);
 | 
			
		||||
		if (error)
 | 
			
		||||
			goto error0;
 | 
			
		||||
 | 
			
		||||
		xfs_trans_ijoin(tp, ip, 0);
 | 
			
		||||
 | 
			
		||||
		error = xfs_bmapi_write(tp, ip, startoffset_fsb,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -314,8 +314,14 @@ xfs_dquot_disk_alloc(
 | 
			
		|||
		return -ESRCH;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Create the block mapping. */
 | 
			
		||||
	xfs_trans_ijoin(tp, quotip, XFS_ILOCK_EXCL);
 | 
			
		||||
 | 
			
		||||
	error = xfs_iext_count_may_overflow(quotip, XFS_DATA_FORK,
 | 
			
		||||
			XFS_IEXT_ADD_NOSPLIT_CNT);
 | 
			
		||||
	if (error)
 | 
			
		||||
		return error;
 | 
			
		||||
 | 
			
		||||
	/* Create the block mapping. */
 | 
			
		||||
	error = xfs_bmapi_write(tp, quotip, dqp->q_fileoffset,
 | 
			
		||||
			XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA, 0, &map,
 | 
			
		||||
			&nmaps);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -250,6 +250,11 @@ xfs_iomap_write_direct(
 | 
			
		|||
	if (error)
 | 
			
		||||
		goto out_trans_cancel;
 | 
			
		||||
 | 
			
		||||
	error = xfs_iext_count_may_overflow(ip, XFS_DATA_FORK,
 | 
			
		||||
			XFS_IEXT_ADD_NOSPLIT_CNT);
 | 
			
		||||
	if (error)
 | 
			
		||||
		goto out_res_cancel;
 | 
			
		||||
 | 
			
		||||
	xfs_trans_ijoin(tp, ip, 0);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -804,6 +804,11 @@ xfs_growfs_rt_alloc(
 | 
			
		|||
		xfs_ilock(ip, XFS_ILOCK_EXCL);
 | 
			
		||||
		xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
 | 
			
		||||
 | 
			
		||||
		error = xfs_iext_count_may_overflow(ip, XFS_DATA_FORK,
 | 
			
		||||
				XFS_IEXT_ADD_NOSPLIT_CNT);
 | 
			
		||||
		if (error)
 | 
			
		||||
			goto out_trans_cancel;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Allocate blocks to the bitmap file.
 | 
			
		||||
		 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue