Module Name: src
Committed By: riastradh
Date: Tue Nov 14 22:06:40 UTC 2017
Modified Files:
src/sys/ufs/chfs: chfs_vfsops.c
Log Message:
Fix up chfs_mountfs error branches.
To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/ufs/chfs/chfs_vfsops.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/ufs/chfs/chfs_vfsops.c
diff -u src/sys/ufs/chfs/chfs_vfsops.c:1.16 src/sys/ufs/chfs/chfs_vfsops.c:1.17
--- src/sys/ufs/chfs/chfs_vfsops.c:1.16 Fri Feb 17 08:31:26 2017
+++ src/sys/ufs/chfs/chfs_vfsops.c Tue Nov 14 22:06:40 2017
@@ -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 @@ chfs_mountfs(struct vnode *devvp, struct
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 @@ chfs_mountfs(struct vnode *devvp, struct
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 @@ chfs_mountfs(struct vnode *devvp, struct
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 @@ chfs_mountfs(struct vnode *devvp, struct
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 @@ chfs_mountfs(struct vnode *devvp, struct
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;
}