ext4: support GETFSMAP ioctls
Support the GETFSMAP ioctls so that we can use the xfs free space management tools to probe ext4 as well. Note that this is a partial implementation -- we only report fixed-location metadata and free space; everything else is reported as "unknown". Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:

committed by
Theodore Ts'o

parent
d0649f0416
commit
0c9ec4beec
@@ -5277,3 +5277,52 @@ out:
|
||||
range->len = EXT4_C2B(EXT4_SB(sb), trimmed) << sb->s_blocksize_bits;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Iterate all the free extents in the group. */
|
||||
int
|
||||
ext4_mballoc_query_range(
|
||||
struct super_block *sb,
|
||||
ext4_group_t group,
|
||||
ext4_grpblk_t start,
|
||||
ext4_grpblk_t end,
|
||||
ext4_mballoc_query_range_fn formatter,
|
||||
void *priv)
|
||||
{
|
||||
void *bitmap;
|
||||
ext4_grpblk_t next;
|
||||
struct ext4_buddy e4b;
|
||||
int error;
|
||||
|
||||
error = ext4_mb_load_buddy(sb, group, &e4b);
|
||||
if (error)
|
||||
return error;
|
||||
bitmap = e4b.bd_bitmap;
|
||||
|
||||
ext4_lock_group(sb, group);
|
||||
|
||||
start = (e4b.bd_info->bb_first_free > start) ?
|
||||
e4b.bd_info->bb_first_free : start;
|
||||
if (end >= EXT4_CLUSTERS_PER_GROUP(sb))
|
||||
end = EXT4_CLUSTERS_PER_GROUP(sb) - 1;
|
||||
|
||||
while (start <= end) {
|
||||
start = mb_find_next_zero_bit(bitmap, end + 1, start);
|
||||
if (start > end)
|
||||
break;
|
||||
next = mb_find_next_bit(bitmap, end + 1, start);
|
||||
|
||||
ext4_unlock_group(sb, group);
|
||||
error = formatter(sb, group, start, next - start, priv);
|
||||
if (error)
|
||||
goto out_unload;
|
||||
ext4_lock_group(sb, group);
|
||||
|
||||
start = next + 1;
|
||||
}
|
||||
|
||||
ext4_unlock_group(sb, group);
|
||||
out_unload:
|
||||
ext4_mb_unload_buddy(&e4b);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
Reference in New Issue
Block a user