Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f91bca8 authored by K. Y. Srinivasan's avatar K. Y. Srinivasan Committed by Greg Kroah-Hartman
Browse files

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: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: default avatarHank Janssen <hjanssen@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 487ae7cd
Loading
Loading
Loading
Loading
+68 −0
Original line number Diff line number Diff line
@@ -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
 */
+10 −0
Original line number Diff line number Diff line
@@ -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_ */