linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/22] Staging: hv: Cleanup storage drivers - Phase IV
@ 2011-04-04 22:46 K. Y. Srinivasan
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
  0 siblings, 1 reply; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:46 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization; +Cc: K. Y. Srinivasan


More cleanup. In this patch-set we deal with the following issues:

	1) While a Linux guest on Hyper-V can be assigned removable media
	   devices (DVD, floppy etc), these devices are not handled by the
	   Hyper-V block driver. So, we cleanup all the dead code
	   dealing with removable media devices.

	2) There were multiple functions to retrieve information about 
	   the device. Since much of the code in these functions were
	   identical, we have consolidated these functions into a single
	   function.

	3) Enable the ioctl code for handling HDIO_GET_IDENTITY

	4) Cleanup the code for getting the geometry.

	5) Cleanup code for retreiving device capacity; this has also fixed
	   a bug with regards to presenting physical disks to the guest
	   as an IDE disk.

	6) General cleanup: simplify blkvsc_init_rw(), get rid of 
	   unnecessary DPRINT*() calls, get rid of unnecessary code,
	   cleanup blkvsc_open().

	7) Remove all IDE details from blkvsc_drv.c.

Regards,

K. Y

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed()
  2011-04-04 22:46 [PATCH 00/22] Staging: hv: Cleanup storage drivers - Phase IV K. Y. Srinivasan
@ 2011-04-04 22:47 ` K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 02/22] Staging: hv: Enable blkvsc_ioctl() K. Y. Srinivasan
                     ` (20 more replies)
  0 siblings, 21 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

We don't support removable media in Hyper-V block driver.
Get rid of blkvsc_media_changed() as it is efectively "dead code".

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>
---
 drivers/staging/hv/blkvsc_drv.c |    7 -------
 1 files changed, 0 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 9faccbe..1203049 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -251,12 +251,6 @@ static int blkvsc_submit_request(struct blkvsc_request *blkvsc_req,
 	return ret;
 }
 
-static int blkvsc_media_changed(struct gendisk *gd)
-{
-	DPRINT_DBG(BLKVSC_DRV, "- enter\n");
-	return 1;
-}
-
 static int blkvsc_open(struct block_device *bdev, fmode_t mode)
 {
 	struct block_device_context *blkdev = bdev->bd_disk->private_data;
@@ -1206,7 +1200,6 @@ static const struct block_device_operations block_ops = {
 	.owner = THIS_MODULE,
 	.open = blkvsc_open,
 	.release = blkvsc_release,
-	.media_changed = blkvsc_media_changed,
 	.revalidate_disk = blkvsc_revalidate_disk,
 	.getgeo = blkvsc_getgeo,
 	.ioctl  = blkvsc_ioctl,
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 02/22] Staging: hv: Enable blkvsc_ioctl()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
@ 2011-04-04 22:47   ` K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 03/22] Staging: hv: Simplify the code for blkvsc_getgeo() K. Y. Srinivasan
                     ` (19 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

We can support HDIO_GET_IDENTITY ioctl, enable blkvsc_ioctl(). 

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>
---
 drivers/staging/hv/blkvsc_drv.c |   11 +++--------
 1 files changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 1203049..12a9083 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -412,23 +412,18 @@ static void blkvsc_init_rw(struct blkvsc_request *blkvsc_req)
 
 
 static int blkvsc_ioctl(struct block_device *bd, fmode_t mode,
-			unsigned cmd, unsigned long argument)
+			unsigned cmd, unsigned long arg)
 {
-	int ret;
+	struct block_device_context *blkdev = bd->bd_disk->private_data;
+	int ret = 0;
 
 	switch (cmd) {
-	/*
-	 * TODO: I think there is certain format for HDIO_GET_IDENTITY rather
-	 * than just a GUID. Commented it out for now.
-	 */
-#if 0
 	case HDIO_GET_IDENTITY:
 		DPRINT_INFO(BLKVSC_DRV, "HDIO_GET_IDENTITY\n");
 		if (copy_to_user((void __user *)arg, blkdev->device_id,
 				 blkdev->device_id_len))
 			ret = -EFAULT;
 		break;
-#endif
 	default:
 		ret = -EINVAL;
 		break;
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 03/22] Staging: hv: Simplify the code for blkvsc_getgeo()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 02/22] Staging: hv: Enable blkvsc_ioctl() K. Y. Srinivasan
@ 2011-04-04 22:47   ` K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 04/22] Staging: hv: Introduce a common function for issuing commands to the device K. Y. Srinivasan
                     ` (18 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

We are making up the geometry anyway, keep it simple.

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>
---
 drivers/staging/hv/blkvsc_drv.c |   84 +++++---------------------------------
 1 files changed, 11 insertions(+), 73 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 12a9083..ad09917 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -277,82 +277,20 @@ static int blkvsc_open(struct block_device *bdev, fmode_t mode)
 
 static int blkvsc_getgeo(struct block_device *bd, struct hd_geometry *hg)
 {
-	sector_t total_sectors = get_capacity(bd->bd_disk);
-	sector_t cylinder_times_heads = 0;
-	sector_t temp = 0;
+	sector_t nsect = get_capacity(bd->bd_disk);
+	sector_t cylinders = nsect;
 
-	int sectors_per_track = 0;
-	int heads = 0;
-	int cylinders = 0;
-	int rem = 0;
-
-	if (total_sectors > (65535 * 16 * 255))
-		total_sectors = (65535 * 16 * 255);
-
-	if (total_sectors >= (65535 * 16 * 63)) {
-		sectors_per_track = 255;
-		heads = 16;
-
-		cylinder_times_heads = total_sectors;
-		/* sector_div stores the quotient in cylinder_times_heads */
-		rem = sector_div(cylinder_times_heads, sectors_per_track);
-	} else {
-		sectors_per_track = 17;
-
-		cylinder_times_heads = total_sectors;
-		/* sector_div stores the quotient in cylinder_times_heads */
-		rem = sector_div(cylinder_times_heads, sectors_per_track);
-
-		temp = cylinder_times_heads + 1023;
-		/* sector_div stores the quotient in temp */
-		rem = sector_div(temp, 1024);
-
-		heads = temp;
-
-		if (heads < 4)
-			heads = 4;
-
-
-		if (cylinder_times_heads >= (heads * 1024) || (heads > 16)) {
-			sectors_per_track = 31;
-			heads = 16;
-
-			cylinder_times_heads = total_sectors;
-			/*
-			 * sector_div stores the quotient in
-			 * cylinder_times_heads
-			 */
-			rem = sector_div(cylinder_times_heads,
-					 sectors_per_track);
-		}
-
-		if (cylinder_times_heads >= (heads * 1024)) {
-			sectors_per_track = 63;
-			heads = 16;
-
-			cylinder_times_heads = total_sectors;
-			/*
-			 * sector_div stores the quotient in
-			 * cylinder_times_heads
-			 */
-			rem = sector_div(cylinder_times_heads,
-					 sectors_per_track);
-		}
-	}
-
-	temp = cylinder_times_heads;
-	/* sector_div stores the quotient in temp */
-	rem = sector_div(temp, heads);
-	cylinders = temp;
-
-	hg->heads = heads;
-	hg->sectors = sectors_per_track;
+	/*
+	 * We are making up these values; let us keep it simple.
+	 */
+	hg->heads = 0xff;
+	hg->sectors = 0x3f;
+	sector_div(cylinders, hg->heads * hg->sectors);
 	hg->cylinders = cylinders;
-
-	DPRINT_INFO(BLKVSC_DRV, "CHS (%d, %d, %d)", cylinders, heads,
-		    sectors_per_track);
-
+	if ((sector_t)(hg->cylinders + 1) * hg->heads * hg->sectors < nsect)
+		hg->cylinders = 0xffff;
 	return 0;
+
 }
 
 
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 04/22] Staging: hv: Introduce a common function for issuing commands to the device
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 02/22] Staging: hv: Enable blkvsc_ioctl() K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 03/22] Staging: hv: Simplify the code for blkvsc_getgeo() K. Y. Srinivasan
@ 2011-04-04 22:47   ` K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 05/22] Staging: hv: Get rid of blkvsc_do_read_capacity() K. Y. Srinivasan
                     ` (17 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

There are multiple functions to either get info about the device
(INQUIRY, CAPACITY etc) or to FLUSH the device cache. The majority of the 
code for these functions is identical. Introduce a common function for
doing all these operations.

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>
---
 drivers/staging/hv/blkvsc_drv.c |  163 ++++++++++++++++++++------------------
 1 files changed, 86 insertions(+), 77 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index ad09917..8094c5e 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -46,6 +46,10 @@ enum blkvsc_device_type {
 	DVD_TYPE,
 };
 
+enum blkvsc_op_type {
+	DO_INQUIRY,
+};
+
 /*
  * This request ties the struct request and struct
  * blkvsc_request/hv_storvsc_request together A struct request may be
@@ -393,6 +397,86 @@ static void blkvsc_cmd_completion(struct hv_storvsc_request *request)
 	complete(&blkvsc_req->request.wait_event);
 }
 
+
+static int blkvsc_do_operation(struct block_device_context *blkdev,
+				enum blkvsc_op_type op)
+{
+	struct blkvsc_request *blkvsc_req;
+	struct page *page_buf;
+	unsigned char *buf;
+	unsigned char device_type;
+	int ret = 0;
+
+	blkvsc_req = kmem_cache_zalloc(blkdev->request_pool, GFP_KERNEL);
+	if (!blkvsc_req)
+		return -ENOMEM;
+
+	page_buf = alloc_page(GFP_KERNEL);
+	if (!page_buf) {
+		kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
+		return -ENOMEM;
+	}
+
+	init_completion(&blkvsc_req->request.wait_event);
+	blkvsc_req->dev = blkdev;
+	blkvsc_req->req = NULL;
+	blkvsc_req->write = 0;
+
+	blkvsc_req->request.data_buffer.pfn_array[0] =
+	page_to_pfn(page_buf);
+	blkvsc_req->request.data_buffer.offset = 0;
+
+	switch (op) {
+	case DO_INQUIRY:
+		blkvsc_req->cmnd[0] = INQUIRY;
+		blkvsc_req->cmnd[1] = 0x1;		/* Get product data */
+		blkvsc_req->cmnd[2] = 0x83;		/* mode page 83 */
+		blkvsc_req->cmnd[4] = 64;
+		blkvsc_req->cmd_len = 6;
+		blkvsc_req->request.data_buffer.len = 64;
+		break;
+
+	default:
+		ret = -EINVAL;
+		goto cleanup;
+	}
+
+	blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
+
+	wait_for_completion_interruptible(&blkvsc_req->request.wait_event);
+
+	buf = kmap(page_buf);
+
+	switch (op) {
+	case DO_INQUIRY:
+		device_type = buf[0] & 0x1F;
+
+		if (device_type == 0x0)
+			blkdev->device_type = HARDDISK_TYPE;
+		 else if (device_type == 0x5)
+			blkdev->device_type = DVD_TYPE;
+		 else
+			blkdev->device_type = UNKNOWN_DEV_TYPE;
+
+		blkdev->device_id_len = buf[7];
+		if (blkdev->device_id_len > 64)
+			blkdev->device_id_len = 64;
+
+		memcpy(blkdev->device_id, &buf[8], blkdev->device_id_len);
+		break;
+	}
+
+cleanup:
+
+	kunmap(page_buf);
+
+	__free_page(page_buf);
+
+	kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
+
+	return ret;
+}
+
 static int blkvsc_do_flush(struct block_device_context *blkdev)
 {
 	struct blkvsc_request *blkvsc_req;
@@ -798,82 +882,6 @@ static int blkvsc_revalidate_disk(struct gendisk *gd)
 }
 
 
