diff options
author | Joe Thornber <ejt@redhat.com> | 2015-06-11 18:11:48 +0200 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2015-06-11 23:13:06 +0200 |
commit | b1f11aff04cc86daa0757ada5deb669a92a8f0fb (patch) | |
tree | 53fe7654800e4e179b29fa98157fa3afa591e804 | |
parent | dm thin: fail messages with EOPNOTSUPP when pool cannot handle messages (diff) | |
download | linux-b1f11aff04cc86daa0757ada5deb669a92a8f0fb.tar.xz linux-b1f11aff04cc86daa0757ada5deb669a92a8f0fb.zip |
dm thin metadata: fix a race when entering fail mode
In dm_thin_find_block() the ->fail_io flag was checked outside the
metadata device's root_lock, causing dm_thin_find_block() to race with
the setting of this flag.
Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r-- | drivers/md/dm-thin-metadata.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index 8b521e3e1e1b..48dfe3c4d6aa 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c @@ -1390,10 +1390,11 @@ int dm_thin_find_block(struct dm_thin_device *td, dm_block_t block, dm_block_t keys[2] = { td->id, block }; struct dm_btree_info *info; - if (pmd->fail_io) - return -EINVAL; - down_read(&pmd->root_lock); + if (pmd->fail_io) { + up_read(&pmd->root_lock); + return -EINVAL; + } if (can_issue_io) { info = &pmd->info; |