Module Name:    src
Committed By:   haad
Date:           Tue May 18 15:10:41 UTC 2010

Modified Files:
        src/sys/dev/dm: device-mapper.c dm.h dm_target.c dm_target_error.c
            dm_target_linear.c dm_target_mirror.c dm_target_snapshot.c
            dm_target_stripe.c dm_target_zero.c

Log Message:
Add support for DIOCCACHESYNC ioctl for dm devices. Add new sync function
pointer to dm_target_t because that is the only part of dm which know real
block device. disk_ioctl_switch parses whole device table and for every
entry it calls particular sync routine which propagates DIOCCACHESYNC
to real disk.

While I was here implement some KNF fixes and remove unneeded symbols from
dm.h.

Problem reported on port-xen@ by Hugo Silva.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/dev/dm/device-mapper.c
cvs rdiff -u -r1.17 -r1.18 src/sys/dev/dm/dm.h
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/dm/dm_target.c \
    src/sys/dev/dm/dm_target_snapshot.c
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/dm/dm_target_error.c \
    src/sys/dev/dm/dm_target_zero.c
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/dm/dm_target_linear.c \
    src/sys/dev/dm/dm_target_stripe.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/dm/dm_target_mirror.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.22 src/sys/dev/dm/device-mapper.c:1.23
--- src/sys/dev/dm/device-mapper.c:1.22	Fri Mar 26 15:46:04 2010
+++ src/sys/dev/dm/device-mapper.c	Tue May 18 15:10:41 2010
@@ -1,4 +1,4 @@
-/*        $NetBSD: device-mapper.c,v 1.22 2010/03/26 15:46:04 jakllsch Exp $ */
+/*        $NetBSD: device-mapper.c,v 1.23 2010/05/18 15:10:41 haad Exp $ */
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -152,6 +152,7 @@
 static int
 dm_modcmd(modcmd_t cmd, void *arg)
 {
+#ifdef _MODULE
 	int error, bmajor, cmajor;
 
 	error = 0;
@@ -209,6 +210,9 @@
 	}
 
 	return error;
+#else
+	return ENOTTY;
+#endif
 }
 #endif /* _MODULE */
 
@@ -470,6 +474,32 @@
 		dm_dev_unbusy(dmv);
 		break;
 	}
+
+	case DIOCCACHESYNC:
+	{
+		dm_table_entry_t *table_en;
+		dm_table_t *tbl;
+		int err;
+		
+		if ((dmv = dm_dev_lookup(NULL, NULL, minor(dev))) == NULL)
+			return ENODEV;
+
+		/* Select active table */
+		tbl = dm_table_get_entry(&dmv->table_head, DM_TABLE_ACTIVE);
+
+		/*
+		 * Call sync target routine for all table entries. Target sync
+		 * routine basically call DIOCCACHESYNC on underlying devices.
+		 */
+		SLIST_FOREACH(table_en, tbl, next)
+		{
+			err = table_en->target->sync(table_en);
+		}
+		dm_table_release(&dmv->table_head, DM_TABLE_ACTIVE);
+		dm_dev_unbusy(dmv);
+		break;
+	}
+		
 	
 	default:
 		aprint_debug("unknown disk_ioctl called\n");

Index: src/sys/dev/dm/dm.h
diff -u src/sys/dev/dm/dm.h:1.17 src/sys/dev/dm/dm.h:1.18
--- src/sys/dev/dm/dm.h:1.17	Tue Dec 29 23:37:48 2009
+++ src/sys/dev/dm/dm.h	Tue May 18 15:10:41 2010
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm.h,v 1.17 2009/12/29 23:37:48 haad Exp $      */
+/*        $NetBSD: dm.h,v 1.18 2010/05/18 15:10:41 haad Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -38,7 +38,9 @@
 #include <sys/errno.h>
 
 #include <sys/atomic.h>
+#include <sys/fcntl.h>
 #include <sys/condvar.h>
+#include <sys/kauth.h>
 #include <sys/mutex.h>
 #include <sys/rwlock.h>
 #include <sys/queue.h>
@@ -226,6 +228,7 @@
 	 */
 	char * (*status)(void *);
 	int (*strategy)(dm_table_entry_t *, struct buf *);