-/* Do a scsi INQUIRY cmd here to get the device type (ie disk or dvd) */
-static int blkvsc_do_inquiry(struct block_device_context *blkdev)
-{
-	struct blkvsc_request *blkvsc_req;
-	struct page *page_buf;
-	unsigned char *buf;
-	unsigned char device_type;
-
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_do_inquiry()\n");
-
-	blkvsc_req = kmem_cache_zalloc(blkdev->request_pool, GFP_KERNEL);
-	if (!blkvsc_req)
-		return -ENOMEM;
-
-	memset(blkvsc_req, 0, sizeof(struct blkvsc_request));
-	page_buf = alloc_page(GFP_KERNEL);
-	if (!page_buf) {
-		kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
-		return -ENOMEM;
-	}
-
-	init_completion(&blkvsc_req->request.wait_event);
-	blkvsc_req->dev = blkdev;
-	blkvsc_req->req = NULL;
-	blkvsc_req->write = 0;
-
-	blkvsc_req->request.data_buffer.pfn_array[0] =
-	page_to_pfn(page_buf);
-	blkvsc_req->request.data_buffer.offset = 0;
-	blkvsc_req->request.data_buffer.len = 64;
-
-	blkvsc_req->cmnd[0] = INQUIRY;
-	blkvsc_req->cmnd[1] = 0x1;		/* Get product data */
-	blkvsc_req->cmnd[2] = 0x83;		/* mode page 83 */
-	blkvsc_req->cmnd[4] = 64;
-	blkvsc_req->cmd_len = 6;
-
-	blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
-
-	DPRINT_DBG(BLKVSC_DRV, "waiting %p to complete\n",
-		   blkvsc_req);
-
-	wait_for_completion_interruptible(&blkvsc_req->request.wait_event);
-
-	buf = kmap(page_buf);
-
-	/* be to le */
-	device_type = buf[0] & 0x1F;
-
-	if (device_type == 0x0) {
-		blkdev->device_type = HARDDISK_TYPE;
-	} else if (device_type == 0x5) {
-		blkdev->device_type = DVD_TYPE;
-	} else {
-		/* TODO: this is currently unsupported device type */
-		blkdev->device_type = UNKNOWN_DEV_TYPE;
-	}
-
-	DPRINT_DBG(BLKVSC_DRV, "device type %d\n", device_type);
-
-	blkdev->device_id_len = buf[7];
-	if (blkdev->device_id_len > 64)
-		blkdev->device_id_len = 64;
-
-	memcpy(blkdev->device_id, &buf[8], blkdev->device_id_len);
-
-	kunmap(page_buf);
-
-	__free_page(page_buf);
-
-	kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
-
-	return 0;
-}
-
-
 /*
  * We break the request into 1 or more blkvsc_requests and submit
  * them.  If we cant submit them all, we put them on the
@@ -1126,6 +1134,7 @@ static void blkvsc_request(struct request_queue *queue)
 }
 
 
+
 /* The one and only one */
 static  struct storvsc_driver_object g_blkvsc_drv;
 
@@ -1335,7 +1344,7 @@ static int blkvsc_probe(struct device *device)
 	blkdev->gd->driverfs_dev = &(blkdev->device_ctx->device);
 	sprintf(blkdev->gd->disk_name, "hd%c", 'a' + devnum);
 
-	blkvsc_do_inquiry(blkdev);
+	blkvsc_do_operation(blkdev, DO_INQUIRY);
 	if (blkdev->device_type == DVD_TYPE) {
 		set_disk_ro(blkdev->gd, 1);
 		blkdev->gd->flags |= GENHD_FL_REMOVABLE;
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 05/22] Staging: hv: Get rid of blkvsc_do_read_capacity()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (2 preceding siblings ...)
  2011-04-04 22:47   ` [PATCH 04/22] Staging: hv: Introduce a common function for issuing commands to the device K. Y. Srinivasan
@ 2011-04-04 22:47   ` K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 06/22] Staging: hv: Get rid of blkvsc_do_read_capacity16() K. Y. Srinivasan
                     ` (16 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Now that we have a common function for some of the operations on the device,
use that and get rid of the function blkvsc_do_read_capacity().

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>
---
 drivers/staging/hv/blkvsc_drv.c |  117 +++++++++++++--------------------------
 1 files changed, 39 insertions(+), 78 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 8094c5e..925b898 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -48,6 +48,7 @@ enum blkvsc_device_type {
 
 enum blkvsc_op_type {
 	DO_INQUIRY,
+	DO_CAPACITY,
 };
 
 /*
@@ -405,6 +406,9 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 	struct page *page_buf;
 	unsigned char *buf;
 	unsigned char device_type;
+	struct scsi_sense_hdr sense_hdr;
+	struct vmscsi_request *vm_srb;
+
 	int ret = 0;
 
 	blkvsc_req = kmem_cache_zalloc(blkdev->request_pool, GFP_KERNEL);
@@ -417,6 +421,7 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 		return -ENOMEM;
 	}
 
+	vm_srb = &blkvsc_req->request.vstor_packet.vm_srb;
 	init_completion(&blkvsc_req->request.wait_event);
 	blkvsc_req->dev = blkdev;
 	blkvsc_req->req = NULL;
@@ -436,6 +441,15 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 		blkvsc_req->request.data_buffer.len = 64;
 		break;
 
+	case DO_CAPACITY:
+		blkdev->sector_size = 0;
+		blkdev->capacity = 0;
+		blkdev->media_not_present = 0; /* assume a disk is present */
+
+		blkvsc_req->cmnd[0] = READ_CAPACITY;
+		blkvsc_req->cmd_len = 16;
+		blkvsc_req->request.data_buffer.len = 8;
+		break;
 	default:
 		ret = -EINVAL;
 		goto cleanup;
@@ -445,6 +459,18 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 
 	wait_for_completion_interruptible(&blkvsc_req->request.wait_event);
 
+	/* check error */
+	if (vm_srb->scsi_status) {
+		scsi_normalize_sense(blkvsc_req->sense_buffer,
+				     SCSI_SENSE_BUFFERSIZE, &sense_hdr);
+
+		if (sense_hdr.asc == 0x3A)
+			/* Medium not present */
+			blkdev->media_not_present = 1;
+
+		return 0;
+	}
+
 	buf = kmap(page_buf);
 
 	switch (op) {
@@ -464,6 +490,17 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 
 		memcpy(blkdev->device_id, &buf[8], blkdev->device_id_len);
 		break;
+
+	case DO_CAPACITY:
+		/* be to le */
+		blkdev->capacity =
+		((buf[0] << 24) | (buf[1] << 16) |
+		(buf[2] << 8) | buf[3]) + 1;
+
+		blkdev->sector_size =
+		(buf[4] << 24) | (buf[5] << 16) |
+		(buf[6] << 8) | buf[7];
+		break;
 	}
 
 cleanup:
@@ -714,82 +751,6 @@ static int blkvsc_release(struct gendisk *disk, fmode_t mode)
 }
 
 
-/* Do a scsi READ_CAPACITY cmd here to get the size of the disk */
-static int blkvsc_do_read_capacity(struct block_device_context *blkdev)
-{
-	struct blkvsc_request *blkvsc_req;
-	struct page *page_buf;
-	unsigned char *buf;
-	struct scsi_sense_hdr sense_hdr;
-	struct vmscsi_request *vm_srb;
-
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_do_read_capacity()\n");
-
-	blkdev->sector_size = 0;
-	blkdev->capacity = 0;
-	blkdev->media_not_present = 0; /* assume a disk is present */
-
-	blkvsc_req = kmem_cache_zalloc(blkdev->request_pool, GFP_KERNEL);
-	if (!blkvsc_req)
-		return -ENOMEM;
-
-	memset(blkvsc_req, 0, sizeof(struct blkvsc_request));
-	page_buf = alloc_page(GFP_KERNEL);
-	if (!page_buf) {
-		kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
-		return -ENOMEM;
-	}
-
-	vm_srb = &blkvsc_req->request.vstor_packet.vm_srb;
-	init_completion(&blkvsc_req->request.wait_event);
-	blkvsc_req->dev = blkdev;
-	blkvsc_req->req = NULL;
-	blkvsc_req->write = 0;
-
-	blkvsc_req->request.data_buffer.pfn_array[0] =
-	page_to_pfn(page_buf);
-	blkvsc_req->request.data_buffer.offset = 0;
-	blkvsc_req->request.data_buffer.len = 8;
-
-	blkvsc_req->cmnd[0] = READ_CAPACITY;
-	blkvsc_req->cmd_len = 16;
-
-	blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
-
-	DPRINT_DBG(BLKVSC_DRV, "waiting %p to complete\n",
-		   blkvsc_req);
-
-	wait_for_completion_interruptible(&blkvsc_req->request.wait_event);
-
-	/* check error */
-	if (vm_srb->scsi_status) {
-		scsi_normalize_sense(blkvsc_req->sense_buffer,
-				     SCSI_SENSE_BUFFERSIZE, &sense_hdr);
-
-		if (sense_hdr.asc == 0x3A) {
-			/* Medium not present */
-			blkdev->media_not_present = 1;
-		}
-		return 0;
-	}
-	buf = kmap(page_buf);
-
-	/* be to le */
-	blkdev->capacity = ((buf[0] << 24) | (buf[1] << 16) |
-			    (buf[2] << 8) | buf[3]) + 1;
-	blkdev->sector_size = (buf[4] << 24) | (buf[5] << 16) |
-			      (buf[6] << 8) | buf[7];
-
-	kunmap(page_buf);
-
-	__free_page(page_buf);
-
-	kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
-
-	return 0;
-}
-
-
 static int blkvsc_do_read_capacity16(struct block_device_context *blkdev)
 {
 	struct blkvsc_request *blkvsc_req;
@@ -873,7 +834,7 @@ static int blkvsc_revalidate_disk(struct gendisk *gd)
 	DPRINT_DBG(BLKVSC_DRV, "- enter\n");
 
 	if (blkdev->device_type == DVD_TYPE) {
-		blkvsc_do_read_capacity(blkdev);
+		blkvsc_do_operation(blkdev, DO_CAPACITY);
 		set_capacity(blkdev->gd, blkdev->capacity *
 			    (blkdev->sector_size/512));
 		blk_queue_logical_block_size(gd->queue, blkdev->sector_size);
@@ -1348,7 +1309,7 @@ static int blkvsc_probe(struct device *device)
 	if (blkdev->device_type == DVD_TYPE) {
 		set_disk_ro(blkdev->gd, 1);
 		blkdev->gd->flags |= GENHD_FL_REMOVABLE;
-		blkvsc_do_read_capacity(blkdev);
+		blkvsc_do_operation(blkdev, DO_CAPACITY);
 	} else {
 		blkvsc_do_read_capacity16(blkdev);
 	}
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 06/22] Staging: hv: Get rid of blkvsc_do_read_capacity16()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (3 preceding siblings ...)
  2011-04-04 22:47   ` [PATCH 05/22] Staging: hv: Get rid of blkvsc_do_read_capacity() K. Y. Srinivasan
