Commit 63a1281b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'dm-4.6-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm

Pull device mapper fixes from Mike Snitzer:

 - fix a 4.6-rc1 bio-based DM 'struct dm_target_io' leak in an error
   path

 - stable@ fix for DM cache metadata's READ_LOCK macros that were
   incorrectly returning error if the block manager was in read-only
   mode; also cleanup multi-statement macros to use do {} while(0)

* tag 'dm-4.6-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
  dm cache metadata: fix READ_LOCK macros and cleanup WRITE_LOCK macros
  dm: fix dm_target_io leak if clone_bio() returns an error
parents 0a3f5af1 9567366f
...@@ -867,39 +867,55 @@ static int blocks_are_unmapped_or_clean(struct dm_cache_metadata *cmd, ...@@ -867,39 +867,55 @@ static int blocks_are_unmapped_or_clean(struct dm_cache_metadata *cmd,
return 0; return 0;
} }
#define WRITE_LOCK(cmd) \ 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)) { \ down_write(&cmd->root_lock);
up_write(&cmd->root_lock); \ if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) {
return -EINVAL; \ up_write(&cmd->root_lock);
return false;
} }
return true;
}
#define WRITE_LOCK_VOID(cmd) \ #define WRITE_LOCK(cmd) \
down_write(&cmd->root_lock); \ do { \
if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \ if (!cmd_write_lock((cmd))) \
up_write(&cmd->root_lock); \ return -EINVAL; \
return; \ } while(0)
}
#define WRITE_LOCK_VOID(cmd) \
do { \
if (!cmd_write_lock((cmd))) \
return; \
} while(0)
#define WRITE_UNLOCK(cmd) \ #define WRITE_UNLOCK(cmd) \
up_write(&cmd->root_lock) up_write(&(cmd)->root_lock)
#define READ_LOCK(cmd) \ static bool cmd_read_lock(struct dm_cache_metadata *cmd)
down_read(&cmd->root_lock); \ {
if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \ down_write(&cmd->root_lock);
up_read(&cmd->root_lock); \ if (cmd->fail_io) {
return -EINVAL; \ up_write(&cmd->root_lock);
return false;
} }
return true;
}
#define READ_LOCK_VOID(cmd) \ #define READ_LOCK(cmd) \
down_read(&cmd->root_lock); \ do { \
if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \ if (!cmd_read_lock((cmd))) \
up_read(&cmd->root_lock); \ return -EINVAL; \
return; \ } while(0)
}
#define READ_LOCK_VOID(cmd) \
do { \
if (!cmd_read_lock((cmd))) \
return; \
} while(0)
#define READ_UNLOCK(cmd) \ #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) int dm_cache_resize(struct dm_cache_metadata *cmd, dm_cblock_t new_cache_size)
{ {
......
...@@ -1662,8 +1662,10 @@ static int __clone_and_map_data_bio(struct clone_info *ci, struct dm_target *ti, ...@@ -1662,8 +1662,10 @@ static int __clone_and_map_data_bio(struct clone_info *ci, struct dm_target *ti,
tio = alloc_tio(ci, ti, target_bio_nr); tio = alloc_tio(ci, ti, target_bio_nr);
tio->len_ptr = len; tio->len_ptr = len;
r = clone_bio(tio, bio, sector, *len); r = clone_bio(tio, bio, sector, *len);
if (r < 0) if (r < 0) {
free_tio(ci->md, tio);
break; break;
}
__map_bio(tio); __map_bio(tio);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment