Module Name:    src
Committed By:   haad
Date:           Mon Apr  6 22:58:10 UTC 2009

Modified Files:
        src/sys/dev/dm: device-mapper.c dm_ioctl.c

Log Message:
Use functions from disk(9) framework. Initialize disk/disklabel during
dm_device_create_ioctl, before calling dmgetdisklabel.
Use disk_busy/disk_unbusy in dmstrategy to display LVM LV's in iostat
output.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/dm/device-mapper.c
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/dm/dm_ioctl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/dm/device-mapper.c
diff -u src/sys/dev/dm/device-mapper.c:1.5 src/sys/dev/dm/device-mapper.c:1.6
--- src/sys/dev/dm/device-mapper.c:1.5	Thu Jan 22 04:56:06 2009
+++ src/sys/dev/dm/device-mapper.c	Mon Apr  6 22:58:10 2009
@@ -1,4 +1,4 @@
-/*        $NetBSD: device-mapper.c,v 1.5 2009/01/22 04:56:06 agc Exp $ */
+/*        $NetBSD: device-mapper.c,v 1.6 2009/04/06 22:58:10 haad Exp $ */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -55,7 +55,6 @@
 static dev_type_write(dmwrite);
 static dev_type_ioctl(dmioctl);
 static dev_type_strategy(dmstrategy);
-static dev_type_dump(dmdump);
 static dev_type_size(dmsize);
 
 /* attach and detach routines */
@@ -69,12 +68,31 @@
 
 /* ***Variable-definitions*** */
 const struct bdevsw dm_bdevsw = {
-	dmopen, dmclose, dmstrategy, dmioctl, dmdump, dmsize, D_DISK | D_MPSAFE
+	.d_open = dmopen,
+	.d_close = dmclose,
+	.d_strategy = dmstrategy,
+	.d_ioctl = dmioctl,
+	.d_dump = nodump,
+	.d_psize = dmsize,
+	.d_flag = D_DISK | D_MPSAFE
 };
 
 const struct cdevsw dm_cdevsw = {
-	dmopen, dmclose, dmread, dmwrite, dmioctl,
-	nostop, notty, nopoll, nommap, nokqfilter, D_DISK | D_MPSAFE
+	.d_open = dmopen,
+	.d_close = dmclose,
+	.d_read = dmread,
+	.d_write = dmwrite,
+	.d_ioctl = dmioctl,
+	.d_stop = nostop,
+	.d_tty = notty,
+	.d_poll = nopoll,
+	.d_mmap = nommap,
+	.d_kqfilter = nokqfilter,
+	.d_flag = D_DISK | D_MPSAFE
+};
+
+const struct dkdriver dmdkdriver = {
+	.d_strategy = dmstrategy
 };
 
 extern uint64_t dev_counter;
@@ -89,21 +107,21 @@
  *
  */
 struct cmd_function cmd_fn[] = {
-		{"version", dm_get_version_ioctl},
-		{"targets", dm_list_versions_ioctl},
-		{"create",  dm_dev_create_ioctl},
-		{"info",    dm_dev_status_ioctl},
-		{"mknodes", dm_dev_status_ioctl},		
-		{"names",   dm_dev_list_ioctl},
-		{"suspend", dm_dev_suspend_ioctl},
-		{"remove",  dm_dev_remove_ioctl}, 
-		{"rename",  dm_dev_rename_ioctl},
-		{"resume",  dm_dev_resume_ioctl},
-		{"clear",   dm_table_clear_ioctl},
-		{"deps",    dm_table_deps_ioctl},
-		{"reload",  dm_table_load_ioctl},
-		{"status",  dm_table_status_ioctl},
-		{"table",   dm_table_status_ioctl},
+		{ .cmd = "version", .fn = dm_get_version_ioctl},
+		{ .cmd = "targets", .fn = dm_list_versions_ioctl},
+		{ .cmd = "create",  .fn = dm_dev_create_ioctl},
+		{ .cmd = "info",    .fn = dm_dev_status_ioctl},
+		{ .cmd = "mknodes", .fn = dm_dev_status_ioctl},		
+		{ .cmd = "names",   .fn = dm_dev_list_ioctl},
+		{ .cmd = "suspend", .fn = dm_dev_suspend_ioctl},
+		{ .cmd = "remove",  .fn = dm_dev_remove_ioctl}, 
+		{ .cmd = "rename",  .fn = dm_dev_rename_ioctl},
+		{ .cmd = "resume",  .fn = dm_dev_resume_ioctl},
+		{ .cmd = "clear",   .fn = dm_table_clear_ioctl},
+		{ .cmd = "deps",    .fn = dm_table_deps_ioctl},
+		{ .cmd = "reload",  .fn = dm_table_load_ioctl},
+		{ .cmd = "status",  .fn = dm_table_status_ioctl},
+		{ .cmd = "table",   .fn = dm_table_status_ioctl},
 		{NULL, NULL}	
 };
 