+	int (*sync)(dm_table_entry_t *);
 	int (*upcall)(dm_table_entry_t *, struct buf *);
 	
 	uint32_t version[3];
@@ -284,26 +287,11 @@
 
 #define DM_MAX_PARAMS_SIZE 1024
 
-/* dm_target_zero.c */
-int dm_target_zero_init(dm_dev_t *, void**,  char *);
-char * dm_target_zero_status(void *);
-int dm_target_zero_strategy(dm_table_entry_t *, struct buf *);
-int dm_target_zero_destroy(dm_table_entry_t *);
-int dm_target_zero_deps(dm_table_entry_t *, prop_array_t);
-int dm_target_zero_upcall(dm_table_entry_t *, struct buf *);
-
-/* dm_target_error.c */
-int dm_target_error_init(dm_dev_t *, void**, char *);
-char * dm_target_error_status(void *);
-int dm_target_error_strategy(dm_table_entry_t *, struct buf *);
-int dm_target_error_deps(dm_table_entry_t *, prop_array_t);
-int dm_target_error_destroy(dm_table_entry_t *);
-int dm_target_error_upcall(dm_table_entry_t *, struct buf *);
-
 /* dm_target_linear.c */
 int dm_target_linear_init(dm_dev_t *, void**, char *);
 char * dm_target_linear_status(void *);
 int dm_target_linear_strategy(dm_table_entry_t *, struct buf *);
+int dm_target_linear_sync(dm_table_entry_t *);
 int dm_target_linear_deps(dm_table_entry_t *, prop_array_t);
 int dm_target_linear_destroy(dm_table_entry_t *);
 int dm_target_linear_upcall(dm_table_entry_t *, struct buf *);
@@ -311,38 +299,15 @@
 /* Generic function used to convert char to string */
 uint64_t atoi(const char *); 
 
-/* dm_target_mirror.c */
-int dm_target_mirror_init(dm_dev_t *, void**, char *);
-char * dm_target_mirror_status(void *);
-int dm_target_mirror_strategy(dm_table_entry_t *, struct buf *);
-int dm_target_mirror_deps(dm_table_entry_t *, prop_array_t);
-int dm_target_mirror_destroy(dm_table_entry_t *);
-int dm_target_mirror_upcall(dm_table_entry_t *, struct buf *);
-
 /* dm_target_stripe.c */
 int dm_target_stripe_init(dm_dev_t *, void**, char *);
 char * dm_target_stripe_status(void *);
 int dm_target_stripe_strategy(dm_table_entry_t *, struct buf *);
+int dm_target_stripe_sync(dm_table_entry_t *);
 int dm_target_stripe_deps(dm_table_entry_t *, prop_array_t);
 int dm_target_stripe_destroy(dm_table_entry_t *);
 int dm_target_stripe_upcall(dm_table_entry_t *, struct buf *);
 
-/* dm_target_snapshot.c */
-int dm_target_snapshot_init(dm_dev_t *, void**, char *);
-char * dm_target_snapshot_status(void *);
-int dm_target_snapshot_strategy(dm_table_entry_t *, struct buf *);
-int dm_target_snapshot_deps(dm_table_entry_t *, prop_array_t);
-int dm_target_snapshot_destroy(dm_table_entry_t *);
-int dm_target_snapshot_upcall(dm_table_entry_t *, struct buf *);
-
-/* dm snapshot origin driver */
-int dm_target_snapshot_orig_init(dm_dev_t *, void**, char *);
-char * dm_target_snapshot_orig_status(void *);
-int dm_target_snapshot_orig_strategy(dm_table_entry_t *, struct buf *);
-int dm_target_snapshot_orig_deps(dm_table_entry_t *, prop_array_t);
-int dm_target_snapshot_orig_destroy(dm_table_entry_t *);
-int dm_target_snapshot_orig_upcall(dm_table_entry_t *, struct buf *);
-
 /* dm_table.c  */
 #define DM_TABLE_ACTIVE 0
 #define DM_TABLE_INACTIVE 1

