Explorar o código

xfs: fix endian conversion issue in discard code

When finding the longest extent in an AG, we read the value directly
out of the AGF buffer without endian conversion. This will give an
incorrect length, resulting in FITRIM operations potentially not
trimming everything that it should.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Ben Myers <bpm@sgi.com>
Dave Chinner %!s(int64=13) %!d(string=hai) anos
pai
achega
b1c770c273
Modificáronse 1 ficheiros con 2 adicións e 2 borrados
  1. 2 2
      fs/xfs/xfs_discard.c

+ 2 - 2
fs/xfs/xfs_discard.c

@@ -68,7 +68,7 @@ xfs_trim_extents(
 	 * Look up the longest btree in the AGF and start with it.
 	 * Look up the longest btree in the AGF and start with it.
 	 */
 	 */
 	error = xfs_alloc_lookup_le(cur, 0,
 	error = xfs_alloc_lookup_le(cur, 0,
-				    XFS_BUF_TO_AGF(agbp)->agf_longest, &i);
+			    be32_to_cpu(XFS_BUF_TO_AGF(agbp)->agf_longest), &i);
 	if (error)
 	if (error)
 		goto out_del_cursor;
 		goto out_del_cursor;
 
 
@@ -84,7 +84,7 @@ xfs_trim_extents(
 		if (error)
 		if (error)
 			goto out_del_cursor;
 			goto out_del_cursor;
 		XFS_WANT_CORRUPTED_GOTO(i == 1, out_del_cursor);
 		XFS_WANT_CORRUPTED_GOTO(i == 1, out_del_cursor);
-		ASSERT(flen <= XFS_BUF_TO_AGF(agbp)->agf_longest);
+		ASSERT(flen <= be32_to_cpu(XFS_BUF_TO_AGF(agbp)->agf_longest));
 
 
 		/*
 		/*
 		 * Too small?  Give up.
 		 * Too small?  Give up.