Re: [PATCH] virtio: decrement dev_index when device is unregistered

2011-04-04 Thread Stefan Hajnoczi
On Tue, Apr 5, 2011 at 5:49 AM, Takuma Umeya  wrote:
> When virtio device is removed, dev_index does not get decremented.
> The next device hotplug event results in consuming the next pci to
> the one that is suppose to be available.
>
> Signed-off-by: Takuma Umeya 
>
> diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
> index efb35aa..67fe71d 100644
> --- a/drivers/virtio/virtio.c
> +++ b/drivers/virtio/virtio.c
> @@ -216,6 +216,7 @@ EXPORT_SYMBOL_GPL(register_virtio_device);
>  void unregister_virtio_device(struct virtio_device *dev)
>  {
>        device_unregister(&dev->dev);
> +       dev_index--;

I don't think there is any guarantee that virtio devices are
added/removed in first-in-last-out order.

That means I could add a virtio-net device (index 0) followed by a
virtio-blk device (index 1).  Now I remove the virtio-net device
(index 0) which causes me to decrement dev_index and hand index 1 out
again to the next device.  This leaves us with virtio-blk (index 1)
and the new device with index 1, which is not unique.

Perhaps I missed a constraint which prevents this from occurring?

Stefan
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH] virtio_blk: decrement index when blockdevice is removed

2011-04-04 Thread Takuma Umeya
When virtio block device is removed, index does not get decremented. When 
another virtio disk is attached it uses the next device letter to the 
one that is suppose to be available. 

Signed-off-by: Takuma Umeya 

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 6ecf89c..730e7af 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -489,6 +489,7 @@ static void __devexit virtblk_remove(struct virtio_device 
*vdev)
mempool_destroy(vblk->pool);
vdev->config->del_vqs(vdev);
kfree(vblk);
+   index--;
 }
 
 static const struct virtio_device_id id_table[] = {

-- 
Umeya, Takuma
Technical Account Manager
Red Hat GSS APAC
+81.3.5798.8584 (direct)
tum...@redhat.com
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH] virtio: decrement dev_index when device is unregistered

2011-04-04 Thread Takuma Umeya
When virtio device is removed, dev_index does not get decremented. 
The next device hotplug event results in consuming the next pci to 
the one that is suppose to be available. 

Signed-off-by: Takuma Umeya 

diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
index efb35aa..67fe71d 100644
--- a/drivers/virtio/virtio.c
+++ b/drivers/virtio/virtio.c
@@ -216,6 +216,7 @@ EXPORT_SYMBOL_GPL(register_virtio_device);
 void unregister_virtio_device(struct virtio_device *dev)
 {
device_unregister(&dev->dev);
+   dev_index--;
 }
 EXPORT_SYMBOL_GPL(unregister_virtio_device);
 

-- 
Umeya, Takuma
Technical Account Manager
Red Hat GSS APAC
+81.3.5798.8584 (direct)
tum...@redhat.com
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 10/22] Staging: hv: Simplify blkvsc_init_rw

2011-04-04 Thread K. Y. Srinivasan
Simplyfify blkvsc_init_rw() by using a single scsi command independent of
the start sector

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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 > 0x) {
-   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 > 0x1f)) {
-   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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 08/22] Staging hv: Get rid of the state media_not_present

2011-04-04 Thread K. Y. Srinivasan
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 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 21/22] Staging: hv: Introduce a function to map channel properties onto block device info

2011-04-04 Thread K. Y. Srinivasan
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 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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 
  *   Hank Janssen  
+ *
+ * 4/3/2011: K. Y. Srinivasan - Significant restructuring and cleanup.
  */
 #include 
 #include 
@@ -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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 20/22] Staging: hv: Fix a jump label (Remove) in blkvsc_drv.c

2011-04-04 Thread K. Y. Srinivasan
One of the jump labels was named Remove; change it to remove.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 22/22] Staging: hv: Get rid of IDE details from blkvsc_drv.c

2011-04-04 Thread K. Y. Srinivasan
Now get rid of IDE details from blkvsc_drv.c.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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)
+ 

[PATCH 09/22] Staging: hv: Get rid of the function blkvsc_revalidate_disk()

2011-04-04 Thread K. Y. Srinivasan
The block driver in Hyper-V does not support removable media, get rid of the 
blkvsc_revalidate_disk().

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 07/22] Staging: hv: Get rid of the function blkvsc_do_flush()

