From ba0e4a83e5f2f196152c741fd3d925ea568631af Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Wed, 1 Dec 2021 16:39:24 -0500 Subject: [PATCH] FAT: Unlock before calling the file cache. Otherwise if the file cache calls us again from a different thread, as it sometimes does when doing concurrent I/O to multiple files, we will deadlock. Fixes #14104. --- src/add-ons/kernel/file_systems/fat/file.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/file_systems/fat/file.cpp b/src/add-ons/kernel/file_systems/fat/file.cpp index 13676cd88e..a4d2c54283 100644 --- a/src/add-ons/kernel/file_systems/fat/file.cpp +++ b/src/add-ons/kernel/file_systems/fat/file.cpp @@ -338,6 +338,8 @@ dosfs_read(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos, DPRINTF(0, ("dosfs_read called %" B_PRIuSIZE " bytes at %" B_PRIdOFF " (vnode id %" B_PRIdINO ")\n", *len, pos, node->vnid)); + lock.Unlock(); + result = file_cache_read(node->cache, cookie, pos, buf, len); if (result != B_OK) { @@ -420,8 +422,8 @@ dosfs_write(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos, file_map_set_size(node->file_map, node->st_size); } + lock.Unlock(); result = file_cache_write(node->cache, cookie, pos, buf, len); - return result; }