Index: src/sys/dev/dm/dm_target.c
diff -u src/sys/dev/dm/dm_target.c:1.12 src/sys/dev/dm/dm_target.c:1.13
--- src/sys/dev/dm/dm_target.c:1.12	Mon Jan  4 00:14:41 2010
+++ src/sys/dev/dm/dm_target.c	Tue May 18 15:10:41 2010
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_target.c,v 1.12 2010/01/04 00:14:41 haad Exp $      */
+/*        $NetBSD: dm_target.c,v 1.13 2010/05/18 15:10:41 haad Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -289,6 +289,7 @@
 	dmt->init = &dm_target_linear_init;
 	dmt->status = &dm_target_linear_status;
 	dmt->strategy = &dm_target_linear_strategy;
+	dmt->sync = &dm_target_linear_sync;
 	dmt->deps = &dm_target_linear_deps;
 	dmt->destroy = &dm_target_linear_destroy;
 	dmt->upcall = &dm_target_linear_upcall;
@@ -302,39 +303,12 @@
 	dmt3->init = &dm_target_stripe_init;
 	dmt3->status = &dm_target_stripe_status;
 	dmt3->strategy = &dm_target_stripe_strategy;
+	dmt3->sync = &dm_target_stripe_sync;
 	dmt3->deps = &dm_target_stripe_deps;
 	dmt3->destroy = &dm_target_stripe_destroy;
 	dmt3->upcall = &dm_target_stripe_upcall;
 
 	r = dm_target_insert(dmt3);
 
-#ifdef notyet
-	dmt5->version[0] = 1;
-	dmt5->version[1] = 0;
-	dmt5->version[2] = 5;
-	strlcpy(dmt5->name, "snapshot", DM_MAX_TYPE_NAME);
-	dmt5->init = &dm_target_snapshot_init;
-	dmt5->status = &dm_target_snapshot_status;
-	dmt5->strategy = &dm_target_snapshot_strategy;
-	dmt5->deps = &dm_target_snapshot_deps;
-	dmt5->destroy = &dm_target_snapshot_destroy;
-	dmt5->upcall = &dm_target_snapshot_upcall;
-
-	r = dm_target_insert(dmt5);
-
-	dmt6->version[0] = 1;
-	dmt6->version[1] = 0;
-	dmt6->version[2] = 5;
-	strlcpy(dmt6->name, "snapshot-origin", DM_MAX_TYPE_NAME);
-	dmt6->init = &dm_target_snapshot_orig_init;
-	dmt6->status = &dm_target_snapshot_orig_status;
-	dmt6->strategy = &dm_target_snapshot_orig_strategy;
-	dmt6->deps = &dm_target_snapshot_orig_deps;
-	dmt6->destroy = &dm_target_snapshot_orig_destroy;
-	dmt6->upcall = &dm_target_snapshot_orig_upcall;
-
-	r = dm_target_insert(dmt6);
-#endif
-
 	return r;
 }
Index: src/sys/dev/dm/dm_target_snapshot.c
diff -u src/sys/dev/dm/dm_target_snapshot.c:1.12 src/sys/dev/dm/dm_target_snapshot.c:1.13
--- src/sys/dev/dm/dm_target_snapshot.c:1.12	Mon Jan  4 00:12:22 2010
+++ src/sys/dev/dm/dm_target_snapshot.c	Tue May 18 15:10:41 2010
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_target_snapshot.c,v 1.12 2010/01/04 00:12:22 haad Exp $      */
+/*        $NetBSD: dm_target_snapshot.c,v 1.13 2010/05/18 15:10:41 haad Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -85,6 +85,23 @@
 
 #include "dm.h"
 
+/* dm_target_snapshot.c */
+int dm_target_snapshot_init(dm_dev_t *, void**, char *);
+char * dm_target_snapshot_status(void *);
+int dm_target_snapshot_strategy(dm_table_entry_t *, struct buf *);
+int dm_target_snapshot_deps(dm_table_entry_t *, prop_array_t);
+int dm_target_snapshot_destroy(dm_table_entry_t *);
+int dm_target_snapshot_upcall(dm_table_entry_t *, struct buf *);
+
+/* dm snapshot origin driver */
+int dm_target_snapshot_orig_init(dm_dev_t *, void**, char *);
+char * dm_target_snapshot_orig_status(void *);
+int dm_target_snapshot_orig_strategy(dm_table_entry_t *, struct buf *);
+int dm_target_snapshot_orig_sync(dm_table_entry_t *);
+int dm_target_snapshot_orig_deps(dm_table_entry_t *, prop_array_t);
+int dm_target_snapshot_orig_destroy(dm_table_entry_t *);
+int dm_target_snapshot_orig_upcall(dm_table_entry_t *, struct buf *);
+
 #ifdef DM_TARGET_MODULE
 /*
  * Every target can be compiled directly to dm driver or as a
@@ -140,6 +157,7 @@
 		dmt1->init = &dm_target_snapshot_orig_init;
 		dmt1->status = &dm_target_snapshot_orig_status;
 		dmt1->strategy = &dm_target_snapshot_orig_strategy;
+		dmt1->sync = &dm_target_snapshot_orig_sync;
 		dmt1->deps = &dm_target_snapshot_orig_deps;
 		dmt1->destroy = &dm_target_snapshot_orig_destroy;
 		dmt1->upcall = &dm_target_snapshot_orig_upcall;
@@ -381,8 +399,7 @@
  * argv: /dev/mapper/my_data_real
  */
 int
