summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGenjian Zhang <zhanggenjian@kylinos.cn>2026-07-11 18:05:26 +0800
committerMikulas Patocka <mpatocka@redhat.com>2026-07-11 15:18:51 +0200
commit4b22d0801fadfcae2e106e6ba32e49439c7c7ebf (patch)
tree07a60ca856b0d5ebce79047ef0cf7772e89695c2
parent386df1a57b631c456d14f857cb0c0c2e11c16bef (diff)
dm thin metadata: fix superblock refcount leak on snapshot shadow failure
__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
-rw-r--r--drivers/md/dm-thin-metadata.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c
index a010ff1e5c92..e60e1326376a 100644
--- a/drivers/md/dm-thin-metadata.c
+++ b/drivers/md/dm-thin-metadata.c
@@ -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);