Skip to content

Commit a387ccc

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 e31e905 commit a387ccc

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
@@ -225,26 +225,29 @@ def check_cluster_allocate(idx, cluster, cluster_to_compare_with):
225225
# In case input_file is bigger than diff_file_name, first check
226226
# if clusters from diff_file_name differ, and then check if the
227227
# rest contain data
228-
diff_nonzero_clusters_set = set(diff_nonzero_clusters)
229-
for cluster in nonzero_clusters:
230-
if cluster >= last_diff_cluster:
231-
allocate_cluster(cluster)
232-
elif cluster in diff_nonzero_clusters_set:
233-
# If a cluster has different data from the original_cluster
234-
# then it must be allocated
235-
cluster_data = os.pread(fd, cluster_size, cluster_size * cluster)
236-
original_cluster = os.pread(diff_fd, cluster_size, cluster_size * cluster)
237-
check_cluster_allocate(cluster, cluster_data, original_cluster)
238-
diff_nonzero_clusters_set.remove(cluster)
239-
else:
240-
allocate_cluster(cluster)
228+
diff_nonzero_clusters_set = Interval(diff_nonzero_clusters)
229+
230+
for (cluster_left, cluster_right) in nonzero_clusters:
231+
for cluster in range(cluster_left, cluster_right+1):
232+
if cluster >= last_diff_cluster:
233+
allocate_cluster(cluster)
234+
elif cluster in diff_nonzero_clusters_set:
235+
# If a cluster has different data from the original_cluster
236+
# then it must be allocated
237+
cluster_data = os.pread(fd, cluster_size, cluster_size * cluster)
238+
original_cluster = os.pread(diff_fd, cluster_size, cluster_size * cluster)
239+
check_cluster_allocate(cluster, cluster_data, original_cluster)
240+
else:
241+
allocate_cluster(cluster)
241242

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

249252
else:
250253
zero_cluster = bytes(cluster_size)

0 commit comments

Comments
 (0)