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@xxxxxxxxxxxxx> Signed-off-by: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx> Signed-off-by: Hank Janssen <hjanssen@xxxxxxxxxxxxx> --- drivers/staging/hv/storvsc.c | 68 ++++++++++++++++++++++++++++++++++++++ drivers/staging/hv/storvsc_api.h | 10 +++++ 2 files changed, 78 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index d7ce393..e2b3410 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -17,6 +17,8 @@ * Authors: * Haiyang Zhang <haiyangz@xxxxxxxxxxxxx> * Hank Janssen <hjanssen@xxxxxxxxxxxxx> + * + * 4/3/2011: K. Y. Srinivasan - Significant restructuring and cleanup. */ #include <linux/kernel.h> #include <linux/sched.h> @@ -593,6 +595,72 @@ int stor_vsc_on_io_request(struct hv_device *device, } /* + * 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 */ void stor_vsc_on_cleanup(struct hv_driver *driver) diff --git a/drivers/staging/hv/storvsc_api.h b/drivers/staging/hv/storvsc_api.h index d7db949..c98139c 100644 --- a/drivers/staging/hv/storvsc_api.h +++ b/drivers/staging/hv/storvsc_api.h @@ -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_ */ -- 1.7.4.1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel