diff options
author | Brian Foster <bfoster@redhat.com> | 2015-05-29 08:51:37 +1000 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2015-05-29 08:51:37 +1000 |
commit | 999633d304f2467ae48104ea218b1e8fb0303d40 (patch) | |
tree | 22befdb55796ab74b26ec1d592c7c892952b8280 /fs/xfs/uuid.c | |
parent | d4cc540b08e95386777b7e644fb384c2adc0da32 (diff) |
xfs: update free inode record logic to support sparse inode records
xfs_difree_inobt() uses logic in a couple places that assume inobt
records refer to fully allocated chunks. Specifically, the use of
mp->m_ialloc_inos can cause problems for inode chunks that are sparsely
allocated. Sparse inode chunks can, by definition, define a smaller
number of inodes than a full inode chunk.
Fix the logic that determines whether an inode record should be removed
from the inobt to use the ir_free mask rather than ir_freecount. Fix the
agi counters modification to use ir_freecount to add the actual number
of inodes freed rather than assuming a full inode chunk.
Also make sure that we preserve the behavior to not remove inode chunks
if the block size is large enough for multiple inode chunks (e.g.,
bsize=64k, isize=512). This behavior was previously implicit in that in
such configurations, ir.freecount of a single record never matches
m_ialloc_inos. Hence, add some comments as well.
Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/uuid.c')
0 files changed, 0 insertions, 0 deletions