summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2013-05-21 10:02:01 +0200
committerBen Myers <bpm@sgi.com>2013-05-31 00:25:39 +0200
commit9531e2de6b7f04bd734b4bbc1e16a6955121615a (patch)
tree6e259ff91845db749a116d7280ad59e2f65c6434 /fs
parentxfs: fix dir3 freespace block corruption (diff)
downloadlinux-9531e2de6b7f04bd734b4bbc1e16a6955121615a.tar.xz
linux-9531e2de6b7f04bd734b4bbc1e16a6955121615a.zip
xfs: remote attribute allocation may be contiguous
When CRCs are enabled, there may be multiple allocations made if the headers cause a length overflow. This, however, does not mean that the number of headers required increases, as the second and subsequent extents may be contiguous with the previous extent. Hence when we map the extents to write the attribute data, we may end up with less extents than allocations made. Hence the assertion that we consume the number of headers we calculated in the allocation loop is incorrect and needs to be removed. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Ben Myers <bpm@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com> (cherry picked from commit 90253cf142469a40f89f989904abf0a1e500e1a6)
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/xfs_attr_remote.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c
index dee84466dcc9..aad95b08e76b 100644
--- a/fs/xfs/xfs_attr_remote.c
+++ b/fs/xfs/xfs_attr_remote.c
@@ -359,6 +359,11 @@ xfs_attr_rmtval_set(
* into requiring more blocks. e.g. for 512 byte blocks, we'll
* spill for another block every 9 headers we require in this
* loop.
+ *
+ * Note that this can result in contiguous allocation of blocks,
+ * so we don't use all the space we allocate for headers as we
+ * have one less header for each contiguous allocation that
+ * occurs in the map/write loop below.
*/
if (crcs && blkcnt == 0) {
int total_len;
@@ -439,7 +444,6 @@ xfs_attr_rmtval_set(
lblkno += map.br_blockcount;
}
ASSERT(valuelen == 0);
- ASSERT(hdrcnt == 0);
return 0;
}