Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/ufs/chfs Fix up chfs_mountfs error branches.



details:   https://anonhg.NetBSD.org/src/rev/8a8ea888938e
branches:  trunk
changeset: 827845:8a8ea888938e
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Tue Nov 14 22:06:40 2017 +0000

description:
Fix up chfs_mountfs error branches.

diffstat:

 sys/ufs/chfs/chfs_vfsops.c |  39 ++++++++++++++++++++++++++++-----------
 1 files changed, 28 insertions(+), 11 deletions(-)

diffs (85 lines):

diff -r 926b756d2dba -r 8a8ea888938e sys/ufs/chfs/chfs_vfsops.c
--- a/sys/ufs/chfs/chfs_vfsops.c        Tue Nov 14 16:56:03 2017 +0000
+++ b/sys/ufs/chfs/chfs_vfsops.c        Tue Nov 14 22:06:40 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: chfs_vfsops.c,v 1.16 2017/02/17 08:31:26 hannken Exp $ */
+/*     $NetBSD: chfs_vfsops.c,v 1.17 2017/11/14 22:06:40 riastradh Exp $       */
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -227,7 +227,7 @@
        err = vinvalbuf(devvp, V_SAVE, cred, l, 0, 0);
        VOP_UNLOCK(devvp);
        if (err)
-               return (err);
+               goto fail0;
 
        /* Setup device. */
        flash_major = cdevsw_lookup_major(&flash_cdevsw);
@@ -241,10 +241,8 @@
                    major(dev), flash_major);
                err = ENODEV;
        }
-       if (err) {
-               vrele(devvp);
-               return (err);
-       }
+       if (err)
+               goto fail0;
 
        /* Connect CHFS to UFS. */
        ump = kmem_zalloc(sizeof(struct ufsmount), KM_SLEEP);
@@ -262,7 +260,7 @@
        err = ebh_open(chmp->chm_ebh, devvp->v_rdev);
        if (err) {
                dbg("error while opening flash\n");
-               goto fail;
+               goto fail1;
        }
 
        //TODO check flash sizes
@@ -320,10 +318,8 @@
 
        if (err) {
                /* Armageddon and return. */
-               chfs_vnocache_hash_destroy(chmp->chm_vnocache_hash);
-               ebh_close(chmp->chm_ebh);
                err = EIO;
-               goto fail;
+               goto fail2;
        }
 
        /* Initialize UFS. */
@@ -359,10 +355,31 @@
        spec_node_setmountedfs(devvp, mp);
        return 0;
 
-fail:
+fail2:
+       KASSERT(TAILQ_EMPTY(&chmp->chm_erase_pending_queue));
+       KASSERT(TAILQ_EMPTY(&chmp->chm_erasable_pending_wbuf_queue));
+       KASSERT(TAILQ_EMPTY(&chmp->chm_very_dirty_queue));
+       KASSERT(TAILQ_EMPTY(&chmp->chm_dirty_queue));
+       KASSERT(TAILQ_EMPTY(&chmp->chm_clean_queue));
+       KASSERT(TAILQ_EMPTY(&chmp->chm_free_queue));
+       rw_destroy(&chmp->chm_lock_wbuf);
+       kmem_free(chmp->chm_wbuf, chmp->chm_wbuf_pagesize);
+       mutex_destroy(&chmp->chm_lock_vnocache);
+       mutex_destroy(&chmp->chm_lock_sizes);
+       mutex_destroy(&chmp->chm_lock_mountfields);
+       kmem_free(chmp->chm_blocks, chmp->chm_ebh->peb_nr *
+           sizeof(struct chfs_eraseblock));
+       chfs_vnocache_hash_destroy(chmp->chm_vnocache_hash);
+       ebh_close(chmp->chm_ebh);
+
+fail1:
        kmem_free(chmp->chm_ebh, sizeof(struct chfs_ebh));
+       mutex_destroy(&ump->um_lock);
        kmem_free(chmp, sizeof(struct chfs_mount));
        kmem_free(ump, sizeof(struct ufsmount));
+
+fail0:
+       KASSERT(err);
        return err;
 }
 



Home | Main Index | Thread Index | Old Index