dm thin metadata: change dm_thin_find_block to allow blocking, but not issuing, IO
authorJoe Thornber <ejt@redhat.com>
Mon, 6 Oct 2014 14:24:55 +0000 (15:24 +0100)
committerMike Snitzer <snitzer@redhat.com>
Mon, 10 Nov 2014 20:25:26 +0000 (15:25 -0500)
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>
drivers/md/dm-thin-metadata.c
drivers/md/dm-thin-metadata.h

index e9d33ad59df5e21a9fcdae85e96a27ccb93156cd..ee42d1c52387577644c57021d26dbeaab87071d0 100644 (file)
@@ -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;
 }
 
index e3c857db195a7453d192f5f55cfb766a046a789a..efedd5a4cd8f0e271ba7b92c45a1fc68c768d6ca 100644 (file)
@@ -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.