summaryrefslogtreecommitdiff
path: root/libvirt-RHEL-virscsi-Support-TAPEs-in-virSCSIDeviceGetDevName.patch
blob: c40415e9fb5595ad5e82b8bf6ba7a24b65a96952 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
From 4df31ff37d48a17f6fe0341215a60c892e93697d Mon Sep 17 00:00:00 2001
Message-Id: <4df31ff37d48a17f6fe0341215a60c892e93697d@dist-git>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Fri, 6 Mar 2020 15:52:22 +0100
Subject: [PATCH] RHEL: virscsi: Support TAPEs in virSCSIDeviceGetDevName()

If the SCSI device we want to get /dev node name for is TAPE
device we need to look at 'tape' symlink in the sysfs dir
corresponding to the device.

https://bugzilla.redhat.com/show_bug.cgi?id=1808390

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Message-Id: <20200306145226.1610708-3-abologna@redhat.com>
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
---
 src/util/virscsi.c                          | 27 +++++++++++++++
 tests/virscsidata/2-0-0-0/model             |  1 +
 tests/virscsidata/2-0-0-0/scsi_tape/st0/dev |  1 +
 tests/virscsidata/2-0-0-0/sg3/dev           |  1 +
 tests/virscsidata/2-0-0-0/tape              |  1 +
 tests/virscsidata/2-0-0-0/type              |  1 +
 tests/virscsidata/2-0-0-0/vendor            |  1 +
 tests/virscsidata/sg3                       |  0
 tests/virscsitest.c                         | 38 ++++++++++++++++++---
 9 files changed, 66 insertions(+), 5 deletions(-)
 create mode 100644 tests/virscsidata/2-0-0-0/model
 create mode 100644 tests/virscsidata/2-0-0-0/scsi_tape/st0/dev
 create mode 100644 tests/virscsidata/2-0-0-0/sg3/dev
 create mode 120000 tests/virscsidata/2-0-0-0/tape
 create mode 100644 tests/virscsidata/2-0-0-0/type
 create mode 100644 tests/virscsidata/2-0-0-0/vendor
 create mode 100644 tests/virscsidata/sg3

diff --git a/src/util/virscsi.c b/src/util/virscsi.c
index 770f727cac..6165196423 100644
--- a/src/util/virscsi.c
+++ b/src/util/virscsi.c
@@ -224,6 +224,31 @@ virSCSIDeviceGetDevNameBlock(const char *prefix,
 }
 
 
+static char *
+virSCSIDeviceGetDevNameTape(const char *prefix,
+                            unsigned int adapter,
+                            unsigned int bus,
+                            unsigned int target,
+                            unsigned long long unit)
+{
+    g_autofree char *path = NULL;
+    g_autofree char *resolvedPath = NULL;
+    g_autoptr(GError) err = NULL;
+
+    path = g_strdup_printf("%s/%d:%u:%u:%llu/tape",
+                           prefix, adapter, bus, target, unit);
+
+    if (!(resolvedPath = g_file_read_link(path, &err))) {
+        virReportError(VIR_ERR_SYSTEM_ERROR,
+                       _("Unable to read link: %s"),
+                       err->message);
+        return NULL;
+    }
+
+    return g_path_get_basename(resolvedPath);
+}
+
+
 /* Returns device name (e.g. "sdc") on success, or NULL
  * on failure.
  */
