Skip to content

Commit 63a1281

Browse files
committed
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
2 parents 0a3f5af + 9567366 commit 63a1281

File tree

2 files changed

+43
-25
lines changed

2 files changed

+43
-25
lines changed

drivers/md/dm-cache-metadata.c

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -867,39 +867,55 @@ static int blocks_are_unmapped_or_clean(struct dm_cache_metadata *cmd,
867867
return 0;
868868
}
869869

870-
#define WRITE_LOCK(cmd) \
871-
down_write(&cmd->root_lock); \
872-
if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
873-
up_write(&cmd->root_lock); \
874-
return -EINVAL; \
870+
static bool cmd_write_lock(struct dm_cache_metadata *cmd)
871+
{
872+
down_write(&cmd->root_lock);
873+
if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) {
874+
up_write(&cmd->root_lock);
875+
return false;
875876
}
877+
return true;
878+
}
876879

877-
#define WRITE_LOCK_VOID(cmd) \
878-
down_write(&cmd->root_lock); \
879-
if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
880-
up_write(&cmd->root_lock); \
881-
return; \
882-
}
880+
#define WRITE_LOCK(cmd) \
881+
do { \
882+
if (!cmd_write_lock((cmd))) \
883+
return -EINVAL; \
884+
} while(0)
885+
886+
#define WRITE_LOCK_VOID(cmd) \
887+
do { \
888+
if (!cmd_write_lock((cmd))) \
889+
return; \
890+
} while(0)
883891

884892
#define WRITE_UNLOCK(cmd) \
885-
up_write(&cmd->root_lock)
893+
up_write(&(cmd)->root_lock)
886894

887-
#define READ_LOCK(cmd) \
888-
down_read(&cmd->root_lock); \
889-
if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
890-
up_read(&cmd->root_lock); \
891-
return -EINVAL; \
895+
static bool cmd_read_lock(struct dm_cache_metadata *cmd)
896+
{
897+
down_write(&cmd->root_lock);
898+
if (cmd->fail_io) {
899+
up_write(&cmd->root_lock);
900+
return false;
892901
}
902+
return true;
903+
}
893904

894-
#define READ_LOCK_VOID(cmd) \
895-
down_read(&cmd->root_lock); \
896-
if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \
897-
up_read(&cmd->root_lock); \
898-
return; \
899-
}
905+
#define READ_LOCK(cmd) \
906+
do { \
907+
if (!cmd_read_lock((cmd))) \
908+
return -EINVAL; \
909+
} while(0)
910+
911+
#define READ_LOCK_VOID(cmd) \
912+
do { \
913+
if (!cmd_read_lock((cmd))) \
914+
return; \
915+
} while(0)
900916

901917
#define READ_UNLOCK(cmd) \
902-
up_read(&cmd->root_lock)
918+
up_read(&(cmd)->root_lock)
903919

904920
int dm_cache_resize(struct dm_cache_metadata *cmd, dm_cblock_t new_cache_size)
905921
{

drivers/md/dm.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1662,8 +1662,10 @@ static int __clone_and_map_data_bio(struct clone_info *ci, struct dm_target *ti,
16621662
tio = alloc_tio(ci, ti, target_bio_nr);
16631663
tio->len_ptr = len;
16641664
r = clone_bio(tio, bio, sector, *len);
1665-
if (r < 0)
1665+
if (r < 0) {
1666+
free_tio(ci->md, tio);
16661667
break;
1668+
}
16671669
__map_bio(tio);
16681670
}
16691671

0 commit comments

Comments
 (0)