* 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
This commit is contained in:
Axel Dörfler 2009-07-26 15:07:27 +00:00
parent b5a51254dc
commit 6def1a637b

View File

@ -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