2011-04-04 Thread K. Y. Srinivasan
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 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 05/22] Staging: hv: Get rid of blkvsc_do_read_capacity()

2011-04-04 Thread K. Y. Srinivasan
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 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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,
- 

[PATCH 11/22] Staging: hv: Get rid of some DPRINT_INFO() statements

2011-04-04 Thread K. Y. Srinivasan
Get rid of some of the DPRINT_INFO() statements.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 12/22] Staging: hv: Get rid of some DPRINT_DBG() calls

2011-04-04 Thread K. Y. Srinivasan
Get rid of some of the DPRINT_DBG() statements.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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;
st

[PATCH 16/22] Staging: hv: Get rid of some DPRINT_ERR() calls

2011-04-04 Thread K. Y. Srinivasan
Get rid of some DPRINT_ERR() calls.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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 
  *   Hank Janssen  
+ *
+ * 4/3/2011: K. Y. Srinivasan - Significant restructuring and cleanup.
  */
 #include 
 #include 
@@ -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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 14/22] Staging: hv: Cleanup storvsc_remove()

2011-04-04 Thread K. Y. Srinivasan
storvsc_remove() cannot fail, clean it up accordingly.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 18/22] Staging: hv: Cleanup blkvsc_open()

2011-04-04 Thread K. Y. Srinivasan
Given that we don't support removable media, cleanup blkvsc_open()


Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 06/22] Staging: hv: Get rid of blkvsc_do_read_capacity16()

2011-04-04 Thread K. Y. Srinivasan
Get rid of blkvsc_do_read_capacity16() and instead use the common function
for retrieving capacity.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 04/22] Staging: hv: Introduce a common function for issuing commands to the device

2011-04-04 Thread K. Y. Srinivasan
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 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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_re

[PATCH 13/22] Staging: hv: Cleanup blkvsc_remove()

2011-04-04 Thread K. Y. Srinivasan
blkvsc_remove() cannot fail. Clean it up accordingly.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 17/22] Staging: hv: Get rid of an unnecessary check in blkvsc_probe()

2011-04-04 Thread K. Y. Srinivasan
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 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 19/22] Staging: hv: Fix a jump label (Cleanup) in blkvsc_drv

2011-04-04 Thread K. Y. Srinivasan
One of the goto labels was named Cleanup; change it to cleanup.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 15/22] Staging: hv: Get rid of the code to manage removable media

2011-04-04 Thread K. Y. Srinivasan
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 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 01/22] Staging: hv: Get rid of blkvsc_media_changed()

2011-04-04 Thread K. Y. Srinivasan
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 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 03/22] Staging: hv: Simplify the code for blkvsc_getgeo()

2011-04-04 Thread K. Y. Srinivasan
We are making up the geometry anyway, keep it simple.

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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 = 0x;
return 0;
+
 }
 
 
-- 
1.7.4.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 02/22] Staging: hv: Enable blkvsc_ioctl()

2011-04-04 Thread K. Y. Srinivasan
We can support HDIO_GET_IDENTITY ioctl, enable blkvsc_ioctl(). 

Signed-off-by: K. Y. Srinivasan 
Signed-off-by: Haiyang Zhang 
Signed-off-by: Hank Janssen 
---
 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

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


[PATCH 00/22] Staging: hv: Cleanup storage drivers - Phase IV

2011-04-04 Thread 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
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


Re: [PATCH RESEND] net: convert xen-netfront to hw_features

2011-04-04 Thread David Miller
From: Ian Campbell 
Date: Mon, 4 Apr 2011 13:29:19 +0100

>>From 0b56469abe56efae415b4603ef508ce9aec0e4c1 Mon Sep 17 00:00:00 2001
> From: Ian Campbell 
> Date: Mon, 4 Apr 2011 10:58:50 +0100
> Subject: [PATCH] xen: netfront: assume all hw features are available until 
> backend connection setup
> 
> We need to assume that all features will be available when registering the
> netdev otherwise they are ommitted from the initial set of
> dev->wanted_features. When we connect to the backed we reduce the set as
> necessary due to the call to netdev_update_features() in xennet_connect().
> 
> Signed-off-by: Ian Campbell 

I've applied this, thanks Ian.
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


Re: [PATCH] virtio: Decrement avail idx on buffer detach

