- FREE(swm_info->parts);
- swm_info->parts = parts;
- swm_info->num_alloc_parts = num_alloc_parts;
- }
- swm_info->num_parts++;
- INIT_LIST_HEAD(&swm_info->parts[swm_info->num_parts - 1].stream_list);
- swm_info->parts[swm_info->num_parts - 1].size = 0;
+ FREE(swm_info->parts);
+ swm_info->parts = parts;
+ swm_info->num_alloc_parts = num_alloc_parts;
+ }
+ swm_info->num_parts++;
+ INIT_LIST_HEAD(&swm_info->parts[swm_info->num_parts - 1].blob_list);
+ swm_info->parts[swm_info->num_parts - 1].size = 0;
+ return 0;
+}
+
+static int
+add_blob_to_swm(struct blob_descriptor *blob, void *_swm_info)
+{
+ struct swm_info *swm_info = _swm_info;
+ u64 blob_stored_size;
+ int ret;
+
+ if (blob->blob_location == BLOB_IN_WIM)
+ blob_stored_size = blob->rdesc->size_in_wim;
+ else
+ blob_stored_size = blob->size;
+
+ /* Start the next part if adding this blob exceeds the maximum part
+ * size, UNLESS the blob is metadata or if no blobs at all have been
+ * added to the current part. */
+ if ((swm_info->parts[swm_info->num_parts - 1].size +
+ blob_stored_size >= swm_info->max_part_size)
+ && !(blob->is_metadata ||
+ swm_info->parts[swm_info->num_parts - 1].size == 0))
+ {
+ ret = start_new_swm_part(swm_info);
+ if (ret)
+ return ret;