xfs: fix perag leak when growfs fails
During growfs, if new ag in memory has been initialized, however
sb_agcount has not been updated, if an error occurs at this time it
will cause perag leaks as follows, these new AGs will not been freed
during umount , because of these new AGs are not visible(that is
included in mp->m_sb.sb_agcount).
unreferenced object 0xffff88810be40200 (size 512):
comm "xfs_growfs", pid 857, jiffies
4294909093
hex dump (first 32 bytes):
00 c0 c1 05 81 88 ff ff 04 00 00 00 00 00 00 00 ................
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace (crc
381741e2):
[<
ffffffff8191aef6>] __kmalloc+0x386/0x4f0
[<
ffffffff82553e65>] kmem_alloc+0xb5/0x2f0
[<
ffffffff8238dac5>] xfs_initialize_perag+0xc5/0x810
[<
ffffffff824f679c>] xfs_growfs_data+0x9bc/0xbc0
[<
ffffffff8250b90e>] xfs_file_ioctl+0x5fe/0x14d0
[<
ffffffff81aa5194>] __x64_sys_ioctl+0x144/0x1c0
[<
ffffffff83c3d81f>] do_syscall_64+0x3f/0xe0
[<
ffffffff83e00087>] entry_SYSCALL_64_after_hwframe+0x62/0x6a
unreferenced object 0xffff88810be40800 (size 512):
comm "xfs_growfs", pid 857, jiffies
4294909093
hex dump (first 32 bytes):
20 00 00 00 00 00 00 00 57 ef be dc 00 00 00 00 .......W.......
10 08 e4 0b 81 88 ff ff 10 08 e4 0b 81 88 ff ff ................
backtrace (crc
bde50e2d):
[<
ffffffff8191b43a>] __kmalloc_node+0x3da/0x540
[<
ffffffff81814489>] kvmalloc_node+0x99/0x160
[<
ffffffff8286acff>] bucket_table_alloc.isra.0+0x5f/0x400
[<
ffffffff8286bdc5>] rhashtable_init+0x405/0x760
[<
ffffffff8238dda3>] xfs_initialize_perag+0x3a3/0x810
[<
ffffffff824f679c>] xfs_growfs_data+0x9bc/0xbc0
[<
ffffffff8250b90e>] xfs_file_ioctl+0x5fe/0x14d0
[<
ffffffff81aa5194>] __x64_sys_ioctl+0x144/0x1c0
[<
ffffffff83c3d81f>] do_syscall_64+0x3f/0xe0
[<
ffffffff83e00087>] entry_SYSCALL_64_after_hwframe+0x62/0x6a
Factor out xfs_free_unused_perag_range() from xfs_initialize_perag(),
used for freeing unused perag within a specified range in error handling,
included in the error path of the growfs failure.
Fixes: 1c1c6ebcf528 ("xfs: Replace per-ag array with a radix tree")
Signed-off-by: Long Li <leo.lilong@huawei.com>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>