diff options
author | Joe Thornber <ejt@redhat.com> | 2015-06-11 17:11:48 +0100 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2015-06-11 17:13:06 -0400 |
commit | b1f11aff04cc86daa0757ada5deb669a92a8f0fb (patch) | |
tree | 53fe7654800e4e179b29fa98157fa3afa591e804 /drivers/md/dm-thin-metadata.c | |
parent | fd467696e8beb542144cd005ff96cd35fff41354 (diff) | |
download | op-kernel-dev-b1f11aff04cc86daa0757ada5deb669a92a8f0fb.zip op-kernel-dev-b1f11aff04cc86daa0757ada5deb669a92a8f0fb.tar.gz |
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>
Diffstat (limited to 'drivers/md/dm-thin-metadata.c')
-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 8b521e3..48dfe3c 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; |