]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dm thin metadata: fix superblock refcount leak on snapshot shadow failure
authorGenjian Zhang <zhanggenjian@kylinos.cn>
Sat, 11 Jul 2026 10:05:26 +0000 (18:05 +0800)
committerMikulas Patocka <mpatocka@redhat.com>
Sat, 11 Jul 2026 13:18:51 +0000 (15:18 +0200)
__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().

Signed-off-by: Genjian Zhang <zhanggenjian@kylinos.cn>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Fixes: cc8394d86f04 ("dm thin: provide userspace access to pool metadata")
Cc: stable@vger.kernel.org
drivers/md/dm-thin-metadata.c

index a010ff1e5c92eb0477b4362925862ae867f6777e..e60e1326376a0bdc63d47ad5be5dd76bd729d89d 100644 (file)
@@ -1362,8 +1362,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);