2011-04-04 Thread Amit Shah
On (Mon) 04 Apr 2011 [16:04:40], Rusty Russell wrote:
> On Mon, 28 Mar 2011 19:57:06 +0530, Amit Shah  wrote:
> > On (Thu) 17 Mar 2011 [17:56:59], Amit Shah wrote:
> > > On (Thu) 17 Mar 2011 [15:26:28], Rusty Russell wrote:
> > > > On Wed, 16 Mar 2011 19:12:10 +0530, Amit Shah  
> > > > wrote:
> > > > > When detaching a buffer from a vq, the avail.idx value should be
> > > > > decremented as well.
> > > > > 
> > > > > This was noticed by hot-unplugging a virtio console port and then
> > > > > plugging in a new one on the same number (re-using the vqs which were
> > > > > just 'disowned').  qemu reported
> > > > > 
> > > > >'Guest moved used index from 0 to 256'
> > > > > 
> > > > > when any IO was attempted on the new port.
> > > > 
> > > > Yech... detach_unused_buf cannot be used on a live virtqueue; it assumes
> > > > we will reset the vq (usually by resetting the entire device).
> > > > 
> > > > You've partially violated that assumption by reusing the vq after
> > > > calling detach_unused_buf.  So I'm not entirely sure this is the only
> > > > bug lurking; safer would be to re-initialize the vq somehow when you
> > > > plug back in...
> > > 
> > > Right; and then that will need host changes too (re-init the vqs on
> > > the host side), which then gets us into compat problems...
> > 
> > Rusty, any thoughts on this?
> 
> Yes... I've applied your patch for the moment, and will send to Linus
> with cc' stable.

OK, thanks!

Amit
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


Re: [PATCH RESEND] net: convert xen-netfront to hw_features

2011-04-04 Thread Ian Campbell
On Sat, 2011-04-02 at 04:54 +0100, David Miller wrote:
> From: Michał Mirosław 
> Date: Thu, 31 Mar 2011 13:01:35 +0200 (CEST)
> 
> > Not tested in any way. The original code for offload setting seems broken
> > as it resets the features on every netback reconnect.
> > 
> > This will set GSO_ROBUST at device creation time (earlier than connect 
> > time).
> > 
> > RX checksum offload is forced on - so advertise as it is.
> > 
> > Signed-off-by: Michał Mirosław 
> 
> Applied.

Thanks, but unfortunately the patch results in the features all being
disabled by default, since they are not set in the initial dev->features
and the initial dev->wanted_features is based on features & hw_features.
The ndo_fix_features hook only clears features and doesn't add new
features (nor should it AFAICT).

Features cannot be negotiated with the backend until xennet_connect().
The carrier is not enabled until the end of that function, therefore I
think it is safe to start with a full set of features in dev->features
and rely on the call to netdev_update_features() in xennet_connect() to
clear those which turn out to be unavailable.

The following works for me, I guess the alternative is for
xennet_connect() to expand dev->features based on what it detects? Or is
there a mechanism for a driver to inform the core that a new hardware
feature has become available (I doubt that really happens on physical
h/w so I guess not).

Ian.

8<-

From 0b56469abe56efae415b4603ef508ce9aec0e4c1 Mon Sep 17 00:00:00 2001
From: Ian Campbell 
Date: Mon, 4 Apr 2011 10:58:50 +0100
Subject: [PATCH] xen: netfront: assume all hw features are available until 
backend connection setup

We need to assume that all features will be available when registering the
netdev otherwise they are ommitted from the initial set of
dev->wanted_features. When we connect to the backed we reduce the set as
necessary due to the call to netdev_update_features() in xennet_connect().

