diff options
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/xfs_attr_leaf.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 0bce1b348580..79ece72976ae 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c | |||
@@ -2181,14 +2181,24 @@ xfs_attr3_leaf_unbalance( | |||
2181 | struct xfs_attr_leafblock *tmp_leaf; | 2181 | struct xfs_attr_leafblock *tmp_leaf; |
2182 | struct xfs_attr3_icleaf_hdr tmphdr; | 2182 | struct xfs_attr3_icleaf_hdr tmphdr; |
2183 | 2183 | ||
2184 | tmp_leaf = kmem_alloc(state->blocksize, KM_SLEEP); | 2184 | tmp_leaf = kmem_zalloc(state->blocksize, KM_SLEEP); |
2185 | memset(tmp_leaf, 0, state->blocksize); | 2185 | |
2186 | memset(&tmphdr, 0, sizeof(tmphdr)); | 2186 | /* |
2187 | * Copy the header into the temp leaf so that all the stuff | ||
2188 | * not in the incore header is present and gets copied back in | ||
2189 | * once we've moved all the entries. | ||
2190 | */ | ||
2191 | memcpy(tmp_leaf, save_leaf, xfs_attr3_leaf_hdr_size(save_leaf)); | ||
2187 | 2192 | ||
2193 | memset(&tmphdr, 0, sizeof(tmphdr)); | ||
2188 | tmphdr.magic = savehdr.magic; | 2194 | tmphdr.magic = savehdr.magic; |
2189 | tmphdr.forw = savehdr.forw; | 2195 | tmphdr.forw = savehdr.forw; |
2190 | tmphdr.back = savehdr.back; | 2196 | tmphdr.back = savehdr.back; |
2191 | tmphdr.firstused = state->blocksize; | 2197 | tmphdr.firstused = state->blocksize; |
2198 | |||
2199 | /* write the header to the temp buffer to initialise it */ | ||
2200 | xfs_attr3_leaf_hdr_to_disk(tmp_leaf, &tmphdr); | ||
2201 | |||
2192 | if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, | 2202 | if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, |
2193 | drop_blk->bp, &drophdr)) { | 2203 | drop_blk->bp, &drophdr)) { |
2194 | xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, | 2204 | xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, |