Staging: hv: Introduce a function to map channel properties onto block device info
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>
This commit is contained in:
parent
487ae7cd55
commit
1f91bca8db
2 changed files with 78 additions and 0 deletions
|
@ -17,6 +17,8 @@
|
||||||
* Authors:
|
* Authors:
|
||||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||||
* Hank Janssen <hjanssen@microsoft.com>
|
* Hank Janssen <hjanssen@microsoft.com>
|
||||||
|
*
|
||||||
|
* 4/3/2011: K. Y. Srinivasan - Significant restructuring and cleanup.
|
||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
@ -592,6 +594,72 @@ int stor_vsc_on_io_request(struct hv_device *device,
|
||||||
return ret;
|
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
|
* stor_vsc_on_cleanup - Perform any cleanup when the driver is removed
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -92,6 +92,14 @@ struct storvsc_device_info {
|
||||||
unsigned char target_id;
|
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 */
|
/* A storvsc device is a device object that contains a vmbus channel */
|
||||||
struct storvsc_device {
|
struct storvsc_device {
|
||||||
struct hv_device *device;
|
struct hv_device *device;
|
||||||
|
@ -155,5 +163,7 @@ int stor_vsc_on_io_request(struct hv_device *device,
|
||||||
struct hv_storvsc_request *request);
|
struct hv_storvsc_request *request);
|
||||||
void stor_vsc_on_cleanup(struct hv_driver *driver);
|
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_ */
|
#endif /* _STORVSC_API_H_ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue