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);