Ensure we never overlap with existing blocks

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
diff --git a/io_u.c b/io_u.c
index bffacb4..f451d1a 100644
--- a/io_u.c
+++ b/io_u.c
@@ -54,11 +54,8 @@
 		 * 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 @@
 		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;