From: Daniel P. Berrange Date: Wed, 3 Apr 2013 17:20:41 +0000 (+0100) Subject: Add support for SD cards in nodedev driver X-Git-Tag: v1.0.5-rc1~256 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2b373e6d62c813e542830824080ad4134c071b6;p=thirdparty%2Flibvirt.git Add support for SD cards in nodedev driver The nodedev driver currently only detects harddisk, cdrom and floppy devices. This adds support for SD cards, which are common storage for ARM devices, eg the Google ChromeBook block_mmcblk0_0xb1c7c08b computer /dev/mmcblk0 sd 0xb1c7c08b 15758000128 512 30777344 Signed-off-by: Daniel P. Berrange --- diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index cb11e5fe0b..362a47f322 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -952,6 +952,35 @@ static int udevProcessFloppy(struct udev_device *device, return udevProcessRemoveableMedia(device, def, has_media); } + +static int udevProcessSD(struct udev_device *device, + virNodeDeviceDefPtr def) +{ + union _virNodeDevCapData *data = &def->caps->data; + int ret = 0; + + if (udevGetUint64SysfsAttr(device, + "size", + &data->storage.num_blocks) == PROPERTY_ERROR) { + goto out; + } + + if (udevGetUint64SysfsAttr(device, + "queue/logical_block_size", + &data->storage.logical_block_size) + == PROPERTY_ERROR) { + goto out; + } + + data->storage.size = data->storage.num_blocks * + data->storage.logical_block_size; + +out: + return ret; +} + + + /* This function exists to deal with the case in which a driver does * not provide a device type in the usual place, but udev told us it's * a storage device, and we can make a good guess at what kind of @@ -1056,6 +1085,13 @@ static int udevProcessStorage(struct udev_device *device, data->storage.drive_type = strdup("floppy"); if (!data->storage.drive_type) goto out; + } else if ((udevGetIntProperty(device, "ID_DRIVE_FLASH_SD", + &tmp_int, 0) == PROPERTY_FOUND) && + (tmp_int == 1)) { + + data->storage.drive_type = strdup("sd"); + if (!data->storage.drive_type) + goto out; } else { /* If udev doesn't have it, perhaps we can guess it. */ @@ -1071,6 +1107,8 @@ static int udevProcessStorage(struct udev_device *device, ret = udevProcessDisk(device, def); } else if (STREQ(def->caps->data.storage.drive_type, "floppy")) { ret = udevProcessFloppy(device, def); + } else if (STREQ(def->caps->data.storage.drive_type, "sd")) { + ret = udevProcessSD(device, def); } else { VIR_DEBUG("Unsupported storage type '%s'", def->caps->data.storage.drive_type); @@ -1082,6 +1120,7 @@ static int udevProcessStorage(struct udev_device *device, } out: + VIR_DEBUG("Storage ret=%d", ret); return ret; } @@ -1338,6 +1377,8 @@ static int udevAddOneDevice(struct udev_device *device) out: if (ret != 0) { + VIR_DEBUG("Discarding device %d %p %s", ret, def, + def ? def->sysfs_path : ""); virNodeDeviceDefFree(def); }