? dm1.diff ? dm_diocachesync.diff Index: device-mapper.c =================================================================== RCS file: /cvsroot/src/sys/dev/dm/device-mapper.c,v retrieving revision 1.22 diff -u -p -r1.22 device-mapper.c --- device-mapper.c 26 Mar 2010 15:46:04 -0000 1.22 +++ device-mapper.c 11 May 2010 21:59:49 -0000 @@ -152,6 +152,7 @@ MODULE(MODULE_CLASS_DRIVER, dm, NULL); static int dm_modcmd(modcmd_t cmd, void *arg) { +#ifdef _MODULE int error, bmajor, cmajor; error = 0; @@ -209,6 +210,9 @@ dm_modcmd(modcmd_t cmd, void *arg) } return error; +#else + return ENOTTY; +#endif } #endif /* _MODULE */ @@ -470,6 +474,32 @@ disk_ioctl_switch(dev_t dev, u_long cmd, 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: dm.h =================================================================== RCS file: /cvsroot/src/sys/dev/dm/dm.h,v retrieving revision 1.17 diff -u -p -r1.17 dm.h --- dm.h 29 Dec 2009 23:37:48 -0000 1.17 +++ dm.h 11 May 2010 21:59:49 -0000 @@ -38,7 +38,9 @@ #include #include +#include #include +#include #include #include #include @@ -226,6 +228,7 @@ typedef struct dm_target { */ 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 @@ int dm_target_init(void); #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 @@ int dm_target_linear_upcall(dm_table_ent /* 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: dm_ioctl.c =================================================================== RCS file: /cvsroot/src/sys/dev/dm/dm_ioctl.c,v retrieving revision 1.21 diff -u -p -r1.21 dm_ioctl.c --- dm_ioctl.c 25 Feb 2010 20:48:58 -0000 1.21 +++ dm_ioctl.c 11 May 2010 21:59:50 -0000 @@ -47,7 +47,7 @@ * To access table entries dm_table_* routines must be used. * * dm_table_get_entry will increment table users reference - * counter. It will return active or inactive table depedns + * counter. It will return active or inactive table depends * on uint8_t argument. * * dm_table_release must be called for every table_entry from Index: dm_target.c =================================================================== RCS file: /cvsroot/src/sys/dev/dm/dm_target.c,v retrieving revision 1.12 diff -u -p -r1.12 dm_target.c --- dm_target.c 4 Jan 2010 00:14:41 -0000 1.12 +++ dm_target.c 11 May 2010 21:59:50 -0000 @@ -289,6 +289,7 @@ dm_target_init(void) 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 @@ dm_target_init(void) 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: dm_target_error.c =================================================================== RCS file: /cvsroot/src/sys/dev/dm/dm_target_error.c,v retrieving revision 1.10 diff -u -p -r1.10 dm_target_error.c --- dm_target_error.c 4 Jan 2010 00:12:22 -0000 1.10 +++ dm_target_error.c 11 May 2010 21:59:50 -0000 @@ -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 @@ dm_target_error_modcmd(modcmd_t cmd, voi 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 @@ dm_target_error_strategy(dm_table_entry_ 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: dm_target_linear.c =================================================================== RCS file: /cvsroot/src/sys/dev/dm/dm_target_linear.c,v retrieving revision 1.9 diff -u -p -r1.9 dm_target_linear.c --- dm_target_linear.c 4 Jan 2010 00:14:41 -0000 1.9 +++ dm_target_linear.c 11 May 2010 21:59:50 -0000 @@ -141,6 +141,22 @@ dm_target_linear_strategy(dm_table_entry } /* + * 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: dm_target_mirror.c =================================================================== RCS file: /cvsroot/src/sys/dev/dm/dm_target_mirror.c,v retrieving revision 1.8 diff -u -p -r1.8 dm_target_mirror.c --- dm_target_mirror.c 4 Jan 2010 00:12:22 -0000 1.8 +++ dm_target_mirror.c 11 May 2010 21:59:50 -0000 @@ -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 @@ dm_target_mirror_modcmd(modcmd_t cmd, vo 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 @@ dm_target_mirror_strategy(dm_table_entry 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) Index: dm_target_snapshot.c =================================================================== RCS file: /cvsroot/src/sys/dev/dm/dm_target_snapshot.c,v retrieving revision 1.12 diff -u -p -r1.12 dm_target_snapshot.c --- dm_target_snapshot.c 4 Jan 2010 00:12:22 -0000 1.12 +++ dm_target_snapshot.c 11 May 2010 21:59:50 -0000 @@ -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 @@ dm_target_snapshot_modcmd(modcmd_t cmd, 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 @@ dm_target_snapshot_upcall(dm_table_entry * 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 @@ dm_target_snapshot_orig_strategy(dm_tabl 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: dm_target_stripe.c =================================================================== RCS file: /cvsroot/src/sys/dev/dm/dm_target_stripe.c,v retrieving revision 1.9 diff -u -p -r1.9 dm_target_stripe.c --- dm_target_stripe.c 4 Jan 2010 00:14:41 -0000 1.9 +++ dm_target_stripe.c 11 May 2010 21:59:50 -0000 @@ -76,6 +76,7 @@ dm_target_stripe_modcmd(modcmd_t cmd, vo 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 @@ dm_target_stripe_strategy(dm_table_entry 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: dm_target_zero.c =================================================================== RCS file: /cvsroot/src/sys/dev/dm/dm_target_zero.c,v retrieving revision 1.10 diff -u -p -r1.10 dm_target_zero.c --- dm_target_zero.c 4 Jan 2010 00:12:22 -0000 1.10 +++ dm_target_zero.c 11 May 2010 21:59:50 -0000 @@ -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 @@ dm_target_zero_modcmd(modcmd_t cmd, void 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 @@ dm_target_zero_strategy(dm_table_entry_t 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)