Skip to content

Commit 1e224c2

Browse files
qemuimgutil: fix "Failed to get \"write\" lock" error
Fix issue 3720 Thanks to pavelanni for providing the fix generated by Claude Co-authored-by: Oleksandr Redko <[email protected]> Signed-off-by: Akihiro Suda <[email protected]> (cherry picked from commit 2b8bb39) Signed-off-by: Akihiro Suda <[email protected]>
1 parent c9471bb commit 1e224c2

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

pkg/qemuimgutil/qemuimgutil.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,31 @@ type InfoFormatSpecificDataVmdkExtent struct {
103103
}
104104

105105
func convertToRaw(source, dest string) error {
106+
if source != dest {
107+
return execQemuImgConvert(source, dest)
108+
}
109+
110+
// If source == dest, we need to use a temporary file to avoid file locking issues
111+
112+
info, err := getInfo(source)
113+
if err != nil {
114+
return fmt.Errorf("failed to get info for source disk %q: %w", source, err)
115+
}
116+
if info.Format == "raw" {
117+
return nil
118+
}
119+
120+
tempFile := dest + ".lima-qemu-convert.tmp"
121+
defer os.Remove(tempFile)
122+
123+
if err := execQemuImgConvert(source, tempFile); err != nil {
124+
return err
125+
}
126+
127+
return os.Rename(tempFile, dest)
128+
}
129+
130+
func execQemuImgConvert(source, dest string) error {
106131
var stdout, stderr bytes.Buffer
107132
cmd := exec.Command("qemu-img", "convert", "-O", "raw", source, dest)
108133
cmd.Stdout = &stdout

0 commit comments

Comments
 (0)