@ 2011-04-04 22:47   ` K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 07/22] Staging: hv: Get rid of the function blkvsc_do_flush() K. Y. Srinivasan
                     ` (15 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Get rid of blkvsc_do_read_capacity16() and instead use the common function
for retrieving capacity.

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>
---
 drivers/staging/hv/blkvsc_drv.c |   81 +--------------------------------------
 1 files changed, 2 insertions(+), 79 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 925b898..4da42c9 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -751,82 +751,6 @@ static int blkvsc_release(struct gendisk *disk, fmode_t mode)
 }
 
 
-static int blkvsc_do_read_capacity16(struct block_device_context *blkdev)
-{
-	struct blkvsc_request *blkvsc_req;
-	struct page *page_buf;
-	unsigned char *buf;
-	struct scsi_sense_hdr sense_hdr;
-	struct vmscsi_request *vm_srb;
-
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_do_read_capacity16()\n");
-
-	blkdev->sector_size = 0;
-	blkdev->capacity = 0;
-	blkdev->media_not_present = 0; /* assume a disk is present */
-
-	blkvsc_req = kmem_cache_zalloc(blkdev->request_pool, GFP_KERNEL);
-	if (!blkvsc_req)
-		return -ENOMEM;
-
-	memset(blkvsc_req, 0, sizeof(struct blkvsc_request));
-	vm_srb = &blkvsc_req->request.vstor_packet.vm_srb;
-	page_buf = alloc_page(GFP_KERNEL);
-	if (!page_buf) {
-		kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
-		return -ENOMEM;
-	}
-
-	init_completion(&blkvsc_req->request.wait_event);
-	blkvsc_req->dev = blkdev;
-	blkvsc_req->req = NULL;
-	blkvsc_req->write = 0;
-
-	blkvsc_req->request.data_buffer.pfn_array[0] =
-	page_to_pfn(page_buf);
-	blkvsc_req->request.data_buffer.offset = 0;
-	blkvsc_req->request.data_buffer.len = 12;
-
-	blkvsc_req->cmnd[0] = 0x9E; /* READ_CAPACITY16; */
-	blkvsc_req->cmd_len = 16;
-
-	/*
-	 * Set this here since the completion routine may be invoked
-	 * and completed before we return
-	 */
-
-	blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
-
-	DPRINT_DBG(BLKVSC_DRV, "waiting %p to complete\n",
-		   blkvsc_req);
-
-	wait_for_completion_interruptible(&blkvsc_req->request.wait_event);
-
-	/* check error */
-	if (vm_srb->scsi_status) {
-		scsi_normalize_sense(blkvsc_req->sense_buffer,
-				     SCSI_SENSE_BUFFERSIZE, &sense_hdr);
-		if (sense_hdr.asc == 0x3A) {
-			/* Medium not present */
-			blkdev->media_not_present = 1;
-		}
-		return 0;
-	}
-	buf = kmap(page_buf);
-
-	/* be to le */
-	blkdev->capacity = be64_to_cpu(*(unsigned long long *) &buf[0]) + 1;
-	blkdev->sector_size = be32_to_cpu(*(unsigned int *)&buf[8]);
-
-	kunmap(page_buf);
-
-	__free_page(page_buf);
-
-	kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
-
-	return 0;
-}
-
 static int blkvsc_revalidate_disk(struct gendisk *gd)
 {
 	struct block_device_context *blkdev = gd->private_data;
@@ -1310,9 +1234,8 @@ static int blkvsc_probe(struct device *device)
 		set_disk_ro(blkdev->gd, 1);
 		blkdev->gd->flags |= GENHD_FL_REMOVABLE;
 		blkvsc_do_operation(blkdev, DO_CAPACITY);
-	} else {
-		blkvsc_do_read_capacity16(blkdev);
-	}
+	} else
+		blkvsc_do_operation(blkdev, DO_CAPACITY);
 
 	set_capacity(blkdev->gd, blkdev->capacity * (blkdev->sector_size/512));
 	blk_queue_logical_block_size(blkdev->gd->queue, blkdev->sector_size);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 07/22] Staging: hv: Get rid of the function blkvsc_do_flush()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (4 preceding siblings ...)
  2011-04-04 22:47   ` [PATCH 06/22] Staging: hv: Get rid of blkvsc_do_read_capacity16() K. Y. Srinivasan
@ 2011-04-04 22:47   ` K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 08/22] Staging hv: Get rid of the state media_not_present K. Y. Srinivasan
                     ` (14 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Get rid of the function blkvsc_do_flush() and instead use the common function
to force a device flush.

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>
---
 drivers/staging/hv/blkvsc_drv.c |   52 ++++++++++----------------------------
 1 files changed, 14 insertions(+), 38 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 4da42c9..0715cba 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -49,6 +49,7 @@ enum blkvsc_device_type {
 enum blkvsc_op_type {
 	DO_INQUIRY,
 	DO_CAPACITY,
+	DO_FLUSH,
 };
 
 /*
@@ -450,6 +451,13 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 		blkvsc_req->cmd_len = 16;
 		blkvsc_req->request.data_buffer.len = 8;
 		break;
+
+	case DO_FLUSH:
+		blkvsc_req->cmnd[0] = SYNCHRONIZE_CACHE;
+		blkvsc_req->cmd_len = 10;
+		blkvsc_req->request.data_buffer.pfn_array[0] = 0;
+		blkvsc_req->request.data_buffer.len = 0;
+		break;
 	default:
 		ret = -EINVAL;
 		goto cleanup;
@@ -501,6 +509,9 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 		(buf[4] << 24) | (buf[5] << 16) |
 		(buf[6] << 8) | buf[7];
 		break;
+	default:
+		break;
+
 	}
 
 cleanup:
@@ -514,41 +525,6 @@ cleanup:
 	return ret;
 }
 
-static int blkvsc_do_flush(struct block_device_context *blkdev)
-{
-	struct blkvsc_request *blkvsc_req;
-
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_do_flush()\n");
-
-	if (blkdev->device_type != HARDDISK_TYPE)
-		return 0;
-
-	blkvsc_req = kmem_cache_zalloc(blkdev->request_pool, GFP_KERNEL);
-	if (!blkvsc_req)
-		return -ENOMEM;
-
-	memset(blkvsc_req, 0, sizeof(struct blkvsc_request));
-	init_completion(&blkvsc_req->request.wait_event);
-	blkvsc_req->dev = blkdev;
-	blkvsc_req->req = NULL;
-	blkvsc_req->write = 0;
-
-	blkvsc_req->request.data_buffer.pfn_array[0] = 0;
-	blkvsc_req->request.data_buffer.offset = 0;
-	blkvsc_req->request.data_buffer.len = 0;
-
-	blkvsc_req->cmnd[0] = SYNCHRONIZE_CACHE;
-	blkvsc_req->cmd_len = 10;
-
-	blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
-
-	wait_for_completion_interruptible(&blkvsc_req->request.wait_event);
-
-	kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
-
-	return 0;
-}
-
 
 static int blkvsc_cancel_pending_reqs(struct block_device_context *blkdev)
 {
@@ -675,7 +651,7 @@ static int blkvsc_remove(struct device *device)
 		udelay(100);
 	}
 
-	blkvsc_do_flush(blkdev);
+	blkvsc_do_operation(blkdev, DO_FLUSH);
 
 	spin_lock_irqsave(&blkdev->lock, flags);
 
@@ -719,7 +695,7 @@ static void blkvsc_shutdown(struct device *device)
 		udelay(100);
 	}
 
-	blkvsc_do_flush(blkdev);
+	blkvsc_do_operation(blkdev, DO_FLUSH);
 
 	spin_lock_irqsave(&blkdev->lock, flags);
 
@@ -739,7 +715,7 @@ static int blkvsc_release(struct gendisk *disk, fmode_t mode)
 	spin_lock(&blkdev->lock);
 	if (blkdev->users == 1) {
 		spin_unlock(&blkdev->lock);
-		blkvsc_do_flush(blkdev);
+		blkvsc_do_operation(blkdev, DO_FLUSH);
 		spin_lock(&blkdev->lock);
 	}
 
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 08/22] Staging hv: Get rid of the state media_not_present
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (5 preceding siblings ...)
  2011-04-04 22:47   ` [PATCH 07/22] Staging: hv: Get rid of the function blkvsc_do_flush() K. Y. Srinivasan
