forked from pool/systemd
73 lines
2.3 KiB
Diff
73 lines
2.3 KiB
Diff
|
From a24d03b8ee2ca62cd1273e27cf4e79ddcc0fbb1c Mon Sep 17 00:00:00 2001
|
||
|
From: Hannes Reinecke <hare@suse.de>
|
||
|
Date: Fri, 23 Nov 2012 14:12:39 +0100
|
||
|
Subject: [PATCH] udev: path_id - handle Hyper-V devices
|
||
|
|
||
|
Hyper-V has an abstract bus, which gets renumbered on guest
|
||
|
startup. So instead of the bus numbers we should be using
|
||
|
the device GUIDs, which can be retrieved from the 'device_id'
|
||
|
sysfs attribute.
|
||
|
---
|
||
|
src/udev/udev-builtin-path_id.c | 41 +++++++++++++++++++++++++++++++++++++++
|
||
|
1 files changed, 41 insertions(+), 0 deletions(-)
|
||
|
|
||
|
Index: systemd-195/src/udev/udev-builtin-path_id.c
|
||
|
===================================================================
|
||
|
--- systemd-195.orig/src/udev/udev-builtin-path_id.c
|
||
|
+++ systemd-195/src/udev/udev-builtin-path_id.c
|
||
|
@@ -381,6 +381,42 @@ out:
|
||
|
return hostdev;
|
||
|
}
|
||
|
|
||
|
+static struct udev_device *handle_scsi_hyperv(struct udev_device *parent, char **path) {
|
||
|
+ struct udev_device *hostdev;
|
||
|
+ struct udev_device *vmbusdev;
|
||
|
+ const char *guid_str;
|
||
|
+ char *lun = NULL;
|
||
|
+ char guid[38];
|
||
|
+ size_t i, k;
|
||
|
+
|
||
|
+ hostdev = udev_device_get_parent_with_subsystem_devtype(parent, "scsi", "scsi_host");
|
||
|
+ if (!hostdev)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ vmbusdev = udev_device_get_parent(hostdev);
|
||
|
+ if (!vmbusdev)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ guid_str = udev_device_get_sysattr_value(vmbusdev, "device_id");
|
||
|
+ if (!guid_str)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ if (strlen(guid_str) < 37 || guid_str[0] != '{' || guid_str[36] != '}')
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ for (i = 1, k = 0; i < 36; i++) {
|
||
|
+ if (guid_str[i] == '-')
|
||
|
+ continue;
|
||
|
+ guid[k++] = guid_str[i];
|
||
|
+ }
|
||
|
+ guid[k] = '\0';
|
||
|
+
|
||
|
+ format_lun_number(parent, &lun);
|
||
|
+ path_prepend(path, "vmbus-%s-%s", guid, lun);
|
||
|
+ free(lun);
|
||
|
+ return parent;
|
||
|
+}
|
||
|
+
|
||
|
static struct udev_device *handle_scsi(struct udev_device *parent, char **path)
|
||
|
{
|
||
|
const char *devtype;
|
||
|
@@ -422,6 +458,11 @@ static struct udev_device *handle_scsi(s
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
+ if (strstr(name, "/vmbus_") != NULL) {
|
||
|
+ parent = handle_scsi_hyperv(parent, path);
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+
|
||
|
parent = handle_scsi_default(parent, path);
|
||
|
out:
|
||
|
return parent;
|