From: Genjian Zhang <[email protected]>

__reserve_metadata_snap() increments THIN_SUPERBLOCK_LOCATION in the
metadata space map before shadowing it. When dm_tm_shadow_block()
fails, a reference is leaked in the metadata space map.

Fix by adding the missing dm_sm_dec_block().

Fixes: cc8394d86f04 ("dm thin: provide userspace access to pool metadata")
Signed-off-by: Genjian Zhang <[email protected]>
---
 drivers/md/dm-thin-metadata.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c
index b6a2d2081a24..b194fb57d158 100644
--- a/drivers/md/dm-thin-metadata.c
+++ b/drivers/md/dm-thin-metadata.c
@@ -1353,8 +1353,10 @@ static int __reserve_metadata_snap(struct 
dm_pool_metadata *pmd)
        dm_sm_inc_block(pmd->metadata_sm, THIN_SUPERBLOCK_LOCATION);
        r = dm_tm_shadow_block(pmd->tm, THIN_SUPERBLOCK_LOCATION,
                               &sb_validator, &copy, &inc);
-       if (r)
+       if (r) {
+               dm_sm_dec_block(pmd->metadata_sm, THIN_SUPERBLOCK_LOCATION);
                return r;
+       }
 
        BUG_ON(!inc);
 
-- 
2.43.0


Reply via email to