Re: [PATCH] virtio: decrement dev_index when device is unregistered
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
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
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
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
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
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
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
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()
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()
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()
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
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
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
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()
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()
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()
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
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()
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()
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
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
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()
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()
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()
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
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
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
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
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)
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
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
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