-dm_target_snapshot_orig_init(dm_dev_t * dmv, void **target_config,
-    prop_dictionary_t dict)
+dm_target_snapshot_orig_init(dm_dev_t * dmv, void **target_config, char *params)
 {
 	dm_target_snapshot_origin_config_t *tsoc;
 	dm_pdev_t *dmp_real;
@@ -456,6 +473,21 @@
 
 	return 0;
 }
+/*
+ * Sync underlying disk caches.
+ */
+int
+dm_target_snapshot_orig_sync(dm_table_entry_t * table_en)
+{
+	int cmd;
+	dm_target_snapshot_origin_config_t *tsoc;
+
+	tsoc = table_en->target_config;
+
+	cmd = 1;
+
+	return VOP_IOCTL(tsoc->tsoc_real_dev->pdev_vnode,  DIOCCACHESYNC, &cmd, FREAD|FWRITE, kauth_cred_get());
+}
 /* Decrement pdev and free allocated space. */
 int
 dm_target_snapshot_orig_destroy(dm_table_entry_t * table_en)

Index: src/sys/dev/dm/dm_target_error.c
diff -u src/sys/dev/dm/dm_target_error.c:1.10 src/sys/dev/dm/dm_target_error.c:1.11
--- src/sys/dev/dm/dm_target_error.c:1.10	Mon Jan  4 00:12:22 2010
+++ src/sys/dev/dm/dm_target_error.c	Tue May 18 15:10:41 2010
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_target_error.c,v 1.10 2010/01/04 00:12:22 haad Exp $      */
+/*        $NetBSD: dm_target_error.c,v 1.11 2010/05/18 15:10:41 haad Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -39,6 +39,15 @@
 
 #include "dm.h"
 
+/* dm_target_error.c */
+int dm_target_error_init(dm_dev_t *, void**, char *);
+char * dm_target_error_status(void *);
+int dm_target_error_strategy(dm_table_entry_t *, struct buf *);
+int dm_target_error_sync(dm_table_entry_t *);
+int dm_target_error_deps(dm_table_entry_t *, prop_array_t);
+int dm_target_error_destroy(dm_table_entry_t *);
+int dm_target_error_upcall(dm_table_entry_t *, struct buf *);
+
 #ifdef DM_TARGET_MODULE
 /*
  * Every target can be compiled directly to dm driver or as a
@@ -74,6 +83,7 @@
 		dmt->init = &dm_target_error_init;
 		dmt->status = &dm_target_error_status;
 		dmt->strategy = &dm_target_error_strategy;
+		dmt->sync = &dm_target_error_sync;
 		dmt->deps = &dm_target_error_deps;
 		dmt->destroy = &dm_target_error_destroy;
 		dmt->upcall = &dm_target_error_upcall;
@@ -130,6 +140,13 @@
 
 	return 0;
 }
+/* Sync underlying disk caches. */
+int
+dm_target_error_sync(dm_table_entry_t * table_en)
+{
+
+	return 0;
+}
 /* Doesn't do anything here. */
 int
 dm_target_error_destroy(dm_table_entry_t * table_en)