@@ -383,6 +401,9 @@
 		biodone(bp);
 		return;
 	} 
+
+	/* FIXME: have to be called with IPL_BIO*/
+	disk_busy(dmv->diskp);
 	
 	/* Select active table */
 	tbl = dm_table_get_entry(&dmv->table_head, DM_TABLE_ACTIVE);
@@ -438,6 +459,9 @@
 	if (issued_len < buf_len)
 		nestiobuf_done(bp, buf_len - issued_len, EINVAL);
 
+	/* FIXME have to be called with SPL_BIO*/
+	disk_unbusy(dmv->diskp, buf_len, bp != NULL ? bp->b_flags & B_READ : 0);
+	
 	dm_table_release(&dmv->table_head, DM_TABLE_ACTIVE);
 	dm_dev_unbusy(dmv);
 
@@ -458,12 +482,6 @@
 }
 
 static int
-dmdump(dev_t dev, daddr_t blkno, void *va, size_t size)
-{
-	return ENODEV;
-}
-
-static int
 dmsize(dev_t dev)
 {
 	dm_dev_t *dmv;

Index: src/sys/dev/dm/dm_ioctl.c
diff -u src/sys/dev/dm/dm_ioctl.c:1.9 src/sys/dev/dm/dm_ioctl.c:1.10
--- src/sys/dev/dm/dm_ioctl.c:1.9	Sun Mar  8 02:07:38 2009
+++ src/sys/dev/dm/dm_ioctl.c	Mon Apr  6 22:58:10 2009
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_ioctl.c,v 1.9 2009/03/08 02:07:38 agc Exp $      */
+/*        $NetBSD: dm_ioctl.c,v 1.10 2009/04/06 22:58:10 haad Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -93,6 +93,7 @@
 #include "dm.h"
 
 static uint64_t      sc_minor_num; 
+extern const struct dkdriver dmdkdriver;
 uint64_t dev_counter;
 
 #define DM_REMOVE_FLAG(flag, name) do {					\
@@ -247,9 +248,12 @@
 
 	prop_dictionary_set_uint32(dm_dict, DM_IOCTL_MINOR, dmv->minor);
 
-	disk_init(dmv->diskp, dmv->name, NULL);
-
+	disk_init(dmv->diskp, dmv->name, &dmdkdriver);
+	disk_attach(dmv->diskp);
+	
 	if ((r = dm_dev_insert(dmv)) != 0){
+		mutex_destroy(&dmv->dev_mtx);
+		cv_destroy(&dmv->dev_cv);
 		dm_dev_free(dmv);
 	}
 	
@@ -398,6 +402,10 @@
 
 	mutex_destroy(&dmv->dev_mtx);
 	cv_destroy(&dmv->dev_cv);
+
+	/* Destroy disk device structure */
+	disk_detach(dmv->diskp);
+	disk_destroy(dmv->diskp);
 	
 	/* Destroy device */
 	(void)dm_dev_free(dmv);
@@ -535,16 +543,12 @@
 
 	atomic_and_32(&dmv->flags, ~(DM_SUSPEND_FLAG | DM_INACTIVE_PRESENT_FLAG));
 	atomic_or_32(&dmv->flags, DM_ACTIVE_PRESENT_FLAG);
-
 	
 	dm_table_switch_tables(&dmv->table_head);
 		
 	DM_ADD_FLAG(flags, DM_EXISTS_FLAG);	
 
 	dmgetdisklabel(dmv->diskp->dk_label, &dmv->table_head);
-
-	disk_attach(dmv->diskp);
-	dmgetdisklabel(dmv->diskp->dk_label, &dmv->table_head);
 	
 	prop_dictionary_set_uint32(dm_dict, DM_IOCTL_OPEN, dmv->table_head.io_cnt);
 	prop_dictionary_set_uint32(dm_dict, DM_IOCTL_FLAGS, dmv->flags);

Reply via email to