From 6def1a637b1ef1b915f87bb2fb015bd90559ff7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sun, 26 Jul 2009 15:07:27 +0000 Subject: [PATCH] * In order to resolve mount points, fix_dirents() retrieved all vnodes from disk; but since mount points are always kept in memory, it makes much more sense to use lookup_vnode() instead. * As a side effect, directory listings are no longer aborted when they contain broken files that could not be retrieved anymore. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31775 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/fs/vfs.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp index f9949dd5c5..5c5b20cbcd 100644 --- a/src/system/kernel/fs/vfs.cpp +++ b/src/system/kernel/fs/vfs.cpp @@ -5572,20 +5572,16 @@ fix_dirent(struct vnode* parent, struct dirent* userEntry, } } else { // resolve mount points - struct vnode* vnode = NULL; - status_t status = get_vnode(entry->d_dev, entry->d_ino, &vnode, true, - false); - if (status != B_OK) - return status; + MutexLocker _(&sVnodeMutex); - mutex_lock(&sVnodeCoveredByMutex); - if (vnode->covered_by) { - entry->d_dev = vnode->covered_by->device; - entry->d_ino = vnode->covered_by->id; + struct vnode* vnode = lookup_vnode(entry->d_dev, entry->d_ino); + if (vnode != NULL) { + MutexLocker _(&sVnodeCoveredByMutex); + if (vnode->covered_by != NULL) { + entry->d_dev = vnode->covered_by->device; + entry->d_ino = vnode->covered_by->id; + } } - mutex_unlock(&sVnodeCoveredByMutex); - - put_vnode(vnode); } // copy back from userland buffer if needed