diff mbox series

[37/45] xfs_io: correctly report RGs with internal rt dev in bmap output

Message ID 20250409075557.3535745-38-hch@lst.de (mailing list archive)
State New
Headers show
Series [01/45] xfs: generalize the freespace and reserved blocks handling | expand

Commit Message

Christoph Hellwig April 9, 2025, 7:55 a.m. UTC
Apply the proper offset.  Somehow this made gcc complain about
possible overflowing abuf, so increase the size for that as well.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 io/bmap.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

Comments

Darrick J. Wong April 9, 2025, 10:22 p.m. UTC | #1
On Wed, Apr 09, 2025 at 09:55:40AM +0200, Christoph Hellwig wrote:
> Apply the proper offset.  Somehow this made gcc complain about
> possible overflowing abuf, so increase the size for that as well.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Looks fine to me...
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>

--D

> ---
>  io/bmap.c | 23 +++++++++++++++--------
>  1 file changed, 15 insertions(+), 8 deletions(-)
> 
> diff --git a/io/bmap.c b/io/bmap.c
> index b2f6b4905285..944f658b35f0 100644
> --- a/io/bmap.c
> +++ b/io/bmap.c
> @@ -257,18 +257,21 @@ bmap_f(
>  #define	FLG_BSW		0000010	/* Not on begin of stripe width */
>  #define	FLG_ESW		0000001	/* Not on end   of stripe width */
>  		int	agno;
> -		off_t	agoff, bbperag;
> +		off_t	agoff, bbperag, bstart;
>  		int	foff_w, boff_w, aoff_w, tot_w, agno_w;
> -		char	rbuf[32], bbuf[32], abuf[32];
> +		char	rbuf[32], bbuf[32], abuf[64];
>  		int	sunit, swidth;
>  
>  		foff_w = boff_w = aoff_w = MINRANGE_WIDTH;
>  		tot_w = MINTOT_WIDTH;
>  		if (is_rt) {
> +			bstart = fsgeo.rtstart *
> +				(fsgeo.blocksize / BBSIZE);
>  			bbperag = bytes_per_rtgroup(&fsgeo) / BBSIZE;
>  			sunit = 0;
>  			swidth = 0;
>  		} else {
> +			bstart = 0;
>  			bbperag = (off_t)fsgeo.agblocks *
>  				  (off_t)fsgeo.blocksize / BBSIZE;
>  			sunit = (fsgeo.sunit * fsgeo.blocksize) / BBSIZE;
> @@ -298,9 +301,11 @@ bmap_f(
>  						map[i + 1].bmv_length - 1LL));
>  				boff_w = max(boff_w, strlen(bbuf));
>  				if (bbperag > 0) {
> -					agno = map[i + 1].bmv_block / bbperag;
> -					agoff = map[i + 1].bmv_block -
> -							(agno * bbperag);
> +					off_t bno;
> +
> +					bno = map[i + 1].bmv_block - bstart;
> +					agno = bno / bbperag;
> +					agoff = bno % bbperag;
>  					snprintf(abuf, sizeof(abuf),
>  						"(%lld..%lld)",
>  						(long long)agoff,
> @@ -387,9 +392,11 @@ bmap_f(
>  				printf("%4d: %-*s %-*s", i, foff_w, rbuf,
>  					boff_w, bbuf);
>  				if (bbperag > 0) {
> -					agno = map[i + 1].bmv_block / bbperag;
> -					agoff = map[i + 1].bmv_block -
> -							(agno * bbperag);
> +					off_t bno;
> +
> +					bno = map[i + 1].bmv_block - bstart;
> +					agno = bno / bbperag;
> +					agoff = bno % bbperag;
>  					snprintf(abuf, sizeof(abuf),
>  						"(%lld..%lld)",
>  						(long long)agoff,
> -- 
> 2.47.2
> 
>
diff mbox series

Patch

diff --git a/io/bmap.c b/io/bmap.c
index b2f6b4905285..944f658b35f0 100644
--- a/io/bmap.c
+++ b/io/bmap.c
@@ -257,18 +257,21 @@  bmap_f(
 #define	FLG_BSW		0000010	/* Not on begin of stripe width */
 #define	FLG_ESW		0000001	/* Not on end   of stripe width */
 		int	agno;
-		off_t	agoff, bbperag;
+		off_t	agoff, bbperag, bstart;
 		int	foff_w, boff_w, aoff_w, tot_w, agno_w;
-		char	rbuf[32], bbuf[32], abuf[32];
+		char	rbuf[32], bbuf[32], abuf[64];
 		int	sunit, swidth;
 
 		foff_w = boff_w = aoff_w = MINRANGE_WIDTH;
 		tot_w = MINTOT_WIDTH;
 		if (is_rt) {
+			bstart = fsgeo.rtstart *
+				(fsgeo.blocksize / BBSIZE);
 			bbperag = bytes_per_rtgroup(&fsgeo) / BBSIZE;
 			sunit = 0;
 			swidth = 0;
 		} else {
+			bstart = 0;
 			bbperag = (off_t)fsgeo.agblocks *
 				  (off_t)fsgeo.blocksize / BBSIZE;
 			sunit = (fsgeo.sunit * fsgeo.blocksize) / BBSIZE;
@@ -298,9 +301,11 @@  bmap_f(
 						map[i + 1].bmv_length - 1LL));
 				boff_w = max(boff_w, strlen(bbuf));
 				if (bbperag > 0) {
-					agno = map[i + 1].bmv_block / bbperag;
-					agoff = map[i + 1].bmv_block -
-							(agno * bbperag);
+					off_t bno;
+
+					bno = map[i + 1].bmv_block - bstart;
+					agno = bno / bbperag;
+					agoff = bno % bbperag;
 					snprintf(abuf, sizeof(abuf),
 						"(%lld..%lld)",
 						(long long)agoff,
@@ -387,9 +392,11 @@  bmap_f(
 				printf("%4d: %-*s %-*s", i, foff_w, rbuf,
 					boff_w, bbuf);
 				if (bbperag > 0) {
-					agno = map[i + 1].bmv_block / bbperag;
-					agoff = map[i + 1].bmv_block -
-							(agno * bbperag);
+					off_t bno;
+
+					bno = map[i + 1].bmv_block - bstart;
+					agno = bno / bbperag;
+					agoff = bno % bbperag;
 					snprintf(abuf, sizeof(abuf),
 						"(%lld..%lld)",
 						(long long)agoff,