Skip to content

Commit

Permalink
dm thin metadata: change dm_thin_find_block to allow blocking, but no…
Browse files Browse the repository at this point in the history
…t issuing, IO

This change is a prerequisite for allowing metadata to be prefetched.

Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
  • Loading branch information
Joe Thornber authored and Mike Snitzer committed Nov 10, 2014
1 parent a195db2 commit e5cfc69
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 19 deletions.
30 changes: 13 additions & 17 deletions drivers/md/dm-thin-metadata.c
Original file line number Diff line number Diff line change
Expand Up @@ -1384,42 +1384,38 @@ static bool __snapshotted_since(struct dm_thin_device *td, uint32_t time)
}

int dm_thin_find_block(struct dm_thin_device *td, dm_block_t block,
int can_block, struct dm_thin_lookup_result *result)
int can_issue_io, struct dm_thin_lookup_result *result)
{
int r = -EINVAL;
uint64_t block_time = 0;
int r;
__le64 value;
struct dm_pool_metadata *pmd = td->pmd;
dm_block_t keys[2] = { td->id, block };
struct dm_btree_info *info;

if (can_block) {
down_read(&pmd->root_lock);
info = &pmd->info;
} else if (down_read_trylock(&pmd->root_lock))
info = &pmd->nb_info;
else
return -EWOULDBLOCK;

if (pmd->fail_io)
goto out;
return -EINVAL;

r = dm_btree_lookup(info, pmd->root, keys, &value);
if (!r)
block_time = le64_to_cpu(value);
down_read(&pmd->root_lock);

out:
up_read(&pmd->root_lock);
if (can_issue_io) {
info = &pmd->info;
} else
info = &pmd->nb_info;

r = dm_btree_lookup(info, pmd->root, keys, &value);
if (!r) {
uint64_t block_time = 0;
dm_block_t exception_block;
uint32_t exception_time;

block_time = le64_to_cpu(value);
unpack_block_time(block_time, &exception_block,
&exception_time);
result->block = exception_block;
result->shared = __snapshotted_since(td, exception_time);
}

up_read(&pmd->root_lock);
return r;
}

Expand Down
4 changes: 2 additions & 2 deletions drivers/md/dm-thin-metadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,12 +139,12 @@ struct dm_thin_lookup_result {

/*
* Returns:
* -EWOULDBLOCK iff @can_block is set and would block.
* -EWOULDBLOCK iff @can_issue_io is set and would issue IO
* -ENODATA iff that mapping is not present.
* 0 success
*/
int dm_thin_find_block(struct dm_thin_device *td, dm_block_t block,
int can_block, struct dm_thin_lookup_result *result);
int can_issue_io, struct dm_thin_lookup_result *result);

/*
* Obtain an unused block.
Expand Down

0 comments on commit e5cfc69

Please sign in to comment.