diff --git a/pkg/volume/azure_dd/azure_common_linux.go b/pkg/volume/azure_dd/azure_common_linux.go index 304a2bc2855..3c19b9244b5 100644 --- a/pkg/volume/azure_dd/azure_common_linux.go +++ b/pkg/volume/azure_dd/azure_common_linux.go @@ -19,6 +19,7 @@ limitations under the License. package azure_dd import ( + "fmt" "path" "strconv" libstrings "strings" @@ -45,6 +46,28 @@ func listAzureDiskPath(io ioHandler) []string { return azureDiskList } +// getDiskLinkByDevName get disk link by device name from devLinkPath, e.g. /dev/disk/azure/, /dev/disk/by-id/ +func getDiskLinkByDevName(io ioHandler, devLinkPath, devName string) (string, error) { + dirs, err := io.ReadDir(devLinkPath) + glog.V(12).Infof("azureDisk - begin to find %s from %s", devName, devLinkPath) + if err == nil { + for _, f := range dirs { + diskPath := devLinkPath + f.Name() + glog.V(12).Infof("azureDisk - begin to Readlink: %s", diskPath) + link, linkErr := io.Readlink(diskPath) + if linkErr != nil { + glog.Warningf("azureDisk - read link (%s) error: %v", diskPath, linkErr) + continue + } + if libstrings.HasSuffix(link, devName) { + return diskPath, nil + } + } + return "", fmt.Errorf("device name(%s) is not found under %s", devName, devLinkPath) + } + return "", fmt.Errorf("read %s error: %v", devLinkPath, err) +} + func scsiHostRescan(io ioHandler, exec mount.Exec) { scsi_path := "/sys/class/scsi_host/" if dirs, err := io.ReadDir(scsi_path); err == nil { @@ -129,15 +152,25 @@ func findDiskByLunWithConstraint(lun int, io ioHandler, azureDisks []string) (st dir := path.Join(sys_path, name, "block") if dev, err := io.ReadDir(dir); err == nil { found := false + devName := dev[0].Name() for _, diskName := range azureDisks { - glog.V(12).Infof("azure disk - validating disk %q with sys disk %q", dev[0].Name(), diskName) - if string(dev[0].Name()) == diskName { + glog.V(12).Infof("azureDisk - validating disk %q with sys disk %q", devName, diskName) + if devName == diskName { found = true break } } if !found { - return "/dev/" + dev[0].Name(), nil + devLinkPaths := []string{"/dev/disk/azure/scsi1/", "/dev/disk/by-id/"} + for _, devLinkPath := range devLinkPaths { + diskPath, err := getDiskLinkByDevName(io, devLinkPath, devName) + if err == nil { + glog.V(4).Infof("azureDisk - found %s by %s under %s", diskPath, devName, devLinkPath) + return diskPath, nil + } + glog.Warningf("azureDisk - getDiskLinkByDevName by %s under %s failed, error: %v", devName, devLinkPath, err) + } + return "/dev/" + devName, nil } } }