@ 2011-04-04 22:47   ` K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 09/22] Staging: hv: Get rid of the function blkvsc_revalidate_disk() K. Y. Srinivasan
                     ` (13 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

The block driver in Hyper-V does not handle removable media, get rid of the
media_not_present state.

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>
---
 drivers/staging/hv/blkvsc_drv.c |    9 +--------
 1 files changed, 1 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 0715cba..1ea5f9c 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -103,7 +103,6 @@ struct block_device_context {
 	unsigned int device_id_len;
 	int num_outstanding_reqs;
 	int shutting_down;
-	int media_not_present;
 	unsigned int sector_size;
 	sector_t capacity;
 	unsigned int port;
@@ -445,7 +444,6 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 	case DO_CAPACITY:
 		blkdev->sector_size = 0;
 		blkdev->capacity = 0;
-		blkdev->media_not_present = 0; /* assume a disk is present */
 
 		blkvsc_req->cmnd[0] = READ_CAPACITY;
 		blkvsc_req->cmd_len = 16;
@@ -472,10 +470,6 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 		scsi_normalize_sense(blkvsc_req->sense_buffer,
 				     SCSI_SENSE_BUFFERSIZE, &sense_hdr);
 
-		if (sense_hdr.asc == 0x3A)
-			/* Medium not present */
-			blkdev->media_not_present = 1;
-
 		return 0;
 	}
 
@@ -963,8 +957,7 @@ static void blkvsc_request(struct request_queue *queue)
 		DPRINT_DBG(BLKVSC_DRV, "- req %p\n", req);
 
 		blkdev = req->rq_disk->private_data;
-		if (blkdev->shutting_down || req->cmd_type != REQ_TYPE_FS ||
-		    blkdev->media_not_present) {
+		if (blkdev->shutting_down || req->cmd_type != REQ_TYPE_FS) {
 			__blk_end_request_cur(req, 0);
 			continue;
 		}
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 09/22] Staging: hv: Get rid of the function blkvsc_revalidate_disk()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (6 preceding siblings ...)
  2011-04-04 22:47   ` [PATCH 08/22] Staging hv: Get rid of the state media_not_present K. Y. Srinivasan
@ 2011-04-04 22:47   ` K. Y. Srinivasan
  2011-04-04 22:47   ` [PATCH 10/22] Staging: hv: Simplify blkvsc_init_rw K. Y. Srinivasan
                     ` (12 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

The block driver in Hyper-V does not support removable media, get rid of the 
blkvsc_revalidate_disk().

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>
---
 drivers/staging/hv/blkvsc_drv.c |   17 -----------------
 1 files changed, 0 insertions(+), 17 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 1ea5f9c..da7fd38 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -721,22 +721,6 @@ static int blkvsc_release(struct gendisk *disk, fmode_t mode)
 }
 
 
-static int blkvsc_revalidate_disk(struct gendisk *gd)
-{
-	struct block_device_context *blkdev = gd->private_data;
-
-	DPRINT_DBG(BLKVSC_DRV, "- enter\n");
-
-	if (blkdev->device_type == DVD_TYPE) {
-		blkvsc_do_operation(blkdev, DO_CAPACITY);
-		set_capacity(blkdev->gd, blkdev->capacity *
-			    (blkdev->sector_size/512));
-		blk_queue_logical_block_size(gd->queue, blkdev->sector_size);
-	}
-	return 0;
-}
-
-
 /*
  * We break the request into 1 or more blkvsc_requests and submit
  * them.  If we cant submit them all, we put them on the
@@ -996,7 +980,6 @@ static const struct block_device_operations block_ops = {
 	.owner = THIS_MODULE,
 	.open = blkvsc_open,
 	.release = blkvsc_release,
-	.revalidate_disk = blkvsc_revalidate_disk,
 	.getgeo = blkvsc_getgeo,
 	.ioctl  = blkvsc_ioctl,
 };
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 10/22] Staging: hv: Simplify blkvsc_init_rw
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (7 preceding siblings ...)
  2011-04-04 22:47   ` [PATCH 09/22] Staging: hv: Get rid of the function blkvsc_revalidate_disk() K. Y. Srinivasan
@ 2011-04-04 22:47   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 11/22] Staging: hv: Get rid of some DPRINT_INFO() statements K. Y. Srinivasan
                     ` (11 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:47 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Simplyfify blkvsc_init_rw() by using a single scsi command independent of
the start sector

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>
---
 drivers/staging/hv/blkvsc_drv.c |   58 +++++++++------------------------------
 1 files changed, 13 insertions(+), 45 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index da7fd38..69b6290 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -304,53 +304,21 @@ static void blkvsc_init_rw(struct blkvsc_request *blkvsc_req)
 
 	blkvsc_req->cmd_len = 16;
 
-	if (blkvsc_req->sector_start > 0xffffffff) {
-		if (rq_data_dir(blkvsc_req->req)) {
-			blkvsc_req->write = 1;
-			blkvsc_req->cmnd[0] = WRITE_16;
-		} else {
-			blkvsc_req->write = 0;
-			blkvsc_req->cmnd[0] = READ_16;
-		}
-
-		blkvsc_req->cmnd[1] |=
-			(blkvsc_req->req->cmd_flags & REQ_FUA) ? 0x8 : 0;
-
-		*(unsigned long long *)&blkvsc_req->cmnd[2] =
-				cpu_to_be64(blkvsc_req->sector_start);
-		*(unsigned int *)&blkvsc_req->cmnd[10] =
-				cpu_to_be32(blkvsc_req->sector_count);
-	} else if ((blkvsc_req->sector_count > 0xff) ||
-		   (blkvsc_req->sector_start > 0x1fffff)) {
-		if (rq_data_dir(blkvsc_req->req)) {
-			blkvsc_req->write = 1;
-			blkvsc_req->cmnd[0] = WRITE_10;
-		} else {
-			blkvsc_req->write = 0;
-			blkvsc_req->cmnd[0] = READ_10;
-		}
-
-		blkvsc_req->cmnd[1] |=
-			(blkvsc_req->req->cmd_flags & REQ_FUA) ? 0x8 : 0;
-
-		*(unsigned int *)&blkvsc_req->cmnd[2] =
-				cpu_to_be32(blkvsc_req->sector_start);
-		*(unsigned short *)&blkvsc_req->cmnd[7] =
-				cpu_to_be16(blkvsc_req->sector_count);
+	if (rq_data_dir(blkvsc_req->req)) {
+		blkvsc_req->write = 1;
+		blkvsc_req->cmnd[0] = WRITE_16;
 	} else {
-		if (rq_data_dir(blkvsc_req->req)) {
-			blkvsc_req->write = 1;
-			blkvsc_req->cmnd[0] = WRITE_6;
-		} else {
-			blkvsc_req->write = 0;
-			blkvsc_req->cmnd[0] = READ_6;
-		}
-
-		*(unsigned int *)&blkvsc_req->cmnd[1] =
-				cpu_to_be32(blkvsc_req->sector_start) >> 8;
-		blkvsc_req->cmnd[1] &= 0x1f;
-		blkvsc_req->cmnd[4] = (unsigned char)blkvsc_req->sector_count;
+		blkvsc_req->write = 0;
+		blkvsc_req->cmnd[0] = READ_16;
 	}
+
+	blkvsc_req->cmnd[1] |=
+	(blkvsc_req->req->cmd_flags & REQ_FUA) ? 0x8 : 0;
+
+	*(unsigned long long *)&blkvsc_req->cmnd[2] =
+	cpu_to_be64(blkvsc_req->sector_start);
+	*(unsigned int *)&blkvsc_req->cmnd[10] =
+	cpu_to_be32(blkvsc_req->sector_count);
 }
 
 
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 11/22] Staging: hv: Get rid of some DPRINT_INFO() statements
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (8 preceding siblings ...)
  2011-04-04 22:47   ` [PATCH 10/22] Staging: hv: Simplify blkvsc_init_rw K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 12/22] Staging: hv: Get rid of some DPRINT_DBG() calls K. Y. Srinivasan
                     ` (10 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Get rid of some of the DPRINT_INFO() statements.

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>
---
 drivers/staging/hv/blkvsc_drv.c |    3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 69b6290..1f4dd69 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -330,7 +330,6 @@ static int blkvsc_ioctl(struct block_device *bd, fmode_t mode,
 
 	switch (cmd) {
 	case HDIO_GET_IDENTITY:
-		DPRINT_INFO(BLKVSC_DRV, "HDIO_GET_IDENTITY\n");
 		if (copy_to_user((void __user *)arg, blkdev->device_id,
 				 blkdev->device_id_len))
 			ret = -EFAULT;
@@ -1262,8 +1261,6 @@ static int __init blkvsc_init(void)
 
 	BUILD_BUG_ON(sizeof(sector_t) != 8);
 
-	DPRINT_INFO(BLKVSC_DRV, "Blkvsc initializing....");
-
 	ret = blkvsc_drv_init();
 
 	return ret;
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 12/22] Staging: hv: Get rid of some DPRINT_DBG() calls
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (9 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 11/22] Staging: hv: Get rid of some DPRINT_INFO() statements K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 13/22] Staging: hv: Cleanup blkvsc_remove() K. Y. Srinivasan
                     ` (9 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Get rid of some of the DPRINT_DBG() statements.

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>
---
 drivers/staging/hv/blkvsc_drv.c |   84 ---------------------------------------
 1 files changed, 0 insertions(+), 84 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 1f4dd69..32d542d 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -220,14 +220,6 @@ static int blkvsc_submit_request(struct blkvsc_request *blkvsc_req,
 	struct vmscsi_request *vm_srb;
 	int ret;
 
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_submit_request() - "
-		   "req %p type %s start_sector %lu count %ld offset %d "
-		   "len %d\n", blkvsc_req,
-		   (blkvsc_req->write) ? "WRITE" : "READ",
-		   (unsigned long) blkvsc_req->sector_start,
-		   blkvsc_req->sector_count,
-		   blkvsc_req->request.data_buffer.offset,
-		   blkvsc_req->request.data_buffer.len);
 
 	storvsc_req = &blkvsc_req->request;
 	vm_srb = &storvsc_req->vstor_packet.vm_srb;
@@ -260,8 +252,6 @@ static int blkvsc_open(struct block_device *bdev, fmode_t mode)
 {
 	struct block_device_context *blkdev = bdev->bd_disk->private_data;
 
-	DPRINT_DBG(BLKVSC_DRV, "- users %d disk %s\n", blkdev->users,
-		   blkdev->gd->disk_name);
 
 	mutex_lock(&blkvsc_mutex);
 	spin_lock(&blkdev->lock);
@@ -351,8 +341,6 @@ static void blkvsc_cmd_completion(struct hv_storvsc_request *request)
 	struct scsi_sense_hdr sense_hdr;
 	struct vmscsi_request *vm_srb;
 
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_cmd_completion() - req %p\n",
-		   blkvsc_req);
 
 	vm_srb = &blkvsc_req->request.vstor_packet.vm_srb;
 	blkdev->num_outstanding_reqs--;
@@ -495,7 +483,6 @@ static int blkvsc_cancel_pending_reqs(struct block_device_context *blkdev)
 
 	int ret = 0;
 
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_cancel_pending_reqs()");
 
 	/* Flush the pending list first */
 	list_for_each_entry_safe(pend_req, tmp, &blkdev->pending_list,
@@ -508,11 +495,6 @@ static int blkvsc_cancel_pending_reqs(struct block_device_context *blkdev)
 		list_for_each_entry_safe(comp_req, tmp2,
 					 &pend_req->group->blkvsc_req_list,
 					 req_entry) {
-			DPRINT_DBG(BLKVSC_DRV, "completing blkvsc_req %p "
-				   "sect_start %lu sect_count %ld\n",
-				   comp_req,
-				   (unsigned long) comp_req->sector_start,
-				   comp_req->sector_count);
 
 			if (comp_req == pend_req)
 				break;
@@ -536,9 +518,6 @@ static int blkvsc_cancel_pending_reqs(struct block_device_context *blkdev)
 			kmem_cache_free(blkdev->request_pool, comp_req);
 		}
 
-		DPRINT_DBG(BLKVSC_DRV, "cancelling pending request - %p\n",
-			   pend_req);
-
 		list_del(&pend_req->pend_entry);
 
 		list_del(&pend_req->req_entry);
@@ -551,9 +530,6 @@ static int blkvsc_cancel_pending_reqs(struct block_device_context *blkdev)
 				 * All the sectors have been xferred ie the
 				 * request is done
 				 */
-				DPRINT_DBG(BLKVSC_DRV,
-					   "blkvsc_cancel_pending_reqs() - "
-					   "req %p COMPLETED\n", pend_req->req);
 				kmem_cache_free(blkdev->request_pool,
 						pend_req->group);
 			}
@@ -581,7 +557,6 @@ static int blkvsc_remove(struct device *device)
 	unsigned long flags;
 	int ret;
 
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_remove()\n");
 
 	if (!storvsc_drv_obj->base.dev_rm)
 		return -1;
@@ -639,9 +614,6 @@ static void blkvsc_shutdown(struct device *device)
 	if (!blkdev)
 		return;
 
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_shutdown - users %d disk %s\n",
-		   blkdev->users, blkdev->gd->disk_name);
-
 	spin_lock_irqsave(&blkdev->lock, flags);
 
 	blkdev->shutting_down = 1;