Index: src/sys/dev/dm/dm_target_zero.c
diff -u src/sys/dev/dm/dm_target_zero.c:1.10 src/sys/dev/dm/dm_target_zero.c:1.11
--- src/sys/dev/dm/dm_target_zero.c:1.10	Mon Jan  4 00:12:22 2010
+++ src/sys/dev/dm/dm_target_zero.c	Tue May 18 15:10:41 2010
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_target_zero.c,v 1.10 2010/01/04 00:12:22 haad Exp $      */
+/*        $NetBSD: dm_target_zero.c,v 1.11 2010/05/18 15:10:41 haad Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -40,6 +40,15 @@
 
 #include "dm.h"
 
+/* dm_target_zero.c */
+int dm_target_zero_init(dm_dev_t *, void**,  char *);
+char * dm_target_zero_status(void *);
+int dm_target_zero_strategy(dm_table_entry_t *, struct buf *);
+int dm_target_zero_sync(dm_table_entry_t *);
+int dm_target_zero_destroy(dm_table_entry_t *);
+int dm_target_zero_deps(dm_table_entry_t *, prop_array_t);
+int dm_target_zero_upcall(dm_table_entry_t *, struct buf *);
+
 #ifdef DM_TARGET_MODULE
 /*
  * Every target can be compiled directly to dm driver or as a
@@ -75,6 +84,7 @@
 		dmt->init = &dm_target_zero_init;
 		dmt->status = &dm_target_zero_status;
 		dmt->strategy = &dm_target_zero_strategy;
+		dmt->sync = &dm_target_zero_sync;		 
 		dmt->deps = &dm_target_zero_deps;
 		dmt->destroy = &dm_target_zero_destroy;
 		dmt->upcall = &dm_target_zero_upcall;
@@ -139,6 +149,13 @@
 
 	return 0;
 }
+/* Sync underlying disk caches. */
+int
+dm_target_zero_sync(dm_table_entry_t * table_en)
+{
+
+	return 0;
+}
 /* Doesn't not need to do anything here. */
 int
 dm_target_zero_destroy(dm_table_entry_t * table_en)

Index: src/sys/dev/dm/dm_target_linear.c
diff -u src/sys/dev/dm/dm_target_linear.c:1.9 src/sys/dev/dm/dm_target_linear.c:1.10
--- src/sys/dev/dm/dm_target_linear.c:1.9	Mon Jan  4 00:14:41 2010
+++ src/sys/dev/dm/dm_target_linear.c	Tue May 18 15:10:41 2010
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_target_linear.c,v 1.9 2010/01/04 00:14:41 haad Exp $      */
+/*        $NetBSD: dm_target_linear.c,v 1.10 2010/05/18 15:10:41 haad Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -141,6 +141,22 @@
 
 }
 /*
+ * Sync underlying disk caches.
+ */
+int
+dm_target_linear_sync(dm_table_entry_t * table_en)
+{
+	int cmd;
+	dm_target_linear_config_t *tlc;
+
+	tlc = table_en->target_config;
+
+	cmd = 1;
+	
+	return VOP_IOCTL(tlc->pdev->pdev_vnode,  DIOCCACHESYNC, &cmd,
+	    FREAD|FWRITE, kauth_cred_get());	
+}
+/*
  * Destroy target specific data. Decrement table pdevs.
  */
 int
