From 15534d3803993345d8db32246ec329d8f83502e1 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 18 Nov 2005 22:02:44 +0100 Subject: [PATCH 2/3] cciss: bug fix for BIG_PASS_THRU Applications using CCISS_BIG_PASSTHRU complained that the data written was zeros. The problem is that the buffer is being cleared after the user copy, unless the user copy has failed... Correct that logic. Signed-off-by: Mike Miller Signed-off-by: Jens Axboe --- drivers/block/cciss.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'drivers') diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index e239a6c..33f8341 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -1017,10 +1017,11 @@ static int cciss_ioctl(struct inode *inode, struct file *filep, status = -ENOMEM; goto cleanup1; } - if (ioc->Request.Type.Direction == XFER_WRITE && - copy_from_user(buff[sg_used], data_ptr, sz)) { + if (ioc->Request.Type.Direction == XFER_WRITE) { + if (copy_from_user(buff[sg_used], data_ptr, sz)) { status = -ENOMEM; - goto cleanup1; + goto cleanup1; + } } else { memset(buff[sg_used], 0, sz); } -- cgit v1.1 From 6f5a0f7c955d3567f800fa36f978758cb5b99aa2 Mon Sep 17 00:00:00 2001 From: mikem Date: Fri, 18 Nov 2005 22:05:36 +0100 Subject: [PATCH 3/3] cciss: add put_disk into cleanup routines Jeff Garzik pointed me to his code to see how to remove a disk from the system _properly_. Well, here it is... Every place we remove disks we are now testing before calling del_gendisk or blk_cleanup_queue and then call put_disk. Signed-off-by: Mike Miller Signed-off-by: Jens Axboe --- drivers/block/cciss.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'drivers') diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 33f8341..a9e33db 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -1139,8 +1139,15 @@ static int revalidate_allvol(ctlr_info_t *host) for(i=0; i< NWD; i++) { struct gendisk *disk = host->gendisk[i]; - if (disk->flags & GENHD_FL_UP) - del_gendisk(disk); + if (disk) { + request_queue_t *q = disk->queue; + + if (disk->flags & GENHD_FL_UP) + del_gendisk(disk); + if (q) + blk_cleanup_queue(q); + put_disk(disk); + } } /* @@ -1454,10 +1461,13 @@ static int deregister_disk(struct gendisk *disk, drive_info_struct *drv, * allows us to delete disk zero but keep the controller registered. */ if (h->gendisk[0] != disk){ - if (disk->flags & GENHD_FL_UP){ - blk_cleanup_queue(disk->queue); - del_gendisk(disk); - drv->queue = NULL; + if (disk) { + request_queue_t *q = disk->queue; + if (disk->flags & GENHD_FL_UP) + del_gendisk(disk); + if (q) + blk_cleanup_queue(q); + put_disk(disk); } } @@ -3226,9 +3236,14 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev) /* remove it from the disk list */ for (j = 0; j < NWD; j++) { struct gendisk *disk = hba[i]->gendisk[j]; - if (disk->flags & GENHD_FL_UP) { - del_gendisk(disk); - blk_cleanup_queue(disk->queue); + if (disk) { + request_queue_t *q = disk->queue; + + if (disk->flags & GENHD_FL_UP) + del_gendisk(disk); + if (q) + blk_cleanup_queue(q); + put_disk(disk); } } -- cgit v1.1