Skip to content

Commit 6143f92

Browse files
committed
qemuimgutil: fix "Failed to get \"write\" lock" error
Fix issue 3720 Thanks to pavelanni for providing the fix generated by Claude Signed-off-by: Akihiro Suda <[email protected]>
1 parent 3e3e486 commit 6143f92

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

pkg/qemuimgutil/qemuimgutil.go

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

105105
func convertToRaw(source, dest string) error {
106+
// If source == dest, we need to use a temporary file to avoid file locking issues
107+
if source == dest {
108+
// Get info to check if it's already raw format
109+
info, err := getInfo(source)
110+
if err != nil {
111+
return fmt.Errorf("failed to get info for source disk %q: %w", source, err)
112+
}
113+
// If already raw, no conversion needed
114+
if info.Format == "raw" {
115+
return nil
116+
}
117+
118+
// Create temporary file for conversion
119+
tempFile := dest + ".lima-qemu-convert.tmp"
120+
defer os.Remove(tempFile) // Clean up temp file
121+
122+
// Convert to temp file first
123+
if err := convertToRawHelper(source, tempFile); err != nil {
124+
return err
125+
}
126+
127+
// Replace original with converted file
128+
return os.Rename(tempFile, dest)
129+
}
130+
131+
return convertToRawHelper(source, dest)
132+
}
133+
134+
func convertToRawHelper(source, dest string) error {
106135
var stdout, stderr bytes.Buffer
107136
cmd := exec.Command("qemu-img", "convert", "-O", "raw", source, dest)
108137
cmd.Stdout = &stdout

0 commit comments

Comments
 (0)