]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
nodedev: Add removable storage 'media_label' prop
authorCole Robinson <crobinso@redhat.com>
Mon, 14 Dec 2009 13:58:23 +0000 (14:58 +0100)
committerDaniel Veillard <veillard@redhat.com>
Mon, 14 Dec 2009 13:58:23 +0000 (14:58 +0100)
Provides the CDROM label for current media. Only implemented for the
udev backend.

docs/schemas/nodedev.rng
src/conf/node_device_conf.c
src/conf/node_device_conf.h
src/node_device/node_device_udev.c
tests/nodedevschemadata/DVD_with_media.xml [new file with mode: 0644]
tests/nodedevxml2xmltest.c

index 706027429523c2462cc4d75d5753e2c192034884..797b1aff67d42f28d5b5c953d862bb2461b8dec0 100644 (file)
       <element name='media_size'>
        <ref name='uint'/>
       </element>
+      <optional>
+        <element name='media_label'>
+          <text/>
+        </element>
+      </optional>
     </element>
   </define>
 
index 2a722744f9765c090ec0fc10dae5ce242671eadc..4e8a492c8c143bf1a8dc9ba1de6e98833aecf608 100644 (file)
@@ -446,6 +446,11 @@ char *virNodeDeviceDefFormat(virConnectPtr conn,
                                   "</media_available>\n", avl ? 1 : 0);
                 virBufferVSprintf(&buf, "      <media_size>%llu</media_size>\n",
                                   data->storage.removable_media_size);
+                if (data->storage.media_label)
+                    virBufferEscapeString(&buf,
+                                      "      <media_label>%s</media_label>\n",
+                                      data->storage.media_label);
+
                 if (data->storage.logical_block_size > 0)
                     virBufferVSprintf(&buf, "      <logical_block_size>%llu"
                                       "</logical_block_size>\n",
@@ -598,6 +603,8 @@ virNodeDevCapStorageParseXML(virConnectPtr conn,
             if (virXPathBoolean(conn, "count(./media_available[. = '1']) > 0", ctxt))
                 data->storage.flags |= VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE;
 
+            data->storage.media_label = virXPathString(conn, "string(./media_label[1])", ctxt);
+
             val = 0;
             if (virNodeDevCapsDefParseULongLong(conn, "number(./media_size[1])", ctxt, &val, def,
                                                 _("no removable media size supplied for '%s'"),
@@ -1459,6 +1466,7 @@ void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
         VIR_FREE(data->storage.model);
         VIR_FREE(data->storage.vendor);
         VIR_FREE(data->storage.serial);
+        VIR_FREE(data->storage.media_label);
         break;
     case VIR_NODE_DEV_CAP_LAST:
         /* This case is here to shutup the compiler */
index 4bfac907751a182aca50a6ec646bcd60f8431842..318fa3e03d6cb59a4c0b7286adfefb450d50f9ac 100644 (file)
@@ -170,6 +170,7 @@ struct _virNodeDevCapsDef {
             char *model;
             char *vendor;
             char *serial;
+            char *media_label;
             unsigned flags;    /* virNodeDevStorageCapFlags bits */
         } storage;
     } data;
index cf23be11d5cb715bfc149dd4f6a3f39bde9f580e..422a713435d37946f3b977d92ac6dbf22e9d3b3e 100644 (file)
@@ -868,6 +868,11 @@ static int udevProcessCDROM(struct udev_device *device,
         def->caps->data.storage.flags |=
             VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE;
 
+        if (udevGetStringProperty(device, "ID_FS_LABEL",
+                                  &data->storage.media_label) == PROPERTY_ERROR) {
+            goto out;
+        }
+
         if (udevGetUint64SysfsAttr(device,
                                    "size",
                                    &data->storage.num_blocks) == PROPERTY_ERROR) {
diff --git a/tests/nodedevschemadata/DVD_with_media.xml b/tests/nodedevschemadata/DVD_with_media.xml
new file mode 100644 (file)
index 0000000..673e88f
--- /dev/null
@@ -0,0 +1,16 @@
+<device>
+  <name>DVD_GCC_4247N</name>
+  <parent>pci_8086_27df_scsi_host_scsi_device_lun0</parent>
+  <capability type='storage'>
+    <block>/dev/sr0</block>
+    <bus>scsi</bus>
+    <drive_type>cdrom</drive_type>
+    <model>RW/DVD GCC-4247N</model>
+    <vendor>HL-DT-ST</vendor>
+    <capability type='removable'>
+      <media_available>1</media_available>
+      <media_size>12345678</media_size>
+      <media_label>Windows_XP_Label</media_label>
+    </capability>
+  </capability>
+</device>
index 76212127918d3ab4c7d715d63ee82b4e54668cb5..bf8be7e5ca66b605129fb158e8d02f92cc4657f3 100644 (file)
@@ -80,6 +80,7 @@ mymain(int argc, char **argv)
 
     DO_TEST("computer");
     DO_TEST("DVD_GCC_4247N");
+    DO_TEST("DVD_with_media");
     DO_TEST("net_00_13_02_b9_f9_d3");
     DO_TEST("net_00_15_58_2f_e9_55");
     DO_TEST("pci_1002_71c4");