mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	dm space map disk: fix some book keeping in the disk space map
When decrementing the reference count for a block, the free count wasn't being updated if the reference count went to zero. Cc: stable@vger.kernel.org Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
		
							parent
							
								
									91bcdb92d3
								
							
						
					
					
						commit
						0377a07c7a
					
				
					 1 changed files with 14 additions and 1 deletions
				
			
		| 
						 | 
					@ -142,10 +142,23 @@ static int sm_disk_inc_block(struct dm_space_map *sm, dm_block_t b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int sm_disk_dec_block(struct dm_space_map *sm, dm_block_t b)
 | 
					static int sm_disk_dec_block(struct dm_space_map *sm, dm_block_t b)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						int r;
 | 
				
			||||||
 | 
						uint32_t old_count;
 | 
				
			||||||
	enum allocation_event ev;
 | 
						enum allocation_event ev;
 | 
				
			||||||
	struct sm_disk *smd = container_of(sm, struct sm_disk, sm);
 | 
						struct sm_disk *smd = container_of(sm, struct sm_disk, sm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return sm_ll_dec(&smd->ll, b, &ev);
 | 
						r = sm_ll_dec(&smd->ll, b, &ev);
 | 
				
			||||||
 | 
						if (!r && (ev == SM_FREE)) {
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * It's only free if it's also free in the last
 | 
				
			||||||
 | 
							 * transaction.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							r = sm_ll_lookup(&smd->old_ll, b, &old_count);
 | 
				
			||||||
 | 
							if (!r && !old_count)
 | 
				
			||||||
 | 
								smd->nr_allocated_this_transaction--;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return r;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int sm_disk_new_block(struct dm_space_map *sm, dm_block_t *b)
 | 
					static int sm_disk_new_block(struct dm_space_map *sm, dm_block_t *b)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue