forked from mirrors/linux
		
	dm cache metadata: fix READ_LOCK macros and cleanup WRITE_LOCK macros
The READ_LOCK macro was incorrectly returning -EINVAL if
dm_bm_is_read_only() was true -- it will always be true once the cache
metadata transitions to read-only by dm_cache_metadata_set_read_only().
Wrap READ_LOCK and WRITE_LOCK multi-statement macros in do {} while(0).
Also, all accesses of the 'cmd' argument passed to these related macros
are now encapsulated in parenthesis.
A follow-up patch can be developed to eliminate the use of macros in
favor of pure C code.  Avoiding that now given that this needs to apply
to stable@.
Reported-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Fixes: d14fcf3dd7 ("dm cache: make sure every metadata function checks fail_io")
Cc: stable@vger.kernel.org
			
			
This commit is contained in:
		
							parent
							
								
									072623de1f
								
							
						
					
					
						commit
						9567366fef
					
				
					 1 changed files with 40 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -867,39 +867,55 @@ static int blocks_are_unmapped_or_clean(struct dm_cache_metadata *cmd,
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define WRITE_LOCK(cmd)	\
 | 
			
		||||
	down_write(&cmd->root_lock); \
 | 
			
		||||
	if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
 | 
			
		||||
		up_write(&cmd->root_lock); \
 | 
			
		||||
		return -EINVAL; \
 | 
			
		||||
static bool cmd_write_lock(struct dm_cache_metadata *cmd)
 | 
			
		||||
{
 | 
			
		||||
	down_write(&cmd->root_lock);
 | 
			
		||||
	if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) {
 | 
			
		||||
		up_write(&cmd->root_lock);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define WRITE_LOCK_VOID(cmd) \
 | 
			
		||||
	down_write(&cmd->root_lock); \
 | 
			
		||||
	if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
 | 
			
		||||
		up_write(&cmd->root_lock); \
 | 
			
		||||
		return; \
 | 
			
		||||
	}
 | 
			
		||||
#define WRITE_LOCK(cmd)				\
 | 
			
		||||
	do {					\
 | 
			
		||||
		if (!cmd_write_lock((cmd)))	\
 | 
			
		||||
			return -EINVAL;		\
 | 
			
		||||
	} while(0)
 | 
			
		||||
 | 
			
		||||
#define WRITE_LOCK_VOID(cmd)			\
 | 
			
		||||
	do {					\
 | 
			
		||||
		if (!cmd_write_lock((cmd)))	\
 | 
			
		||||
			return;			\
 | 
			
		||||
	} while(0)
 | 
			
		||||
 | 
			
		||||
#define WRITE_UNLOCK(cmd) \
 | 
			
		||||
	up_write(&cmd->root_lock)
 | 
			
		||||
	up_write(&(cmd)->root_lock)
 | 
			
		||||
 | 
			
		||||
#define READ_LOCK(cmd) \
 | 
			
		||||
	down_read(&cmd->root_lock); \
 | 
			
		||||
	if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
 | 
			
		||||
		up_read(&cmd->root_lock); \
 | 
			
		||||
		return -EINVAL; \
 | 
			
		||||
static bool cmd_read_lock(struct dm_cache_metadata *cmd)
 | 
			
		||||
{
 | 
			
		||||
	down_write(&cmd->root_lock);
 | 
			
		||||
	if (cmd->fail_io) {
 | 
			
		||||
		up_write(&cmd->root_lock);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define READ_LOCK_VOID(cmd)	\
 | 
			
		||||
	down_read(&cmd->root_lock); \
 | 
			
		||||
	if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
 | 
			
		||||
		up_read(&cmd->root_lock); \
 | 
			
		||||
		return; \
 | 
			
		||||
	}
 | 
			
		||||
#define READ_LOCK(cmd)				\
 | 
			
		||||
	do {					\
 | 
			
		||||
		if (!cmd_read_lock((cmd)))	\
 | 
			
		||||
			return -EINVAL;		\
 | 
			
		||||
	} while(0)
 | 
			
		||||
 | 
			
		||||
#define READ_LOCK_VOID(cmd)			\
 | 
			
		||||
	do {					\
 | 
			
		||||
		if (!cmd_read_lock((cmd)))	\
 | 
			
		||||
			return;			\
 | 
			
		||||
	} while(0)
 | 
			
		||||
 | 
			
		||||
#define READ_UNLOCK(cmd) \
 | 
			
		||||
	up_read(&cmd->root_lock)
 | 
			
		||||
	up_read(&(cmd)->root_lock)
 | 
			
		||||
 | 
			
		||||
int dm_cache_resize(struct dm_cache_metadata *cmd, dm_cblock_t new_cache_size)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue