| From bpm@sgi.com Sun Jan 22 14:13:07 2012 |
| From: bpm@sgi.com |
| Date: Wed, 18 Jan 2012 14:41:45 -0600 |
| Subject: xfs: fix endian conversion issue in discard code |
| To: stable@vger.kernel.org, xfs@oss.sgi.com, bpm@sgi.com |
| Cc: Dave Chinner <dchinner@redhat.com> |
| Message-ID: <1326919305-2753-2-git-send-email-bpm@sgi.com> |
| |
| From: Dave Chinner <dchinner@redhat.com> |
| |
| commit b1c770c273a4787069306fc82aab245e9ac72e9d upstream |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/xfs/xfs_discard.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/fs/xfs/xfs_discard.c |
| +++ b/fs/xfs/xfs_discard.c |
| @@ -68,7 +68,7 @@ xfs_trim_extents( |
| * Look up the longest btree in the AGF and start with it. |
| */ |
| 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) |
| goto out_del_cursor; |
| |
| @@ -84,7 +84,7 @@ xfs_trim_extents( |
| if (error) |
| goto 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. |