mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	dm cache metadata: use cursor api in blocks_are_clean_separate_dirty()
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
		
							parent
							
								
									9b696229aa
								
							
						
					
					
						commit
						7f1b21591a
					
				
					 1 changed files with 26 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -931,27 +931,46 @@ static int blocks_are_clean_separate_dirty(struct dm_cache_metadata *cmd,
 | 
			
		|||
	bool dirty_flag;
 | 
			
		||||
	*result = true;
 | 
			
		||||
 | 
			
		||||
	// FIXME: use a cursor so we can benefit from preloading metadata.
 | 
			
		||||
	r = dm_bitset_cursor_begin(&cmd->dirty_info, cmd->dirty_root,
 | 
			
		||||
				   from_cblock(begin), &cmd->dirty_cursor);
 | 
			
		||||
	if (r) {
 | 
			
		||||
		DMERR("%s: dm_bitset_cursor_begin for dirty failed", __func__);
 | 
			
		||||
		return r;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	r = dm_bitset_cursor_skip(&cmd->dirty_cursor, from_cblock(begin));
 | 
			
		||||
	if (r) {
 | 
			
		||||
		DMERR("%s: dm_bitset_cursor_skip for dirty failed", __func__);
 | 
			
		||||
		dm_bitset_cursor_end(&cmd->dirty_cursor);
 | 
			
		||||
		return r;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (begin != end) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * We assume that unmapped blocks have their dirty bit
 | 
			
		||||
		 * cleared.
 | 
			
		||||
		 */
 | 
			
		||||
		r = dm_bitset_test_bit(&cmd->dirty_info, cmd->dirty_root,
 | 
			
		||||
				       from_cblock(begin), &cmd->dirty_root, &dirty_flag);
 | 
			
		||||
		if (r)
 | 
			
		||||
			return r;
 | 
			
		||||
 | 
			
		||||
		dirty_flag = dm_bitset_cursor_get_value(&cmd->dirty_cursor);
 | 
			
		||||
		if (dirty_flag) {
 | 
			
		||||
			DMERR("cache block %llu is dirty",
 | 
			
		||||
			DMERR("%s: cache block %llu is dirty", __func__,
 | 
			
		||||
			      (unsigned long long) from_cblock(begin));
 | 
			
		||||
			dm_bitset_cursor_end(&cmd->dirty_cursor);
 | 
			
		||||
			*result = false;
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		r = dm_bitset_cursor_next(&cmd->dirty_cursor);
 | 
			
		||||
		if (r) {
 | 
			
		||||
			DMERR("%s: dm_bitset_cursor_next for dirty failed", __func__);
 | 
			
		||||
			dm_bitset_cursor_end(&cmd->dirty_cursor);
 | 
			
		||||
			return r;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		begin = to_cblock(from_cblock(begin) + 1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dm_bitset_cursor_end(&cmd->dirty_cursor);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue