Module Name: src Committed By: christos Date: Tue Aug 19 14:43:28 UTC 2014
Modified Files: src/sys/dev/dm: dm_target_stripe.c Log Message: cleanup properly on error. To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/dev/dm/dm_target_stripe.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/dm_target_stripe.c diff -u src/sys/dev/dm/dm_target_stripe.c:1.20 src/sys/dev/dm/dm_target_stripe.c:1.21 --- src/sys/dev/dm/dm_target_stripe.c:1.20 Mon Aug 18 13:16:42 2014 +++ src/sys/dev/dm/dm_target_stripe.c Tue Aug 19 10:43:28 2014 @@ -1,4 +1,4 @@ -/*$NetBSD: dm_target_stripe.c,v 1.20 2014/08/18 17:16:42 agc Exp $*/ +/*$NetBSD: dm_target_stripe.c,v 1.21 2014/08/19 14:43:28 christos Exp $*/ /* * Copyright (c) 2009 The NetBSD Foundation, Inc. @@ -102,6 +102,23 @@ dm_target_stripe_modcmd(modcmd_t cmd, vo } #endif +static void +dm_target_stripe_fini(dm_target_stripe_config_t *tsc) +{ + dm_target_linear_config_t *tlc; + + if (tsc == NULL) + return; + + while ((tlc = TAILQ_FIRST(&tsc->stripe_devs)) != NULL) { + TAILQ_REMOVE(&tsc->stripe_devs, tlc, entries); + dm_pdev_decr(tlc->pdev); + kmem_free(tlc, sizeof(*tlc)); + } + + kmem_free(tsc, sizeof(*tsc)); +} + /* * Init function called from dm_table_load_ioctl. * DM_STRIPE_DEV_OFFSET should always hold the index of the first device-offset @@ -157,8 +174,8 @@ dm_target_stripe_init(dm_dev_t * dmv, vo tlc = kmem_alloc(sizeof(*tlc), KM_NOSLEEP); if ((tlc->pdev = dm_pdev_insert(argv[strpi])) == NULL) { - kmem_free(tsc, sizeof(*tsc)); kmem_free(tlc, sizeof(*tlc)); + dm_target_stripe_fini(tsc); return ENOENT; } tlc->offset = atoi(argv[strpi+1]); @@ -295,27 +312,12 @@ dm_target_stripe_sync(dm_table_entry_t * int dm_target_stripe_destroy(dm_table_entry_t * table_en) { - dm_target_stripe_config_t *tsc; - dm_target_linear_config_t *tlc; - - tsc = table_en->target_config; - - if (tsc == NULL) - return 0; - - while ((tlc = TAILQ_FIRST(&tsc->stripe_devs)) != NULL) { - TAILQ_REMOVE(&tsc->stripe_devs, tlc, entries); - dm_pdev_decr(tlc->pdev); - kmem_free(tlc, sizeof(*tlc)); - } + dm_target_stripe_fini(table_en->target_config); /* Unbusy target so we can unload it */ dm_target_unbusy(table_en->target); - kmem_free(tsc, sizeof(*tsc)); - table_en->target_config = NULL; - return 0; } /* Doesn't not need to do anything here. */