Patch "dm cache metadata: fix READ_LOCK macros and cleanup WRITE_LOCK macros" has been added to the 4.5-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
dm cache metadata: fix READ_LOCK macros and cleanup WRITE_LOCK macros
to the 4.5-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
dm-cache-metadata-fix-read_lock-macros-and-cleanup-write_lock-macros.patch
and it can be found in the queue-4.5 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
9567366fefddeaea4ed1d713270535d93a3b3c76Mon Sep 17 00:00:00 2001
From: Mike Snitzer <[email protected]>
Date: Tue, 12 Apr 2016 12:14:46 -0400
Subject: dm cache metadata: fix READ_LOCK macros and cleanup WRITE_LOCK macros
From: Mike Snitzer <[email protected]>
commit 9567366fefddeaea4ed1d713270535d93a3b3c76 upstream.
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@.
--- drivers/md/dm-cache-metadata.c | 64 +++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 24 deletions(-)
drivers/md/dm-cache-metadata.c +40 -24
@@ -867,39 +867,55 @@ static int blocks_are_unmapped_or_clean(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) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.5/dm-cache-metadata-fix-cmd_read_lock-acquiring-write-lock.patch queue-4.5/dm-cache-metadata-fix-read_lock-macros-and-cleanup-write_lock-macros.patch