]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
Staging: hv: Introduce a function to map channel properties onto block device info
authorK. Y. Srinivasan <kys@microsoft.com>
Fri, 22 Apr 2011 21:55:25 +0000 (14:55 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 25 Apr 2011 23:22:58 +0000 (16:22 -0700)
In preparation for removing the IDE details from the block driver, implement
a function that maps channel properties to block device information.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/hv/storvsc.c
drivers/staging/hv/storvsc_api.h

index d7ce3933b1dbd8bf634c4da1d44c2f6eb3a5cd57..e2b3410c79090516965f5d1be4245c0b125dc1e0 100644 (file)
@@ -17,6 +17,8 @@
  * Authors:
  *   Haiyang Zhang <haiyangz@microsoft.com>
  *   Hank Janssen  <hjanssen@microsoft.com>
+ *
+ * 4/3/2011: K. Y. Srinivasan - Significant restructuring and cleanup.
  */
 #include <linux/kernel.h>
 #include <linux/sched.h>
@@ -592,6 +594,72 @@ int stor_vsc_on_io_request(struct hv_device *device,
        return ret;
 }
 
+/*
+ * The channel properties uniquely specify how the device is to be
+ * presented to the guest. Map this information for use by the block
+ * driver. For Linux guests on Hyper-V, we emulate a scsi HBA in the guest
+ * (storvsc_drv) and so scsi devices in the guest  are handled by
+ * native upper level Linux drivers. Consequently, Hyper-V
+ * block driver, while being a generic block driver, presently does not
+ * deal with anything other than devices that would need to be presented
+ * to the guest as an IDE disk.
+ *
+ * This function maps the channel properties as embedded in the input
+ * parameter device_info onto information necessary to register the
+ * corresponding block device.
+ *
+ * Currently, there is no way to stop the emulation of the block device
+ * on the host side. And so, to prevent the native IDE drivers in Linux
+ * from taking over these devices (to be managedby Hyper-V block
+ * driver), we will take over if need be the major of the IDE controllers.
+ *
+ */
+
+int stor_vsc_get_major_info(struct storvsc_device_info *device_info,
+                           struct storvsc_major_info *major_info)
+{
+       static bool ide0_registered;
+       static bool ide1_registered;
+
+       /*
+        * For now we only support IDE disks.
+        */
+       major_info->devname = "ide";
+       major_info->diskname = "hd";
+
+       if (device_info->path_id) {
+               major_info->major = 22;
+               if (!ide1_registered)
+                       major_info->do_register = true;
+               else {
+                       major_info->do_register = false;
+                       ide1_registered = true;
+               }
+               if (device_info->target_id)
+                       major_info->index = 3;
+                else
+                       major_info->index = 2;
+
+               return 0;
+       } else {
+               major_info->major = 3;
+               if (!ide0_registered)
+                       major_info->do_register = true;
+               else {
+                       major_info->do_register = false;
+                       ide0_registered = true;
+               }
+               if (device_info->target_id)
+                       major_info->index = 1;
+               else
+                       major_info->index = 0;
+
+               return 0;
+       }
+
+       return -ENODEV;
+}
+
 /*
  * stor_vsc_on_cleanup - Perform any cleanup when the driver is removed
  */
index d7db94929494273d16e151aca9c5c3f1acff59f6..c98139cc7baf978ead3bcb32ab2589e3d4108526 100644 (file)
@@ -92,6 +92,14 @@ struct storvsc_device_info {
        unsigned char target_id;
 };
 
+struct storvsc_major_info {
+       int major;
+       int index;
+       bool do_register;
+       char *devname;
+       char *diskname;
+};
+
 /* A storvsc device is a device object that contains a vmbus channel */
 struct storvsc_device {
        struct hv_device *device;
@@ -155,5 +163,7 @@ int stor_vsc_on_io_request(struct hv_device *device,
                                struct hv_storvsc_request *request);
 void stor_vsc_on_cleanup(struct hv_driver *driver);
 
+int stor_vsc_get_major_info(struct storvsc_device_info *device_info,
+                               struct storvsc_major_info *major_info);
 
 #endif /* _STORVSC_API_H_ */