Ensure we never overlap with existing blocks
authorJens Axboe <jaxboe@fusionio.com>
Thu, 17 Jun 2010 19:27:11 +0000 (21:27 +0200)
committerJens Axboe <jaxboe@fusionio.com>
Thu, 17 Jun 2010 19:27:11 +0000 (21:27 +0200)
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
io_u.c

diff --git a/io_u.c b/io_u.c
index bffacb404e860864b51e7c89b443eb0a54cb15b6..f451d1a756141e3a29eaad8f3f2fb74d113ae82e 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -54,11 +54,8 @@ static void mark_random_map(struct thread_data *td, struct io_u *io_u)
                 * If we have a mixed random workload, we may
                 * encounter blocks we already did IO to.
                 */
-               if ((td->o.ddir_nr == 1) && !random_map_free(f, block)) {
-                       if (!blocks)
-                               blocks = 1;
+               if ((td->o.ddir_nr == 1) && !random_map_free(f, block))
                        break;
-               }
 
                idx = RAND_MAP_IDX(f, block);
                bit = RAND_MAP_BIT(f, block);
@@ -69,10 +66,20 @@ static void mark_random_map(struct thread_data *td, struct io_u *io_u)
                if (this_blocks + bit > BLOCKS_PER_MAP)
                        this_blocks = BLOCKS_PER_MAP - bit;
 
-               if (this_blocks == BLOCKS_PER_MAP)
-                       mask = -1U;
-               else
-                       mask = ((1U << this_blocks) - 1) << bit;
+               do {
+                       if (this_blocks == BLOCKS_PER_MAP)
+                               mask = -1U;
+                       else
+                               mask = ((1U << this_blocks) - 1) << bit;
+       
+                       if (!(f->file_map[idx] & mask))
+                               break;
+
+                       this_blocks--;
+               } while (this_blocks);
+
+               if (!this_blocks)
+                       break;
 
                f->file_map[idx] |= mask;
                nr_blocks -= this_blocks;