@@ -669,9 +641,6 @@ static int blkvsc_release(struct gendisk *disk, fmode_t mode)
 {
 	struct block_device_context *blkdev = disk->private_data;
 
-	DPRINT_DBG(BLKVSC_DRV, "- users %d disk %s\n", blkdev->users,
-		   blkdev->gd->disk_name);
-
 	mutex_lock(&blkvsc_mutex);
 	spin_lock(&blkdev->lock);
 	if (blkdev->users == 1) {
@@ -709,9 +678,6 @@ static int blkvsc_do_request(struct block_device_context *blkdev,
 	int pending = 0;
 	struct blkvsc_request_group *group = NULL;
 
-	DPRINT_DBG(BLKVSC_DRV, "blkdev %p req %p sect %lu\n", blkdev, req,
-		  (unsigned long)blk_rq_pos(req));
-
 	/* Create a group to tie req to list of blkvsc_reqs */
 	group = kmem_cache_zalloc(blkdev->request_pool, GFP_ATOMIC);
 	if (!group)
@@ -729,11 +695,6 @@ static int blkvsc_do_request(struct block_device_context *blkdev,
 			 * Map this bio into an existing or new storvsc request
 			 */
 			bio_for_each_segment(bvec, bio, seg_idx) {
-				DPRINT_DBG(BLKVSC_DRV, "bio_for_each_segment() "
-					   "- req %p bio %p bvec %p seg_idx %d "
-					   "databuf_idx %d\n", req, bio, bvec,
-					   seg_idx, databuf_idx);
-
 				/* Get a new storvsc request */
 				/* 1st-time */
 				if ((!blkvsc_req) ||
@@ -826,10 +787,6 @@ static int blkvsc_do_request(struct block_device_context *blkdev,
 
 	/* Handle the last one */
 	if (blkvsc_req) {
-		DPRINT_DBG(BLKVSC_DRV, "blkdev %p req %p group %p count %d\n",
-			   blkdev, req, blkvsc_req->group,
-			   blkvsc_req->group->outstanding);
-
 		blkvsc_req->sector_start = start_sector;
 		sector_div(blkvsc_req->sector_start,
 			   (blkdev->sector_size >> 9));
@@ -842,13 +799,6 @@ static int blkvsc_do_request(struct block_device_context *blkdev,
 
 	list_for_each_entry(blkvsc_req, &group->blkvsc_req_list, req_entry) {
 		if (pending) {
-			DPRINT_DBG(BLKVSC_DRV, "adding blkvsc_req to "
-				   "pending_list - blkvsc_req %p start_sect %lu"
-				   " sect_count %ld (%lu %ld)\n", blkvsc_req,
-				   (unsigned long)blkvsc_req->sector_start,
-				   blkvsc_req->sector_count,
-				   (unsigned long)start_sector,
-				   (unsigned long)num_sectors);
 
 			list_add_tail(&blkvsc_req->pend_entry,
 				      &blkdev->pending_list);
@@ -861,13 +811,6 @@ static int blkvsc_do_request(struct block_device_context *blkdev,
 					      &blkdev->pending_list);
 			}
 
-			DPRINT_DBG(BLKVSC_DRV, "submitted blkvsc_req %p "
-				   "start_sect %lu sect_count %ld (%lu %ld) "
-				   "ret %d\n", blkvsc_req,
-				   (unsigned long)blkvsc_req->sector_start,
-				   blkvsc_req->sector_count,
-				   (unsigned long)start_sector,
-				   num_sectors, ret);
 		}
 	}
 
@@ -882,8 +825,6 @@ static int blkvsc_do_pending_reqs(struct block_device_context *blkdev)
 	/* Flush the pending list first */
 	list_for_each_entry_safe(pend_req, tmp, &blkdev->pending_list,
 				 pend_entry) {
-		DPRINT_DBG(BLKVSC_DRV, "working off pending_list - %p\n",
-			   pend_req);
 
 		ret = blkvsc_submit_request(pend_req,
 					    blkvsc_request_completion);
@@ -903,9 +844,7 @@ static void blkvsc_request(struct request_queue *queue)
 	struct request *req;
 	int ret = 0;
 
-	DPRINT_DBG(BLKVSC_DRV, "- enter\n");
 	while ((req = blk_peek_request(queue)) != NULL) {
-		DPRINT_DBG(BLKVSC_DRV, "- req %p\n", req);
 
 		blkdev = req->rq_disk->private_data;
 		if (blkdev->shutting_down || req->cmd_type != REQ_TYPE_FS) {
@@ -916,8 +855,6 @@ static void blkvsc_request(struct request_queue *queue)
 		ret = blkvsc_do_pending_reqs(blkdev);
 
 		if (ret != 0) {
-			DPRINT_DBG(BLKVSC_DRV,
-				   "- stop queue - pending_list not empty\n");
 			blk_stop_queue(queue);
 			break;
 		}
@@ -926,11 +863,9 @@ static void blkvsc_request(struct request_queue *queue)
 
 		ret = blkvsc_do_request(blkdev, req);
 		if (ret > 0) {
-			DPRINT_DBG(BLKVSC_DRV, "- stop queue - no room\n");
 			blk_stop_queue(queue);
 			break;
 		} else if (ret < 0) {
-			DPRINT_DBG(BLKVSC_DRV, "- stop queue - no mem\n");
 			blk_requeue_request(queue, req);
 			blk_stop_queue(queue);
 			break;
@@ -1040,7 +975,6 @@ static int blkvsc_probe(struct device *device)
 	static int ide0_registered;
 	static int ide1_registered;
 
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_probe - enter");
 
 	if (!storvsc_drv_obj->base.dev_add) {
 		DPRINT_ERR(BLKVSC_DRV, "OnDeviceAdd() not set");
@@ -1194,17 +1128,6 @@ static void blkvsc_request_completion(struct hv_storvsc_request *request)
 	struct vmscsi_request *vm_srb;
 
 
-	DPRINT_DBG(BLKVSC_DRV, "blkdev %p blkvsc_req %p group %p type %s "
-		   "sect_start %lu sect_count %ld len %d group outstd %d "
-		   "total outstd %d\n",
-		   blkdev, blkvsc_req, blkvsc_req->group,
-		   (blkvsc_req->write) ? "WRITE" : "READ",
-		   (unsigned long)blkvsc_req->sector_start,
-		   blkvsc_req->sector_count,
-		   blkvsc_req->request.data_buffer.len,
-		   blkvsc_req->group->outstanding,
-		   blkdev->num_outstanding_reqs);
-
 	spin_lock_irqsave(&blkdev->lock, flags);
 
 	blkdev->num_outstanding_reqs--;
@@ -1219,11 +1142,6 @@ static void blkvsc_request_completion(struct hv_storvsc_request *request)
 		list_for_each_entry_safe(comp_req, tmp,
 					 &blkvsc_req->group->blkvsc_req_list,
 					 req_entry) {
-			DPRINT_DBG(BLKVSC_DRV, "completing blkvsc_req %p "
-				   "sect_start %lu sect_count %ld\n",
-				   comp_req,
-				   (unsigned long)comp_req->sector_start,
-				   comp_req->sector_count);
 
 			list_del(&comp_req->req_entry);
 
@@ -1236,8 +1154,6 @@ static void blkvsc_request_completion(struct hv_storvsc_request *request)
 				 * All the sectors have been xferred ie the
 				 * request is done
 				 */
-				DPRINT_DBG(BLKVSC_DRV, "req %p COMPLETED\n",
-					   comp_req->req);
 				kmem_cache_free(blkdev->request_pool,
 						comp_req->group);
 			}
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 13/22] Staging: hv: Cleanup blkvsc_remove()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (10 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 12/22] Staging: hv: Get rid of some DPRINT_DBG() calls K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 14/22] Staging: hv: Cleanup storvsc_remove() K. Y. Srinivasan
                     ` (8 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

blkvsc_remove() cannot fail. Clean it up accordingly.

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>
---
 drivers/staging/hv/blkvsc_drv.c |   15 +++------------
 1 files changed, 3 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 32d542d..c0a7acd 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -555,22 +555,12 @@ static int blkvsc_remove(struct device *device)
 	struct hv_device *device_obj = device_to_hv_device(device);
 	struct block_device_context *blkdev = dev_get_drvdata(device);
 	unsigned long flags;
-	int ret;
-
-
-	if (!storvsc_drv_obj->base.dev_rm)
-		return -1;
 
 	/*
 	 * Call to the vsc driver to let it know that the device is being
 	 * removed
 	 */
-	ret = storvsc_drv_obj->base.dev_rm(device_obj);
-	if (ret != 0) {
-		/* TODO: */
-		DPRINT_ERR(BLKVSC_DRV,
-			   "unable to remove blkvsc device (ret %d)", ret);
-	}
+	storvsc_drv_obj->base.dev_rm(device_obj);
 
 	/* Get to a known state */
 	spin_lock_irqsave(&blkdev->lock, flags);
@@ -603,7 +593,8 @@ static int blkvsc_remove(struct device *device)
 
 	kfree(blkdev);
 
-	return ret;
+	return 0;
+
 }
 
 static void blkvsc_shutdown(struct device *device)
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 14/22] Staging: hv: Cleanup storvsc_remove()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (11 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 13/22] Staging: hv: Cleanup blkvsc_remove() K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 15/22] Staging: hv: Get rid of the code to manage removable media K. Y. Srinivasan
                     ` (7 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

storvsc_remove() cannot fail, clean it up accordingly.

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>
---
 drivers/staging/hv/storvsc_drv.c |   14 ++------------
 1 files changed, 2 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index ae61735..f819c6a 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -404,7 +404,6 @@ static int storvsc_probe(struct device *device)
  */
 static int storvsc_remove(struct device *device)
 {
-	int ret;
 	struct hv_driver *drv =
 			drv_to_hv_drv(device->driver);
 	struct storvsc_driver_object *storvsc_drv_obj = drv->priv;
@@ -413,20 +412,11 @@ static int storvsc_remove(struct device *device)
 	struct host_device_context *host_device_ctx =
 			(struct host_device_context *)host->hostdata;
 
-
-	if (!storvsc_drv_obj->base.dev_rm)
-		return -1;
-
 	/*
 	 * Call to the vsc driver to let it know that the device is being
 	 * removed
 	 */
-	ret = storvsc_drv_obj->base.dev_rm(device_obj);
-	if (ret != 0) {
-		/* TODO: */
-		DPRINT_ERR(STORVSC, "unable to remove vsc device (ret %d)",
-			   ret);
-	}
+	storvsc_drv_obj->base.dev_rm(device_obj);
 
 	if (host_device_ctx->request_pool) {
 		kmem_cache_destroy(host_device_ctx->request_pool);
@@ -438,7 +428,7 @@ static int storvsc_remove(struct device *device)
 
 	DPRINT_INFO(STORVSC, "releasing host adapter (%p)...", host);
 	scsi_host_put(host);
-	return ret;
+	return 0;
 }
 
 /*
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 15/22] Staging: hv: Get rid of the code to manage removable media
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (12 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 14/22] Staging: hv: Cleanup storvsc_remove() K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 16/22] Staging: hv: Get rid of some DPRINT_ERR() calls K. Y. Srinivasan
                     ` (6 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

The Hyper-V block driver does not handle removable media.
Get rid of the code to manage removable media.

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>
---
 drivers/staging/hv/blkvsc_drv.c |    9 +--------
 1 files changed, 1 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index c0a7acd..03aebfc 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -436,8 +436,6 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 
 		if (device_type == 0x0)
 			blkdev->device_type = HARDDISK_TYPE;
-		 else if (device_type == 0x5)
-			blkdev->device_type = DVD_TYPE;
 		 else
 			blkdev->device_type = UNKNOWN_DEV_TYPE;
 
@@ -1074,12 +1072,7 @@ static int blkvsc_probe(struct device *device)
 	sprintf(blkdev->gd->disk_name, "hd%c", 'a' + devnum);
 
 	blkvsc_do_operation(blkdev, DO_INQUIRY);
-	if (blkdev->device_type == DVD_TYPE) {
-		set_disk_ro(blkdev->gd, 1);
-		blkdev->gd->flags |= GENHD_FL_REMOVABLE;
-		blkvsc_do_operation(blkdev, DO_CAPACITY);
-	} else
-		blkvsc_do_operation(blkdev, DO_CAPACITY);
+	blkvsc_do_operation(blkdev, DO_CAPACITY);
 
 	set_capacity(blkdev->gd, blkdev->capacity * (blkdev->sector_size/512));
 	blk_queue_logical_block_size(blkdev->gd->queue, blkdev->sector_size);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 16/22] Staging: hv: Get rid of some DPRINT_ERR() calls
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (13 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 15/22] Staging: hv: Get rid of the code to manage removable media K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 17/22] Staging: hv: Get rid of an unnecessary check in blkvsc_probe() K. Y. Srinivasan
                     ` (5 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Get rid of some DPRINT_ERR() calls.

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>
---
 drivers/staging/hv/blkvsc_drv.c |    9 +++------
 1 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 03aebfc..aff6356 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -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/init.h>
 #include <linux/module.h>
@@ -966,7 +968,6 @@ static int blkvsc_probe(struct device *device)
 
 
 	if (!storvsc_drv_obj->base.dev_add) {
-		DPRINT_ERR(BLKVSC_DRV, "OnDeviceAdd() not set");
 		ret = -1;
 		goto Cleanup;
 	}
@@ -994,10 +995,8 @@ static int blkvsc_probe(struct device *device)
 
 	/* Call to the vsc driver to add the device */
 	ret = storvsc_drv_obj->base.dev_add(device_obj, &device_info);
-	if (ret != 0) {
-		DPRINT_ERR(BLKVSC_DRV, "unable to add blkvsc device");
+	if (ret != 0)
 		goto Cleanup;
-	}
 
 	blkdev->device_ctx = device_obj;
 	/* this identified the device 0 or 1 */
@@ -1039,7 +1038,6 @@ static int blkvsc_probe(struct device *device)
 			ide1_registered = 1;
 		}
 	} else {
-		DPRINT_ERR(BLKVSC_DRV, "invalid pathid");
 		ret = -1;
 		goto Cleanup;
 	}
@@ -1048,7 +1046,6 @@ static int blkvsc_probe(struct device *device)
 
 	blkdev->gd = alloc_disk(BLKVSC_MINORS);
 	if (!blkdev->gd) {
-		DPRINT_ERR(BLKVSC_DRV, "register_blkdev() failed! ret %d", ret);
 		ret = -1;
 		goto Cleanup;
 	}
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 17/22] Staging: hv: Get rid of an unnecessary check in blkvsc_probe()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (14 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 16/22] Staging: hv: Get rid of some DPRINT_ERR() calls K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 18/22] Staging: hv: Cleanup blkvsc_open() K. Y. Srinivasan
                     ` (4 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

It is never the case that the dev_add function pointer will not be set
(we set it in this code!). Get rid of this meaningless check.

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>
---
 drivers/staging/hv/blkvsc_drv.c |    5 -----
 1 files changed, 0 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index aff6356..7f511ee 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -967,11 +967,6 @@ static int blkvsc_probe(struct device *device)
 	static int ide1_registered;
 
 
-	if (!storvsc_drv_obj->base.dev_add) {
-		ret = -1;
-		goto Cleanup;
-	}
-
 	blkdev = kzalloc(sizeof(struct block_device_context), GFP_KERNEL);
 	if (!blkdev) {
 		ret = -ENOMEM;
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 18/22] Staging: hv: Cleanup blkvsc_open()
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (15 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 17/22] Staging: hv: Get rid of an unnecessary check in blkvsc_probe() K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 19/22] Staging: hv: Fix a jump label (Cleanup) in blkvsc_drv K. Y. Srinivasan
                     ` (3 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Given that we don't support removable media, cleanup blkvsc_open()


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>
---
 drivers/staging/hv/blkvsc_drv.c |   10 +---------
 1 files changed, 1 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 7f511ee..05a0e87 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -254,20 +254,12 @@ static int blkvsc_open(struct block_device *bdev, fmode_t mode)
 {
 	struct block_device_context *blkdev = bdev->bd_disk->private_data;
 
-
-	mutex_lock(&blkvsc_mutex);
 	spin_lock(&blkdev->lock);
 
-	if (!blkdev->users && blkdev->device_type == DVD_TYPE) {
-		spin_unlock(&blkdev->lock);
-		check_disk_change(bdev);
-		spin_lock(&blkdev->lock);
-	}
-
 	blkdev->users++;
 
 	spin_unlock(&blkdev->lock);
-	mutex_unlock(&blkvsc_mutex);
+
 	return 0;
 }
 
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 19/22] Staging: hv: Fix a jump label (Cleanup) in blkvsc_drv
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (16 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 18/22] Staging: hv: Cleanup blkvsc_open() K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 20/22] Staging: hv: Fix a jump label (Remove) in blkvsc_drv.c K. Y. Srinivasan
                     ` (2 subsequent siblings)
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

One of the goto labels was named Cleanup; change it to cleanup.

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>
---
 drivers/staging/hv/blkvsc_drv.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 05a0e87..0891bc2 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -962,7 +962,7 @@ static int blkvsc_probe(struct device *device)
 	blkdev = kzalloc(sizeof(struct block_device_context), GFP_KERNEL);
 	if (!blkdev) {
 		ret = -ENOMEM;
-		goto Cleanup;
+		goto cleanup;
 	}
 
 	INIT_LIST_HEAD(&blkdev->pending_list);
@@ -976,14 +976,14 @@ static int blkvsc_probe(struct device *device)
 					SLAB_HWCACHE_ALIGN, NULL);
 	if (!blkdev->request_pool) {
 		ret = -ENOMEM;
-		goto Cleanup;
+		goto cleanup;
 	}
 
 
 	/* Call to the vsc driver to add the device */
 	ret = storvsc_drv_obj->base.dev_add(device_obj, &device_info);
 	if (ret != 0)
-		goto Cleanup;
+		goto cleanup;
 
 	blkdev->device_ctx = device_obj;
 	/* this identified the device 0 or 1 */
@@ -1026,7 +1026,7 @@ static int blkvsc_probe(struct device *device)
 		}
 	} else {
 		ret = -1;
-		goto Cleanup;
+		goto cleanup;
 	}
 
 	DPRINT_INFO(BLKVSC_DRV, "blkvsc registered for major %d!!", major);
@@ -1034,7 +1034,7 @@ static int blkvsc_probe(struct device *device)
 	blkdev->gd = alloc_disk(BLKVSC_MINORS);
 	if (!blkdev->gd) {
 		ret = -1;
-		goto Cleanup;
+		goto cleanup;
 	}
 
 	blkdev->gd->queue = blk_init_queue(blkvsc_request, &blkdev->lock);
@@ -1072,7 +1072,7 @@ static int blkvsc_probe(struct device *device)
 Remove:
 	storvsc_drv_obj->base.dev_rm(device_obj);
 
-Cleanup:
+cleanup:
 	if (blkdev) {
 		if (blkdev->request_pool) {
 			kmem_cache_destroy(blkdev->request_pool);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 20/22] Staging: hv: Fix a jump label (Remove) in blkvsc_drv.c
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (17 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 19/22] Staging: hv: Fix a jump label (Cleanup) in blkvsc_drv K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 21/22] Staging: hv: Introduce a function to map channel properties onto block device info K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 22/22] Staging: hv: Get rid of IDE details from blkvsc_drv.c K. Y. Srinivasan
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

One of the jump labels was named Remove; change it to remove.

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>
---
 drivers/staging/hv/blkvsc_drv.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 0891bc2..8874654 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -1004,7 +1004,7 @@ static int blkvsc_probe(struct device *device)
 				DPRINT_ERR(BLKVSC_DRV,
 					   "register_blkdev() failed! ret %d",
 					   ret);
-				goto Remove;
+				goto remove;
 			}
 
 			ide0_registered = 1;
@@ -1019,7 +1019,7 @@ static int blkvsc_probe(struct device *device)
 				DPRINT_ERR(BLKVSC_DRV,
 					   "register_blkdev() failed! ret %d",
 					   ret);
-				goto Remove;
+				goto remove;
 			}
 
 			ide1_registered = 1;
@@ -1069,7 +1069,7 @@ static int blkvsc_probe(struct device *device)
 
 	return ret;
 
-Remove:
+remove:
 	storvsc_drv_obj->base.dev_rm(device_obj);
 
 cleanup:
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 21/22] Staging: hv: Introduce a function to map channel properties onto block device info
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (18 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 20/22] Staging: hv: Fix a jump label (Remove) in blkvsc_drv.c K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  2011-04-04 22:48   ` [PATCH 22/22] Staging: hv: Get rid of IDE details from blkvsc_drv.c K. Y. Srinivasan
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

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>
---
 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@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>
@@ -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 f6b7cde..630710d 100644
--- a/drivers/staging/hv/storvsc_api.h
+++ b/drivers/staging/hv/storvsc_api.h
@@ -91,6 +91,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;
@@ -154,5 +162,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


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 22/22] Staging: hv: Get rid of IDE details from blkvsc_drv.c
  2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
                     ` (19 preceding siblings ...)
  2011-04-04 22:48   ` [PATCH 21/22] Staging: hv: Introduce a function to map channel properties onto block device info K. Y. Srinivasan
@ 2011-04-04 22:48   ` K. Y. Srinivasan
  20 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-04 22:48 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Now get rid of IDE details from blkvsc_drv.c.

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>
---
 drivers/staging/hv/blkvsc_drv.c |   56 ++++++++++++---------------------------
 drivers/staging/hv/storvsc.c    |   18 ++++++------
 2 files changed, 26 insertions(+), 48 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 8874654..ca71cf5 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -952,11 +952,8 @@ static int blkvsc_probe(struct device *device)
 
 	struct block_device_context *blkdev = NULL;
 	struct storvsc_device_info device_info;
-	int major = 0;
-	int devnum = 0;
+	struct storvsc_major_info major_info;
 	int ret = 0;
-	static int ide0_registered;
-	static int ide1_registered;
 
 
 	blkdev = kzalloc(sizeof(struct block_device_context), GFP_KERNEL);
@@ -993,43 +990,23 @@ static int blkvsc_probe(struct device *device)
 
 	dev_set_drvdata(device, blkdev);
 
-	/* Calculate the major and device num */
-	if (blkdev->path == 0) {
-		major = IDE0_MAJOR;
-		devnum = blkdev->path + blkdev->target;		/* 0 or 1 */
-
-		if (!ide0_registered) {
-			ret = register_blkdev(major, "ide");
-			if (ret != 0) {
-				DPRINT_ERR(BLKVSC_DRV,
-					   "register_blkdev() failed! ret %d",
-					   ret);
-				goto remove;
-			}
+	ret = stor_vsc_get_major_info(&device_info, &major_info);
 
-			ide0_registered = 1;
-		}
-	} else if (blkdev->path == 1) {
-		major = IDE1_MAJOR;
-		devnum = blkdev->path + blkdev->target + 1; /* 2 or 3 */
-
-		if (!ide1_registered) {
-			ret = register_blkdev(major, "ide");
-			if (ret != 0) {
-				DPRINT_ERR(BLKVSC_DRV,
-					   "register_blkdev() failed! ret %d",
-					   ret);
-				goto remove;
-			}
+	if (ret)
+		goto cleanup;
+
+	if (major_info.do_register) {
+		ret = register_blkdev(major_info.major, major_info.devname);
 
-			ide1_registered = 1;
+		if (ret != 0) {
+			DPRINT_ERR(BLKVSC_DRV,
+				   "register_blkdev() failed! ret %d", ret);
+			goto remove;
 		}
-	} else {
-		ret = -1;
-		goto cleanup;
 	}
 
-	DPRINT_INFO(BLKVSC_DRV, "blkvsc registered for major %d!!", major);
+	DPRINT_INFO(BLKVSC_DRV, "blkvsc registered for major %d!!",
+			major_info.major);
 
 	blkdev->gd = alloc_disk(BLKVSC_MINORS);
 	if (!blkdev->gd) {
@@ -1045,15 +1022,16 @@ static int blkvsc_probe(struct device *device)
 	blk_queue_bounce_limit(blkdev->gd->queue, BLK_BOUNCE_ANY);
 	blk_queue_dma_alignment(blkdev->gd->queue, 511);
 
-	blkdev->gd->major = major;
-	if (devnum == 1 || devnum == 3)
+	blkdev->gd->major = major_info.major;
+
+	if (major_info.index == 1 || major_info.index == 3)
 		blkdev->gd->first_minor = BLKVSC_MINORS;
 	else
 		blkdev->gd->first_minor = 0;
 	blkdev->gd->fops = &block_ops;
 	blkdev->gd->private_data = blkdev;
 	blkdev->gd->driverfs_dev = &(blkdev->device_ctx->device);
-	sprintf(blkdev->gd->disk_name, "hd%c", 'a' + devnum);
+	sprintf(blkdev->gd->disk_name, "hd%c", 'a' + major_info.index);
 
 	blkvsc_do_operation(blkdev, DO_INQUIRY);
 	blkvsc_do_operation(blkdev, DO_CAPACITY);
diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c
index e2b3410..85bae5a 100644
--- a/drivers/staging/hv/storvsc.c
+++ b/drivers/staging/hv/storvsc.c
@@ -629,26 +629,26 @@ int stor_vsc_get_major_info(struct storvsc_device_info *device_info,
 
 	if (device_info->path_id) {
 		major_info->major = 22;
-		if (!ide1_registered)
+		if (!ide1_registered) {
 			major_info->do_register = true;
-		else {
-			major_info->do_register = false;
 			ide1_registered = true;
-		}
+		} else
+			major_info->do_register = false;
+
 		if (device_info->target_id)
 			major_info->index = 3;
-		 else
+		else
 			major_info->index = 2;
 
 		return 0;
 	} else {
 		major_info->major = 3;
-		if (!ide0_registered)
+		if (!ide0_registered) {
 			major_info->do_register = true;
-		else {
-			major_info->do_register = false;
 			ide0_registered = true;
-		}
+		} else
+			major_info->do_register = false;
+
 		if (device_info->target_id)
 			major_info->index = 1;
 		else
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 05/22] Staging: hv: Get rid of blkvsc_do_read_capacity()
  2011-04-06 23:05 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_check_events() K. Y. Srinivasan
@ 2011-04-06 23:05   ` K. Y. Srinivasan
  0 siblings, 0 replies; 24+ messages in thread
From: K. Y. Srinivasan @ 2011-04-06 23:05 UTC (permalink / raw)
  To: gregkh, linux-kernel, devel, virtualization
  Cc: K. Y. Srinivasan, Haiyang Zhang, Hank Janssen

Now that we have a common function for some of the operations on the device,
use that and get rid of the function blkvsc_do_read_capacity().

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>
---
 drivers/staging/hv/blkvsc_drv.c |  117 +++++++++++++--------------------------
 1 files changed, 39 insertions(+), 78 deletions(-)

diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 9dbba3c..b2d149d 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -48,6 +48,7 @@ enum blkvsc_device_type {
 
 enum blkvsc_op_type {
 	DO_INQUIRY,
+	DO_CAPACITY,
 };
 
 /*
@@ -406,6 +407,9 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 	struct page *page_buf;
 	unsigned char *buf;
 	unsigned char device_type;
+	struct scsi_sense_hdr sense_hdr;
+	struct vmscsi_request *vm_srb;
+
 	int ret = 0;
 
 	blkvsc_req = kmem_cache_zalloc(blkdev->request_pool, GFP_KERNEL);
@@ -418,6 +422,7 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 		return -ENOMEM;
 	}
 
+	vm_srb = &blkvsc_req->request.vstor_packet.vm_srb;
 	init_completion(&blkvsc_req->request.wait_event);
 	blkvsc_req->dev = blkdev;
 	blkvsc_req->req = NULL;
@@ -437,6 +442,15 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 		blkvsc_req->request.data_buffer.len = 64;
 		break;
 
+	case DO_CAPACITY:
+		blkdev->sector_size = 0;
+		blkdev->capacity = 0;
+		blkdev->media_not_present = 0; /* assume a disk is present */
+
+		blkvsc_req->cmnd[0] = READ_CAPACITY;
+		blkvsc_req->cmd_len = 16;
+		blkvsc_req->request.data_buffer.len = 8;
+		break;
 	default:
 		ret = -EINVAL;
 		goto cleanup;
@@ -446,6 +460,18 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 
 	wait_for_completion_interruptible(&blkvsc_req->request.wait_event);
 
+	/* check error */
+	if (vm_srb->scsi_status) {
+		scsi_normalize_sense(blkvsc_req->sense_buffer,
+				     SCSI_SENSE_BUFFERSIZE, &sense_hdr);
+
+		if (sense_hdr.asc == 0x3A)
+			/* Medium not present */
+			blkdev->media_not_present = 1;
+
+		return 0;
+	}
+
 	buf = kmap(page_buf);
 
 	switch (op) {
@@ -465,6 +491,17 @@ static int blkvsc_do_operation(struct block_device_context *blkdev,
 
 		memcpy(blkdev->device_id, &buf[8], blkdev->device_id_len);
 		break;
+
+	case DO_CAPACITY:
+		/* be to le */
+		blkdev->capacity =
+		((buf[0] << 24) | (buf[1] << 16) |
+		(buf[2] << 8) | buf[3]) + 1;
+
+		blkdev->sector_size =
+		(buf[4] << 24) | (buf[5] << 16) |
+		(buf[6] << 8) | buf[7];
+		break;
 	}
 
 cleanup:
@@ -715,82 +752,6 @@ static int blkvsc_release(struct gendisk *disk, fmode_t mode)
 }
 
 
-/* Do a scsi READ_CAPACITY cmd here to get the size of the disk */
-static int blkvsc_do_read_capacity(struct block_device_context *blkdev)
-{
-	struct blkvsc_request *blkvsc_req;
-	struct page *page_buf;
-	unsigned char *buf;
-	struct scsi_sense_hdr sense_hdr;
-	struct vmscsi_request *vm_srb;
-
-	DPRINT_DBG(BLKVSC_DRV, "blkvsc_do_read_capacity()\n");
-
-	blkdev->sector_size = 0;
-	blkdev->capacity = 0;
-	blkdev->media_not_present = 0; /* assume a disk is present */
-
-	blkvsc_req = kmem_cache_zalloc(blkdev->request_pool, GFP_KERNEL);
-	if (!blkvsc_req)
-		return -ENOMEM;
-
-	memset(blkvsc_req, 0, sizeof(struct blkvsc_request));
-	page_buf = alloc_page(GFP_KERNEL);
-	if (!page_buf) {
-		kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
-		return -ENOMEM;
-	}
-
-	vm_srb = &blkvsc_req->request.vstor_packet.vm_srb;
-	init_completion(&blkvsc_req->request.wait_event);
-	blkvsc_req->dev = blkdev;
-	blkvsc_req->req = NULL;
-	blkvsc_req->write = 0;
-
-	blkvsc_req->request.data_buffer.pfn_array[0] =
-	page_to_pfn(page_buf);
-	blkvsc_req->request.data_buffer.offset = 0;
-	blkvsc_req->request.data_buffer.len = 8;
-
-	blkvsc_req->cmnd[0] = READ_CAPACITY;
-	blkvsc_req->cmd_len = 16;
-
-	blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
-
-	DPRINT_DBG(BLKVSC_DRV, "waiting %p to complete\n",
-		   blkvsc_req);
-
-	wait_for_completion_interruptible(&blkvsc_req->request.wait_event);
-
-	/* check error */
-	if (vm_srb->scsi_status) {
-		scsi_normalize_sense(blkvsc_req->sense_buffer,
-				     SCSI_SENSE_BUFFERSIZE, &sense_hdr);
-
-		if (sense_hdr.asc == 0x3A) {
-			/* Medium not present */
-			blkdev->media_not_present = 1;
-		}
-		return 0;
-	}
-	buf = kmap(page_buf);
-
-	/* be to le */
-	blkdev->capacity = ((buf[0] << 24) | (buf[1] << 16) |
-			    (buf[2] << 8) | buf[3]) + 1;
-	blkdev->sector_size = (buf[4] << 24) | (buf[5] << 16) |
-			      (buf[6] << 8) | buf[7];
-
-	kunmap(page_buf);
-
-	__free_page(page_buf);
-
-	kmem_cache_free(blkvsc_req->dev->request_pool, blkvsc_req);
-
-	return 0;
-}
-
-
 static int blkvsc_do_read_capacity16(struct block_device_context *blkdev)
 {
 	struct blkvsc_request *blkvsc_req;
@@ -874,7 +835,7 @@ static int blkvsc_revalidate_disk(struct gendisk *gd)
 	DPRINT_DBG(BLKVSC_DRV, "- enter\n");
 
 	if (blkdev->device_type == DVD_TYPE) {
-		blkvsc_do_read_capacity(blkdev);
+		blkvsc_do_operation(blkdev, DO_CAPACITY);
 		set_capacity(blkdev->gd, blkdev->capacity *
 			    (blkdev->sector_size/512));
 		blk_queue_logical_block_size(gd->queue, blkdev->sector_size);
@@ -1350,7 +1311,7 @@ static int blkvsc_probe(struct device *device)
 	if (blkdev->device_type == DVD_TYPE) {
 		set_disk_ro(blkdev->gd, 1);
 		blkdev->gd->flags |= GENHD_FL_REMOVABLE;
-		blkvsc_do_read_capacity(blkdev);
+		blkvsc_do_operation(blkdev, DO_CAPACITY);
 	} else {
 		blkvsc_do_read_capacity16(blkdev);
 	}
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2011-04-06 23:27 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-04 22:46 [PATCH 00/22] Staging: hv: Cleanup storage drivers - Phase IV K. Y. Srinivasan
2011-04-04 22:47 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed() K. Y. Srinivasan
2011-04-04 22:47   ` [PATCH 02/22] Staging: hv: Enable blkvsc_ioctl() K. Y. Srinivasan
2011-04-04 22:47   ` [PATCH 03/22] Staging: hv: Simplify the code for blkvsc_getgeo() K. Y. Srinivasan
2011-04-04 22:47   ` [PATCH 04/22] Staging: hv: Introduce a common function for issuing commands to the device K. Y. Srinivasan
2011-04-04 22:47   ` [PATCH 05/22] Staging: hv: Get rid of blkvsc_do_read_capacity() K. Y. Srinivasan
2011-04-04 22:47   ` [PATCH 06/22] Staging: hv: Get rid of blkvsc_do_read_capacity16() K. Y. Srinivasan
2011-04-04 22:47   ` [PATCH 07/22] Staging: hv: Get rid of the function blkvsc_do_flush() K. Y. Srinivasan
2011-04-04 22:47   ` [PATCH 08/22] Staging hv: Get rid of the state media_not_present K. Y. Srinivasan
2011-04-04 22:47   ` [PATCH 09/22] Staging: hv: Get rid of the function blkvsc_revalidate_disk() K. Y. Srinivasan
2011-04-04 22:47   ` [PATCH 10/22] Staging: hv: Simplify blkvsc_init_rw K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 11/22] Staging: hv: Get rid of some DPRINT_INFO() statements K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 12/22] Staging: hv: Get rid of some DPRINT_DBG() calls K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 13/22] Staging: hv: Cleanup blkvsc_remove() K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 14/22] Staging: hv: Cleanup storvsc_remove() K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 15/22] Staging: hv: Get rid of the code to manage removable media K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 16/22] Staging: hv: Get rid of some DPRINT_ERR() calls K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 17/22] Staging: hv: Get rid of an unnecessary check in blkvsc_probe() K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 18/22] Staging: hv: Cleanup blkvsc_open() K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 19/22] Staging: hv: Fix a jump label (Cleanup) in blkvsc_drv K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 20/22] Staging: hv: Fix a jump label (Remove) in blkvsc_drv.c K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 21/22] Staging: hv: Introduce a function to map channel properties onto block device info K. Y. Srinivasan
2011-04-04 22:48   ` [PATCH 22/22] Staging: hv: Get rid of IDE details from blkvsc_drv.c K. Y. Srinivasan
2011-04-06 23:03 [RESEND][PATCH 00/22] Staging: hv: Cleanup storage drivers - Phase IV K. Y. Srinivasan
2011-04-06 23:05 ` [PATCH 01/22] Staging: hv: Get rid of blkvsc_check_events() K. Y. Srinivasan
2011-04-06 23:05   ` [PATCH 05/22] Staging: hv: Get rid of blkvsc_do_read_capacity() K. Y. Srinivasan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).