@@ -250,6 +275,8 @@ virSCSIDeviceGetDevName(const char *sysfs_prefix,
         return virSCSIDeviceGetDevNameBlock(prefix, adapter_id, bus, target, unit);
 
     case VIR_SCSI_DEVICE_TYPE_TAPE:
+        return virSCSIDeviceGetDevNameTape(prefix, adapter_id, bus, target, unit);
+
     case VIR_SCSI_DEVICE_TYPE_PRINTER:
     case VIR_SCSI_DEVICE_TYPE_PROCESSOR:
     case VIR_SCSI_DEVICE_TYPE_WORM:
diff --git a/tests/virscsidata/2-0-0-0/model b/tests/virscsidata/2-0-0-0/model
new file mode 100644
index 0000000000..d2ab4715c3
--- /dev/null
+++ b/tests/virscsidata/2-0-0-0/model
@@ -0,0 +1 @@
+scsi_debug
diff --git a/tests/virscsidata/2-0-0-0/scsi_tape/st0/dev b/tests/virscsidata/2-0-0-0/scsi_tape/st0/dev
new file mode 100644
index 0000000000..3dd777e840
--- /dev/null
+++ b/tests/virscsidata/2-0-0-0/scsi_tape/st0/dev
@@ -0,0 +1 @@
+9:0
diff --git a/tests/virscsidata/2-0-0-0/sg3/dev b/tests/virscsidata/2-0-0-0/sg3/dev
new file mode 100644
index 0000000000..b369a59b3e
--- /dev/null
+++ b/tests/virscsidata/2-0-0-0/sg3/dev
@@ -0,0 +1 @@
+21:3
diff --git a/tests/virscsidata/2-0-0-0/tape b/tests/virscsidata/2-0-0-0/tape
new file mode 120000
index 0000000000..6ca7f77539
--- /dev/null
+++ b/tests/virscsidata/2-0-0-0/tape
@@ -0,0 +1 @@
+scsi_tape/st0
\ No newline at end of file
diff --git a/tests/virscsidata/2-0-0-0/type b/tests/virscsidata/2-0-0-0/type
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/tests/virscsidata/2-0-0-0/type
@@ -0,0 +1 @@
+1
diff --git a/tests/virscsidata/2-0-0-0/vendor b/tests/virscsidata/2-0-0-0/vendor
new file mode 100644
index 0000000000..9b075671ea
--- /dev/null
+++ b/tests/virscsidata/2-0-0-0/vendor
@@ -0,0 +1 @@
+Linux
diff --git a/tests/virscsidata/sg3 b/tests/virscsidata/sg3
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/virscsitest.c b/tests/virscsitest.c
index c96699e157..924b77af08 100644
--- a/tests/virscsitest.c
+++ b/tests/virscsitest.c
@@ -33,17 +33,33 @@ VIR_LOG_INIT("tests.scsitest");
 
 static char *virscsi_prefix;
 
+typedef struct {
+    const char *adapter;
+    unsigned int bus;
+    unsigned int target;
+    unsigned int unit;
+    const char *expectedName;
+} testGetDevNameData;
+
 static int
-test1(const void *data G_GNUC_UNUSED)
+testGetDevName(const void *opaque)
 {
+    const testGetDevNameData *data = opaque;
     g_autofree char *name = NULL;
 
     if (!(name = virSCSIDeviceGetDevName(virscsi_prefix,
-                                         "scsi_host1", 0, 0, 0)))
+                                         data->adapter,
+                                         data->bus,
+                                         data->target,
+                                         data->unit)))
         return -1;
 
-    if (STRNEQ(name, "sdh"))
+    if (STRNEQ(name, data->expectedName)) {
+        fprintf(stderr,
+                "SCSI dev name mismatch, expected %s got %s",
+                data->expectedName, name);
         return -1;
+    }
 
     return 0;
 }
@@ -200,15 +216,27 @@ mymain(void)
 
     CREATE_SYMLINK("0-0-0-0", "0:0:0:0");
     CREATE_SYMLINK("1-0-0-0", "1:0:0:0");
+    CREATE_SYMLINK("2-0-0-0", "2:0:0:0");
     CREATE_SYMLINK("sg0", "sg0");
+    CREATE_SYMLINK("sg3", "sg3");
     CREATE_SYMLINK("sg8", "sg8");
 
     VIR_FREE(virscsi_prefix);
 
     virscsi_prefix = g_strdup(tmpdir);
 
-    if (virTestRun("test1", test1, NULL) < 0)
-        ret = -1;
+#define TEST_GET_DEV_NAME(adapter, bus, target, unit, expectedName) \
+    do { \
+        testGetDevNameData data = {adapter, bus, target, unit, expectedName}; \
+        if (virTestRun("test getDevname " expectedName, \
+                       testGetDevName, &data) < 0) \
+            ret = -1; \
+    } while (0)
+
+    TEST_GET_DEV_NAME("scsi_host0", 0, 0, 0, "sda");
+    TEST_GET_DEV_NAME("scsi_host1", 0, 0, 0, "sdh");
+    TEST_GET_DEV_NAME("scsi_host2", 0, 0, 0, "st0");
+
     if (virTestRun("test2", test2, NULL) < 0)
         ret = -1;
 
-- 
2.33.1