# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1217344591 -3600
# Node ID 1d647ef26f3ff578568ad1822bd666a46da9fed5
# Parent b8916f4d48f6fac453c2e0af896b681d5288c524
linux/blkfront: Add "media" file to vbd sysfs directory
Patch adds "media" file to the vbd sysfs directory. File contains a
string, cdrom or disk.
Currently all PV vbd devices are seen by HAL as "disk". Applications
that query HAL info.capabilities attribute to determine a block
devices capabilities fail to see a PV cdrom as having CDROM
capabilities. With the attached patch and a small corresponding patch
to HAL, applications that query HAL for the storage type of the block
device will see it as a disk or a cdrom. Standard Linux IDE devices
use this same mechanism.
lshal of vbd without patches:
info.capabilities = {'storage', 'block'} (string list)
lshal of vbd with patches:
info.capabilities = {'storage', 'block', 'storage.cdrom'} (string
list)
Signed-off-by: Pat Campbell <plc@xxxxxxxxxx>
---
drivers/xen/blkfront/blkfront.c | 9 ++++++++
drivers/xen/blkfront/block.h | 15 +++++++++++++
drivers/xen/blkfront/vbd.c | 45 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 69 insertions(+)
diff -r b8916f4d48f6 -r 1d647ef26f3f drivers/xen/blkfront/blkfront.c
--- a/drivers/xen/blkfront/blkfront.c Tue Jul 29 13:26:15 2008 +0100
+++ b/drivers/xen/blkfront/blkfront.c Tue Jul 29 16:16:31 2008 +0100
@@ -352,6 +352,13 @@ static void connect(struct blkfront_info
return;
}
+ err = xlvbd_sysfs_addif(info);
+ if (err) {
+ xenbus_dev_fatal(info->xbdev, err, "xlvbd_sysfs_addif at %s",
+ info->xbdev->otherend);
+ return;
+ }
+
(void)xenbus_switch_state(info->xbdev, XenbusStateConnected);
/* Kick pending requests. */
@@ -390,6 +397,8 @@ static void blkfront_closing(struct xenb
/* Flush gnttab callback work. Must be done with no locks held. */
flush_scheduled_work();
+
+ xlvbd_sysfs_delif(info);
xlvbd_del(info);
diff -r b8916f4d48f6 -r 1d647ef26f3f drivers/xen/blkfront/block.h
--- a/drivers/xen/blkfront/block.h Tue Jul 29 13:26:15 2008 +0100
+++ b/drivers/xen/blkfront/block.h Tue Jul 29 16:16:31 2008 +0100
@@ -140,4 +140,19 @@ void xlvbd_del(struct blkfront_info *inf
void xlvbd_del(struct blkfront_info *info);
int xlvbd_barrier(struct blkfront_info *info);
+#ifdef CONFIG_SYSFS
+int xlvbd_sysfs_addif(struct blkfront_info *info);
+void xlvbd_sysfs_delif(struct blkfront_info *info);
+#else
+static inline int xlvbd_sysfs_addif(struct blkfront_info *info)
+{
+ return 0;
+}
+
+static inline void xlvbd_sysfs_delif(struct blkfront_info *info)
+{
+ ;
+}
+#endif
+
#endif /* __XEN_DRIVERS_BLOCK_H__ */
diff -r b8916f4d48f6 -r 1d647ef26f3f drivers/xen/blkfront/vbd.c
--- a/drivers/xen/blkfront/vbd.c Tue Jul 29 13:26:15 2008 +0100
+++ b/drivers/xen/blkfront/vbd.c Tue Jul 29 16:16:31 2008 +0100
@@ -413,3 +413,48 @@ xlvbd_barrier(struct blkfront_info *info
return -ENOSYS;
}
#endif
+
+#ifdef CONFIG_SYSFS
+static ssize_t show_media(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct xenbus_device *xendev = to_xenbus_device(dev);
+ struct blkfront_info *info = xendev->dev.driver_data;
+
+ if (info->gd->flags & GENHD_FL_CD)
+ return sprintf(buf, "cdrom\n");
+ return sprintf(buf, "disk\n");
+}
+
+static struct device_attribute xlvbd_attrs[] = {
+ __ATTR(media, S_IRUGO, show_media, NULL),
+};
+
+int xlvbd_sysfs_addif(struct blkfront_info *info)
+{
+ int i;
+ int error = 0;
+
+ for (i = 0; i < ARRAY_SIZE(xlvbd_attrs); i++) {
+ error = device_create_file(info->gd->driverfs_dev,
+ &xlvbd_attrs[i]);
+ if (error)
+ goto fail;
+ }
+ return 0;
+
+fail:
+ while (--i >= 0)
+ device_remove_file(info->gd->driverfs_dev, &xlvbd_attrs[i]);
+ return error;
+}
+
+void xlvbd_sysfs_delif(struct blkfront_info *info)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(xlvbd_attrs); i++)
+ device_remove_file(info->gd->driverfs_dev, &xlvbd_attrs[i]);
+}
+
+#endif /* CONFIG_SYSFS */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|