Module Name: src
Committed By: andvar
Date: Thu Jul 15 22:39:06 UTC 2021
Modified Files:
src/sys/ufs/chfs: chfs_readinode.c chfs_scan.c
Log Message:
Make sure that mutex is released before conditional return statements. Fixes PR
kern/56242
ok riastradh
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/ufs/chfs/chfs_readinode.c
cvs rdiff -u -r1.8 -r1.9 src/sys/ufs/chfs/chfs_scan.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_readinode.c
diff -u src/sys/ufs/chfs/chfs_readinode.c:1.10 src/sys/ufs/chfs/chfs_readinode.c:1.11
--- src/sys/ufs/chfs/chfs_readinode.c:1.10 Thu Jun 1 02:45:15 2017
+++ src/sys/ufs/chfs/chfs_readinode.c Thu Jul 15 22:39:06 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: chfs_readinode.c,v 1.10 2017/06/01 02:45:15 chs Exp $ */
+/* $NetBSD: chfs_readinode.c,v 1.11 2021/07/15 22:39:06 andvar Exp $ */
/*-
* Copyright (c) 2010 Department of Software Engineering,
@@ -1012,6 +1012,7 @@ retry:
(unsigned long long)vc->vno, vc->state);
chfs_err("wants to read a nonexistent ino %llu\n",
(unsigned long long)vc->vno);
+ mutex_exit(&chmp->chm_lock_vnocache);
return ENOENT;
default:
panic("BUG() Bad vno cache state.");
Index: src/sys/ufs/chfs/chfs_scan.c
diff -u src/sys/ufs/chfs/chfs_scan.c:1.8 src/sys/ufs/chfs/chfs_scan.c:1.9
--- src/sys/ufs/chfs/chfs_scan.c:1.8 Mon Jun 17 17:14:56 2019
+++ src/sys/ufs/chfs/chfs_scan.c Thu Jul 15 22:39:06 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: chfs_scan.c,v 1.8 2019/06/17 17:14:56 ryoon Exp $ */
+/* $NetBSD: chfs_scan.c,v 1.9 2021/07/15 22:39:06 andvar Exp $ */
/*-
* Copyright (c) 2010 Department of Software Engineering,
@@ -151,6 +151,7 @@ chfs_scan_check_vnode(struct chfs_mount
} else {
err = chfs_update_eb_dirty(chmp, cheb,
sizeof(struct chfs_flash_vnode));
+ mutex_exit(&chmp->chm_lock_vnocache);
return CHFS_NODE_OK;
}
} else {
@@ -325,6 +326,7 @@ chfs_scan_check_dirent_node(struct chfs_
parentvc = chfs_scan_make_vnode_cache(chmp, le64toh(dirent->pvno));
if (!parentvc) {
chfs_free_dirent(fd);
+ mutex_exit(&chmp->chm_lock_vnocache);
return ENOMEM;
}
@@ -381,8 +383,10 @@ chfs_scan_check_data_node(struct chfs_mo
vc = chfs_vnode_cache_get(chmp, vno);
if (!vc) {
vc = chfs_scan_make_vnode_cache(chmp, vno);
- if (!vc)
+ if (!vc) {
+ mutex_exit(&chmp->chm_lock_vnocache);
return ENOMEM;
+ }
}
chfs_add_node_to_list(chmp, vc, nref, &vc->dnode);
mutex_exit(&chmp->chm_lock_vnocache);