Re: [PATCH] iSeries virtual disk

From: Christoph Hellwig
Date: Fri Feb 27 2004 - 08:48:33 EST


On Fri, Feb 27, 2004 at 02:37:17PM +0100, Christoph Hellwig wrote:
> Here's a totally untested patch to fix it up:

And a better one that makes viodasd_max_disks properly start at 0.


--- 1.1/drivers/block/viodasd.c Fri Feb 27 06:25:15 2004
+++ edited/drivers/block/viodasd.c Fri Feb 27 15:44:03 2004
@@ -209,7 +209,6 @@
(int)we.rc, we.sub_result, err->msg);
return -EIO;
}
- viodasd_max_disk = we.max_disk;

return 0;
}
@@ -451,10 +450,9 @@
}

/*
- * Probe a single disk and fill in the viodasd_device structure
- * for it.
+ * Probe a single disk and fill in the viodasd_device structure for it.
*/
-static void probe_disk(struct viodasd_device *d)
+static void __init probe_disk(struct viodasd_device *d)
{
HvLpEvent_Rc hvrc;
struct viodasd_waitevent we;
@@ -483,7 +481,8 @@

if (we.rc != 0)
return;
- viodasd_max_disk = we.max_disk;
+
+ viodasd_max_disk = min(we.max_disk - 1, MAX_DISKNO);

/* Send the close event to OS/400. We DON'T expect a response */
hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp,
@@ -744,27 +743,13 @@
/* Initialize our request handler */
vio_setHandler(viomajorsubtype_blockio, handle_block_event);

- viodasd_max_disk = MAX_DISKNO - 1;
- for (i = 0; (i <= viodasd_max_disk) && (i < MAX_DISKNO); i++) {
- /*
- * Note that probe_disk has side effects:
- * a) it updates the size of the disk
- * b) it updates viodasd_max_disk
- * c) it registers the disk if it has not done so already
- */
+ /* probe_disk updates viodasd_max_disk */
+ for (i = 0; i < viodasd_max_disk; i++)
probe_disk(&viodasd_devices[i]);
- }
-
- if (viodasd_max_disk > (MAX_DISKNO - 1))
- printk(VIOD_KERN_INFO
- "Only examining the first %d of %d disks connected\n",
- MAX_DISKNO, viodasd_max_disk + 1);
-
return 0;
}
-module_init(viodasd_init);

-void viodasd_exit(void)
+static void __exit viodasd_exit(void)
{
int i;
struct viodasd_device *d;
@@ -783,4 +768,5 @@
viopath_close(viopath_hostLp, viomajorsubtype_blockio, VIOMAXREQ + 2);
}

+module_init(viodasd_init);
module_exit(viodasd_exit);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/