]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: remote attribute allocation may be contiguous
authorDave Chinner <dchinner@redhat.com>
Fri, 7 Jun 2013 12:24:54 +0000 (22:24 +1000)
committerBen Myers <bpm@sgi.com>
Tue, 6 Aug 2013 21:27:36 +0000 (16:27 -0500)
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 th enumber 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>
libxfs/xfs_attr_remote.c

index f0ca926ee558fe17f53afcc672778ef1940d81ef..09a168b0b9ca8d2771b5f036d243c481e2afeeab 100644 (file)
@@ -336,6 +336,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;
@@ -416,7 +421,6 @@ xfs_attr_rmtval_set(
                lblkno += map.br_blockcount;
        }
        ASSERT(valuelen == 0);
-       ASSERT(hdrcnt == 0);
        return 0;
 }