+static int ventoy_raw_trim_head(grub_uint64_t offset)
+{
+ grub_uint32_t i;
+ grub_uint32_t memsize;
+ grub_uint32_t imgstart = 0;
+ grub_uint32_t imgsecs = 0;
+ grub_uint64_t sectors = 0;
+ grub_uint64_t cursecs = 0;
+ grub_uint64_t delta = 0;
+
+ if ((!g_img_chunk_list.chunk) || (!offset))
+ {
+ debug("image chunk not ready %p %lu\n", g_img_chunk_list.chunk, (ulong)offset);
+ return 0;
+ }
+
+ debug("image trim head %lu\n", (ulong)offset);
+
+ for (i = 0; i < g_img_chunk_list.cur_chunk; i++)
+ {
+ cursecs = g_img_chunk_list.chunk[i].disk_end_sector + 1 - g_img_chunk_list.chunk[i].disk_start_sector;
+ sectors += cursecs;
+ if (sectors >= offset)
+ {
+ delta = cursecs - (sectors - offset);
+ break;
+ }
+ }
+
+ if (sectors < offset || i >= g_img_chunk_list.cur_chunk)
+ {
+ debug("Invalid size %lu %lu\n", (ulong)sectors, (ulong)offset);
+ return 0;
+ }
+
+ if (sectors == offset)
+ {
+ memsize = (g_img_chunk_list.cur_chunk - (i + 1)) * sizeof(ventoy_img_chunk);
+ grub_memmove(g_img_chunk_list.chunk, g_img_chunk_list.chunk + i + 1, memsize);
+ g_img_chunk_list.cur_chunk -= (i + 1);
+ }
+ else
+ {
+ g_img_chunk_list.chunk[i].disk_start_sector += delta;
+ g_img_chunk_list.chunk[i].img_start_sector += (grub_uint32_t)(delta / 4);
+
+ if (i > 0)
+ {
+ memsize = (g_img_chunk_list.cur_chunk - i) * sizeof(ventoy_img_chunk);
+ grub_memmove(g_img_chunk_list.chunk, g_img_chunk_list.chunk + i, memsize);
+ g_img_chunk_list.cur_chunk -= i;
+ }
+ }
+
+ for (i = 0; i < g_img_chunk_list.cur_chunk; i++)
+ {
+ imgsecs = g_img_chunk_list.chunk[i].img_end_sector + 1 - g_img_chunk_list.chunk[i].img_start_sector;
+ g_img_chunk_list.chunk[i].img_start_sector = imgstart;
+ g_img_chunk_list.chunk[i].img_end_sector = imgstart + (imgsecs - 1);
+ imgstart += imgsecs;
+ }
+
+ return 0;
+}
+