Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+43 -25
+40 -24
drivers/md/dm-cache-metadata.c
··· 867 867 return 0; 868 868 } 869 869 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; 875 876 } 877 + return true; 878 + } 876 879 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) 883 891 884 892 #define WRITE_UNLOCK(cmd) \ 885 - up_write(&cmd->root_lock) 893 + up_write(&(cmd)->root_lock) 886 894 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; 892 901 } 902 + return true; 903 + } 893 904 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) 900 916 901 917 #define READ_UNLOCK(cmd) \ 902 - up_read(&cmd->root_lock) 918 + up_read(&(cmd)->root_lock) 903 919 904 920 int dm_cache_resize(struct dm_cache_metadata *cmd, dm_cblock_t new_cache_size) 905 921 {
+3 -1
drivers/md/dm.c
··· 1662 1662 tio = alloc_tio(ci, ti, target_bio_nr); 1663 1663 tio->len_ptr = len; 1664 1664 r = clone_bio(tio, bio, sector, *len); 1665 - if (r < 0) 1665 + if (r < 0) { 1666 + free_tio(ci->md, tio); 1666 1667 break; 1668 + } 1667 1669 __map_bio(tio); 1668 1670 } 1669 1671