Index: src/sys/dev/dm/dm_target_stripe.c
diff -u src/sys/dev/dm/dm_target_stripe.c:1.9 src/sys/dev/dm/dm_target_stripe.c:1.10
--- src/sys/dev/dm/dm_target_stripe.c:1.9	Mon Jan  4 00:14:41 2010
+++ src/sys/dev/dm/dm_target_stripe.c	Tue May 18 15:10:41 2010
@@ -1,4 +1,4 @@
-/*$NetBSD: dm_target_stripe.c,v 1.9 2010/01/04 00:14:41 haad Exp $*/
+/*$NetBSD: dm_target_stripe.c,v 1.10 2010/05/18 15:10:41 haad Exp $*/
 
 /*
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -76,6 +76,7 @@
 		dmt->init = &dm_target_stripe_init;
 		dmt->status = &dm_target_stripe_status;
 		dmt->strategy = &dm_target_stripe_strategy;
+		dmt->sync = &dm_target_stripe_sync;
 		dmt->deps = &dm_target_stripe_deps;
 		dmt->destroy = &dm_target_stripe_destroy;
 		dmt->upcall = &dm_target_stripe_upcall;
@@ -237,7 +238,28 @@
 
 	return 0;
 }
-/* Doesn't do anything here. */
+/* Sync underlying disk caches. */
+int
+dm_target_stripe_sync(dm_table_entry_t * table_en)
+{
+	int cmd, err, i;
+	dm_target_stripe_config_t *tsc;
+
+	tsc = table_en->target_config;
+
+	err = 0;
+	cmd = 1;
+
+	for (i = 0; i < tsc->stripe_num; i++) {
+		if ((err = VOP_IOCTL(tsc->stripe_devs[i].pdev->pdev_vnode, DIOCCACHESYNC,
+			    &cmd, FREAD|FWRITE, kauth_cred_get())) != 0)
+			return err;
+	}
+	
+	return err;
+
+}
+/* Destroy target specific data. */
 int
 dm_target_stripe_destroy(dm_table_entry_t * table_en)
 {

Index: src/sys/dev/dm/dm_target_mirror.c
diff -u src/sys/dev/dm/dm_target_mirror.c:1.8 src/sys/dev/dm/dm_target_mirror.c:1.9
--- src/sys/dev/dm/dm_target_mirror.c:1.8	Mon Jan  4 00:12:22 2010
+++ src/sys/dev/dm/dm_target_mirror.c	Tue May 18 15:10:41 2010
@@ -1,4 +1,4 @@
-/*$NetBSD: dm_target_mirror.c,v 1.8 2010/01/04 00:12:22 haad Exp $*/
+/*$NetBSD: dm_target_mirror.c,v 1.9 2010/05/18 15:10:41 haad Exp $*/
 
 /*
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -39,6 +39,15 @@
 
 #include "dm.h"
 
+/* dm_target_mirror.c */
+int dm_target_mirror_init(dm_dev_t *, void**, char *);
+char * dm_target_mirror_status(void *);
+int dm_target_mirror_strategy(dm_table_entry_t *, struct buf *);
+int dm_target_mirror_sync(dm_table_entry_t *);
+int dm_target_mirror_deps(dm_table_entry_t *, prop_array_t);
+int dm_target_mirror_destroy(dm_table_entry_t *);
+int dm_target_mirror_upcall(dm_table_entry_t *, struct buf *);
+
 #ifdef DM_TARGET_MODULE
 /*
  * Every target can be compiled directly to dm driver or as a
@@ -74,6 +83,7 @@
 		dmt->init = &dm_target_mirror_init;
 		dmt->status = &dm_target_mirror_status;
 		dmt->strategy = &dm_target_mirror_strategy;
+		dmt->sync = &dm_target_mirror_sync;
 		dmt->deps = &dm_target_mirror_deps;
 		dmt->destroy = &dm_target_mirror_destroy;
 		dmt->upcall = &dm_target_mirror_upcall;
@@ -134,6 +144,13 @@
 
 	return 0;
 }
+/* Sync underlying disk caches. */
+int
+dm_target_mirror_sync(dm_table_entry_t * table_en)
+{
+
+	return 0;
+}
 /* Doesn't do anything here. */
 int
 dm_target_mirror_destroy(dm_table_entry_t * table_en)

Reply via email to