diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2018-06-22 21:20:35 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2018-06-22 21:20:35 +0200 | 
| commit | 7731b8bc94e599c9a79e428f3359ff2c34b7576a (patch) | |
| tree | 879f18ccbe274122f2d4f095b43cbc7f953e0ada /fs/xfs/libxfs/xfs_rtbitmap.c | |
| parent | 48e315618dc4dc8904182cd221e3d395d5d97005 (diff) | |
| parent | 9ffc59d57228d74809700be6f7ecb1db10292f05 (diff) | |
Merge branch 'linus' into x86/urgent
Required to queue a dependent fix.
Diffstat (limited to 'fs/xfs/libxfs/xfs_rtbitmap.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_rtbitmap.c | 52 | 
1 files changed, 17 insertions, 35 deletions
diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index 106be2d0bb88..65fc4ed2e9a1 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -1,19 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Copyright (c) 2000-2005 Silicon Graphics, Inc.   * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA   */  #include "xfs.h"  #include "xfs_fs.h" @@ -90,6 +78,9 @@ xfs_rtbuf_get(  	if (error)  		return error; +	if (nmap == 0 || !xfs_bmap_is_real_extent(&map)) +		return -EFSCORRUPTED; +  	ASSERT(map.br_startblock != NULLFSBLOCK);  	error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp,  				   XFS_FSB_TO_DADDR(mp, map.br_startblock), @@ -1033,14 +1024,17 @@ xfs_rtalloc_query_range(  	int				is_free;  	int				error = 0; -	if (low_rec->ar_startblock > high_rec->ar_startblock) +	if (low_rec->ar_startext > high_rec->ar_startext)  		return -EINVAL; -	else if (low_rec->ar_startblock == high_rec->ar_startblock) +	if (low_rec->ar_startext >= mp->m_sb.sb_rextents || +	    low_rec->ar_startext == high_rec->ar_startext)  		return 0; +	if (high_rec->ar_startext >= mp->m_sb.sb_rextents) +		high_rec->ar_startext = mp->m_sb.sb_rextents - 1;  	/* Iterate the bitmap, looking for discrepancies. */ -	rtstart = low_rec->ar_startblock; -	rem = high_rec->ar_startblock - rtstart; +	rtstart = low_rec->ar_startext; +	rem = high_rec->ar_startext - rtstart;  	while (rem) {  		/* Is the first block free? */  		error = xfs_rtcheck_range(mp, tp, rtstart, 1, 1, &rtend, @@ -1050,13 +1044,13 @@ xfs_rtalloc_query_range(  		/* How long does the extent go for? */  		error = xfs_rtfind_forw(mp, tp, rtstart, -				high_rec->ar_startblock - 1, &rtend); +				high_rec->ar_startext - 1, &rtend);  		if (error)  			break;  		if (is_free) { -			rec.ar_startblock = rtstart; -			rec.ar_blockcount = rtend - rtstart + 1; +			rec.ar_startext = rtstart; +			rec.ar_extcount = rtend - rtstart + 1;  			error = fn(tp, &rec, priv);  			if (error) @@ -1079,25 +1073,13 @@ xfs_rtalloc_query_all(  {  	struct xfs_rtalloc_rec		keys[2]; -	keys[0].ar_startblock = 0; -	keys[1].ar_startblock = tp->t_mountp->m_sb.sb_rblocks; -	keys[0].ar_blockcount = keys[1].ar_blockcount = 0; +	keys[0].ar_startext = 0; +	keys[1].ar_startext = tp->t_mountp->m_sb.sb_rextents - 1; +	keys[0].ar_extcount = keys[1].ar_extcount = 0;  	return xfs_rtalloc_query_range(tp, &keys[0], &keys[1], fn, priv);  } -/* - * Verify that an realtime block number pointer doesn't point off the - * end of the realtime device. - */ -bool -xfs_verify_rtbno( -	struct xfs_mount	*mp, -	xfs_rtblock_t		rtbno) -{ -	return rtbno < mp->m_sb.sb_rblocks; -} -  /* Is the given extent all free? */  int  xfs_rtalloc_extent_is_free(  | 
