Skip to content

Commit 069b82c

Browse files
committed
python3/qcow2-to-stdout: Switch to sparse interval format for nonzero_clusters
nonzero_clusters no longer contain every single allocated cluster and instead are intervals of allocated clusters. Signed-off-by: Andrii Sultanov <andriy.sultanov@vates.tech>
1 parent 46e7f15 commit 069b82c

1 file changed

Lines changed: 20 additions & 17 deletions

File tree

python3/libexec/qcow2-to-stdout.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -224,26 +224,29 @@ def check_cluster_allocate(idx, cluster, cluster_to_compare_with):
224224
# In case input_file is bigger than diff_file_name, first check
225225
# if clusters from diff_file_name differ, and then check if the
226226
# rest contain data
227-
diff_nonzero_clusters_set = set(diff_nonzero_clusters)
228-
for cluster in nonzero_clusters:
229-
if cluster >= last_diff_cluster:
230-
allocate_cluster(cluster)
231-
elif cluster in diff_nonzero_clusters_set:
232-
# If a cluster has different data from the original_cluster
233-
# then it must be allocated
234-
cluster_data = os.pread(fd, cluster_size, cluster_size * cluster)
235-
original_cluster = os.pread(diff_fd, cluster_size, cluster_size * cluster)
236-
check_cluster_allocate(cluster, cluster_data, original_cluster)
237-
diff_nonzero_clusters_set.remove(cluster)
238-
else:
239-
allocate_cluster(cluster)
227+
diff_nonzero_clusters_set = Interval(diff_nonzero_clusters)
228+
229+
for (cluster_left, cluster_right) in nonzero_clusters:
230+
for cluster in range(cluster_left, cluster_right+1):
231+
if cluster >= last_diff_cluster:
232+
allocate_cluster(cluster)
233+
elif cluster in diff_nonzero_clusters_set:
234+
# If a cluster has different data from the original_cluster
235+
# then it must be allocated
236+
cluster_data = os.pread(fd, cluster_size, cluster_size * cluster)
237+
original_cluster = os.pread(diff_fd, cluster_size, cluster_size * cluster)
238+
check_cluster_allocate(cluster, cluster_data, original_cluster)
239+
else:
240+
allocate_cluster(cluster)
240241

241242
# These are not present in the original file
242-
for cluster in diff_nonzero_clusters_set:
243-
allocate_cluster(cluster)
243+
for (cluster_left, cluster_right) in diff_nonzero_clusters_set:
244+
for cluster in range(cluster_left, cluster_right+1):
245+
allocate_cluster(cluster)
244246
else:
245-
for cluster in nonzero_clusters:
246-
allocate_cluster(cluster)
247+
for (cluster_left, cluster_right) in nonzero_clusters:
248+
for cluster in range(cluster_left, cluster_right+1):
249+
allocate_cluster(cluster)
247250

248251
else:
249252
zero_cluster = bytes(cluster_size)

0 commit comments

Comments
 (0)