* 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:
parent
b5a51254dc
commit
6def1a637b
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user