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: d14fcf3dd79 ("dm cache: make sure every metadata function checks fail_io")
Cc: stable@vger.kernel.org

Changed files
+40 -24
drivers
+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 {