Signed-off-by: Ian Campbell 
Cc: mirq-li...@rere.qmqm.pl
Cc: net...@vger.kernel.org 
Cc: Jeremy Fitzhardinge 
Cc: konrad.w...@oracle.com
Cc: Eric Dumazet 
Cc: xen-de...@lists.xensource.com
---
 drivers/net/xen-netfront.c |8 
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index 0cfe4cc..db9a763 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -1251,6 +1251,14 @@ static struct net_device * __devinit 
xennet_create_dev(struct xenbus_device *dev
  NETIF_F_GSO_ROBUST;
netdev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO;
 
+   /*
+ * Assume that all hw features are available for now. This set
+ * will be adjusted by the call to netdev_update_features() in
+ * xennet_connect() which is the earliest point where we can
+ * negotiate with the backend regarding supported features.
+ */
+   netdev->features |= netdev->hw_features;
+
SET_ETHTOOL_OPS(netdev, &xennet_ethtool_ops);
SET_NETDEV_DEV(netdev, &dev->dev);
 
-- 
1.7.2.5



___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization

[PATCH] xen: drop anti-dependency on X86_VISWS (Was: Re: [PATCH] xen: netfront: fix declaration order)

2011-04-04 Thread Ian Campbell
On Mon, 2011-04-04 at 01:24 +0100, David Miller wrote:
> From: Eric Dumazet 
> Date: Sun, 03 Apr 2011 13:07:19 +0200
> 
> > [PATCH] xen: netfront: fix declaration order
> > 
> > Must declare xennet_fix_features() and xennet_set_features() before
> > using them.
> > 
> > Signed-off-by: Eric Dumazet 
> > Cc: Michał Mirosław 
> 
> Ugh, it makes no sense that XEN won't make it into the x86_32
> allmodconfig build.  Those dependencies in arch/x86/xen/Kconfig
> are terrible.

You mean the "!X86_VISWS" I presume? It doesn't make sense to me either.
Or at least I'm not sure why this single X86_32_NON_STANDARD machine is
more special than the others to require an anti-dependency like this.

It seems to have originally appeared from f0f32fccbffa on
CONFIG_PARAVIRT due to a conflict around ARCH_SETUP() and subsequently
got pushed down to CONFIG_XEN. However ARCH_SETUP doesn't exist any more
and I think the subarch stuff has been much improved since then so there
should be no conflict any more.

I dropped the dependency and, with a bit of fiddling, was able to build
a kernel with both CONFIG_X86_VISWS and CONFIG_XEN which booted as a Xen
domU.

tglx, Andrey, to get VISWS to build I had to comment out some code in
arch/x86/platform/visws/visws_quirks.c which seems to have been missed
during some irq_chip update or something?

  CC  arch/x86/platform/visws/visws_quirks.o
arch/x86/platform/visws/visws_quirks.c: In function 
'startup_piix4_master_irq':
arch/x86/platform/visws/visws_quirks.c:474: warning: no return 
statement in function returning non-void
arch/x86/platform/visws/visws_quirks.c: At top level:
arch/x86/platform/visws/visws_quirks.c:495: error: unknown field 'mask' 
specified in initializer
arch/x86/platform/visws/visws_quirks.c:495: warning: initialization 
from incompatible pointer type
arch/x86/platform/visws/visws_quirks.c: In function 
'set_piix4_virtual_irq_type':
arch/x86/platform/visws/visws_quirks.c:583: error: 'struct irq_chip' 
has no member named 'enable'
arch/x86/platform/visws/visws_quirks.c:583: error: 'struct irq_chip' 
has no member named 'unmask'
arch/x86/platform/visws/visws_quirks.c:584: error: 'struct irq_chip' 
has no member named 'disable'
arch/x86/platform/visws/visws_quirks.c:584: error: 'struct irq_chip' 
has no member named 'mask'
arch/x86/platform/visws/visws_quirks.c:585: error: 'struct irq_chip' 
has no member named 'unmask'
arch/x86/platform/visws/visws_quirks.c:585: error: 'struct irq_chip' 
has no member named 'unmask'
arch/x86/platform/visws/visws_quirks.c: In function 
'visws_pre_intr_init':
arch/x86/platform/visws/visws_quirks.c:602: error: expected expression 
before '>' token
make[4]: *** [arch/x86/platform/visws/visws_quirks.o] Error 1

Ian

8<

From db0ae26f479306ee8ebcfe2a08aa56a6dfe63987 Mon Sep 17 00:00:00 2001
From: Ian Campbell 
Date: Mon, 4 Apr 2011 10:27:47 +0100
Subject: [PATCH] xen: drop anti-dependency on X86_VISWS

This seems to have been added in f0f32fccbffa to avoid a conflict arising from
the long deceased ARCH_SETUP() macro and subsequently pushed down to the XEN
option.

As far as I can tell the conflict is no longer present and by dropping the
dependency I was able to build a kernel which has both CONFIG_XEN and
CONFIG_X86_VISWS enabled and boot it on Xen. I didn't try it on the VISWS
platform.

Signed-off-by: Ian Campbell 
Cc: Jeremy Fitzhardinge 
Cc: konrad.w...@oracle.com
Cc: xen-de...@lists.xensource.com
Cc: Randy Dunlap 
Cc: Andrey Panin 
Cc: linux-visws-de...@lists.sf.net
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: "H. Peter Anvin" 
Cc: x...@kernel.org
---
 arch/x86/xen/Kconfig |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig
index 1c7121b..65d7b13 100644
--- a/arch/x86/xen/Kconfig
+++ b/arch/x86/xen/Kconfig
@@ -6,7 +6,7 @@ config XEN
bool "Xen guest support"
select PARAVIRT
select PARAVIRT_CLOCK
-   depends on X86_64 || (X86_32 && X86_PAE && !X86_VISWS)
+   depends on X86_64 || (X86_32 && X86_PAE)
depends on X86_CMPXCHG && X86_TSC
help
  This is the Linux Xen port.  Enabling this will allow the
-- 
1.7.2.5




___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization

Re: Signed bit field; int have_hotplug_status_watch:1

2011-04-04 Thread Ian Campbell
On Sun, 2011-04-03 at 22:32 +0100, Dr. David Alan Gilbert wrote:
> Hi Ian,
>I've been going through some sparse scans of the kernel and
> it threw up:
> 
>   CHECK   drivers/net/xen-netback/xenbus.c
> drivers/net/xen-netback/xenbus.c:29:40: error: dubious one-bit signed bitfield
> 
> int have_hotplug_status_watch:1;
> 
> from your patch f942dc2552b8bfdee607be867b12a8971bb9cd85 
> 
> It does look like that should be an unsigned (given it's assigned
> 0 and 1)

I agree.

8<--

>From 38fdb7199a0c3c5eb18ec27d2380e21116c97e29 Mon Sep 17 00:00:00 2001
From: Ian Campbell 
Date: Mon, 4 Apr 2011 09:18:35 +0100
Subject: [PATCH] xen: netback: use unsigned type for one-bit bitfield.

Fixes error from sparse:
  CHECK   drivers/net/xen-netback/xenbus.c
drivers/net/xen-netback/xenbus.c:29:40: error: dubious one-bit signed bitfield

int have_hotplug_status_watch:1;

Reported-by: Dr. David Alan Gilbert 
Signed-off-by: Ian Campbell 
Cc: net...@vger.kernel.org
Cc: xen-de...@lists.xensource.com
---
 drivers/net/xen-netback/xenbus.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
index 22b8c35..1ce729d 100644
--- a/drivers/net/xen-netback/xenbus.c
+++ b/drivers/net/xen-netback/xenbus.c
@@ -26,7 +26,7 @@ struct backend_info {
struct xenvif *vif;
enum xenbus_state frontend_state;
struct xenbus_watch hotplug_status_watch;
-   int have_hotplug_status_watch:1;
+   u8 have_hotplug_status_watch:1;
 };
 
 static int connect_rings(struct backend_info *);
-- 
1.7.2.5


___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization


Re: [PATCH] virtio: Decrement avail idx on buffer detach

2011-04-04 Thread Rusty Russell
On Mon, 28 Mar 2011 19:57:06 +0530, Amit Shah  wrote:
> On (Thu) 17 Mar 2011 [17:56:59], Amit Shah wrote:
> > On (Thu) 17 Mar 2011 [15:26:28], Rusty Russell wrote:
> > > On Wed, 16 Mar 2011 19:12:10 +0530, Amit Shah  
> > > wrote:
> > > > When detaching a buffer from a vq, the avail.idx value should be
> > > > decremented as well.
> > > > 
> > > > This was noticed by hot-unplugging a virtio console port and then
> > > > plugging in a new one on the same number (re-using the vqs which were
> > > > just 'disowned').  qemu reported
> > > > 
> > > >'Guest moved used index from 0 to 256'
> > > > 
> > > > when any IO was attempted on the new port.
> > > 
> > > Yech... detach_unused_buf cannot be used on a live virtqueue; it assumes
> > > we will reset the vq (usually by resetting the entire device).
> > > 
> > > You've partially violated that assumption by reusing the vq after
> > > calling detach_unused_buf.  So I'm not entirely sure this is the only
> > > bug lurking; safer would be to re-initialize the vq somehow when you
> > > plug back in...
> > 
> > Right; and then that will need host changes too (re-init the vqs on
> > the host side), which then gets us into compat problems...
> 
> Rusty, any thoughts on this?
> 
>   Amit
> 

Yes... I've applied your patch for the moment, and will send to Linus
with cc' stable.

Thanks,
Rusty.
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization