Skip to content

Commit d75141a

Browse files
committed
Manually create udev links if udev trigger doesn't work
Change-Id: I26bffb3eda447c8343ce39e69c34cf31616120e3
1 parent 4c5bb0b commit d75141a

File tree

1 file changed

+30
-11
lines changed

1 file changed

+30
-11
lines changed

pkg/deviceutils/device-utils.go

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,10 @@ func (m *deviceUtils) VerifyDevicePath(devicePaths []string, deviceName string)
290290
})
291291

292292
if err != nil {
293-
return "", fmt.Errorf("failed to find and re-link disk %s with udevadm after retrying for %v: %w", deviceName, pollTimeout, err)
293+
klog.Warningf("For device %s udevadmin failed: %v. Trying to manually link", deviceName, err)
294+
if err := manuallySetDevicePath(deviceName); err != nil {
295+
return "", fmt.Errorf("failed to manually set link for disk %s: %w", deviceName, err)
296+
}
294297
}
295298

296299
return devicePath, nil
@@ -338,7 +341,7 @@ func findAvailableDevFsPaths() ([]string, error) {
338341
return append(diskSDPaths, diskNvmePaths...), nil
339342
}
340343

341-
func udevadmTriggerForDiskIfExists(deviceName string) error {
344+
func findDevice(deviceName string) (string, string, error) {
342345
devFsPathToSerial := map[string]string{}
343346
devFsPaths, err := findAvailableDevFsPaths()
344347
if err != nil {
@@ -355,17 +358,33 @@ func udevadmTriggerForDiskIfExists(deviceName string) error {
355358
klog.V(4).Infof("device path %s, serial number %v", devFsPath, devFsSerial)
356359
devFsPathToSerial[devFsPath] = devFsSerial
357360
if devFsSerial == deviceName {
358-
// Found the disk that we're looking for so run a trigger on it
359-
// to resolve its /dev/by-id/ path
360-
klog.Warningf("udevadm --trigger running to fix disk at path %s which has serial number %s", devFsPath, devFsSerial)
361-
err := udevadmChangeToDrive(devFsPath)
362-
if err != nil {
363-
return fmt.Errorf("udevadm --trigger failed to fix device path %s which has serial number %s: %w", devFsPath, devFsSerial, err)
364-
}
365-
return nil
361+
return devFsPath, devFsSerial, nil
366362
}
367363
}
368-
return fmt.Errorf("udevadm --trigger requested to fix disk %s but no such disk was found in device path %v", deviceName, devFsPathToSerial)
364+
return "", "", fmt.Errorf("udevadm --trigger requested to fix disk %s but no such disk was found in device path %v", deviceName, devFsPathToSerial)
365+
}
366+
367+
func manuallySetDevicePath(deviceName string) error {
368+
devFsPath, devFsSerial, err := findDevice(deviceName)
369+
if err != nil {
370+
return err
371+
}
372+
return os.Symlink(devFsPath, path.Join(diskByIdPath, diskGooglePrefix+devFsSerial))
373+
}
374+
375+
func udevadmTriggerForDiskIfExists(deviceName string) error {
376+
devFsPath, devFsSerial, err := findDevice(deviceName)
377+
if err != nil {
378+
return err
379+
}
380+
// Found the disk that we're looking for so run a trigger on it
381+
// to resolve its /dev/by-id/ path
382+
klog.Warningf("udevadm --trigger running to fix disk at path %s which has serial number %s", devFsPath, devFsSerial)
383+
err := udevadmChangeToDrive(devFsPath)
384+
if err != nil {
385+
return fmt.Errorf("udevadm --trigger failed to fix device path %s which has serial number %s: %w", devFsPath, devFsSerial, err)
386+
}
387+
return nil
369388
}
370389

371390
// Calls "udevadm trigger --action=change" on the specified drive. drivePath

0 commit comments

Comments
 (0)