)]}'
{
  "commit": "c7f2efad719cf577806428bcc13628cacbf6842c",
  "tree": "7e485440e14fa190180107dee26dfa64da042281",
  "parents": [
    "74e7105c9a57bd61e394722f09030401ed645021"
  ],
  "author": {
    "name": "Abhisar Sinha",
    "email": "63767682+abh1sar@users.noreply.github.com",
    "time": "Wed Sep 09 15:14:49 2026 +0530"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Wed Sep 09 11:44:49 2026 +0200"
  },
  "message": "kvm: fix restore-and-attach of a backed up volume (#14007)\n\nRestoring a volume from a backup and attaching it to a VM has been broken\nsince the restore commands were changed to run without a shell, in three\nindependent ways.\n\ngetDeviceToAttachDisk pipes virsh domblklist through awk, but passes the awk\nprogram still wrapped in the single quotes a shell would have stripped. Run\ndirectly, awk fails with \"invalid char\" and returns nothing, so the device\nname is empty and charAt throws StringIndexOutOfBoundsException before any\nattach is attempted. This affects every storage type. The exit value was also\nnever checked, and the output not trimmed, so even a working awk would leave\nthe trailing line separator and increment that instead of the device letter.\n\nThe RBD branch passes the literal string \"\u003c\u003cEOF%sEOF\" as a virsh argument. The\nplaceholder is never substituted with the disk XML, and a here-document cannot\nwork without a shell, so virsh is handed a bogus argument and fails. The XML is\nnow written to a temporary file that virsh reads.\n\nThe Linstor branch declares \"--subdriver qcow2\", inverting the previous\nbehaviour where Linstor got a raw attach and every other pool got qcow2. A\nLinstor volume is a raw DRBD block device, so libvirt rejects it with \"Image is\nnot in qcow2 format\". The condition is restored, along with the \"--driver qemu\"\nthat was dropped.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9ebb180b055fdc9e565a061de0fb45b30076d1ba",
      "old_mode": 33188,
      "old_path": "plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRestoreBackupCommandWrapper.java",
      "new_id": "7f2a3c28cd149279e7d7771a597cec89d7a3d990",
      "new_mode": 33188,
      "new_path": "plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRestoreBackupCommandWrapper.java"
    },
    {
      "type": "modify",
      "old_id": "f028035e8dcc76a4ea2c1bf0a78b59e15cde1dfe",
      "old_mode": 33188,
      "old_path": "plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRestoreBackupCommandWrapperTest.java",
      "new_id": "4bbd040b0d1b17d7684172a0a1ba0132735cc858",
      "new_mode": 33188,
      "new_path": "plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRestoreBackupCommandWrapperTest.java"
    }
  ]
}
