diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_inode_buf.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_inode_buf.c | 21 | 
1 files changed, 16 insertions, 5 deletions
diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index f24fa628fecf..992e6d337709 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -252,7 +252,10 @@ xfs_inode_from_disk(  					   be64_to_cpu(from->di_changecount));  		ip->i_crtime = xfs_inode_from_disk_ts(from, from->di_crtime);  		ip->i_diflags2 = be64_to_cpu(from->di_flags2); +		/* also covers the di_used_blocks union arm: */  		ip->i_cowextsize = be32_to_cpu(from->di_cowextsize); +		BUILD_BUG_ON(sizeof(from->di_cowextsize) != +			     sizeof(from->di_used_blocks));  	}  	error = xfs_iformat_data_fork(ip, from); @@ -349,6 +352,7 @@ xfs_inode_to_disk(  		to->di_changecount = cpu_to_be64(inode_peek_iversion(inode));  		to->di_crtime = xfs_inode_to_disk_ts(ip, ip->i_crtime);  		to->di_flags2 = cpu_to_be64(ip->i_diflags2); +		/* also covers the di_used_blocks union arm: */  		to->di_cowextsize = cpu_to_be32(ip->i_cowextsize);  		to->di_ino = cpu_to_be64(ip->i_ino);  		to->di_lsn = cpu_to_be64(lsn); @@ -752,11 +756,18 @@ xfs_dinode_verify(  	    !xfs_has_rtreflink(mp))  		return __this_address; -	/* COW extent size hint validation */ -	fa = xfs_inode_validate_cowextsize(mp, be32_to_cpu(dip->di_cowextsize), -			mode, flags, flags2); -	if (fa) -		return fa; +	if (xfs_has_zoned(mp) && +	    dip->di_metatype == cpu_to_be16(XFS_METAFILE_RTRMAP)) { +		if (be32_to_cpu(dip->di_used_blocks) > mp->m_sb.sb_rgextents) +			return __this_address; +	} else { +		/* COW extent size hint validation */ +		fa = xfs_inode_validate_cowextsize(mp, +				be32_to_cpu(dip->di_cowextsize), +				mode, flags, flags2); +		if (fa) +			return fa; +	}  	/* bigtime iflag can only happen on bigtime filesystems */  	if (xfs_dinode_has_bigtime(dip) &&  | 
