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);