* 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:
@@ -5572,20 +5572,16 @@ fix_dirent(struct vnode* parent, struct dirent* userEntry,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// resolve mount points
|
// resolve mount points
|
||||||
struct vnode* vnode = NULL;
|
MutexLocker _(&sVnodeMutex);
|
||||||
status_t status = get_vnode(entry->d_dev, entry->d_ino, &vnode, true,
|
|
||||||
false);
|
|
||||||
if (status != B_OK)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
mutex_lock(&sVnodeCoveredByMutex);
|
struct vnode* vnode = lookup_vnode(entry->d_dev, entry->d_ino);
|
||||||
if (vnode->covered_by) {
|
if (vnode != NULL) {
|
||||||
entry->d_dev = vnode->covered_by->device;
|
MutexLocker _(&sVnodeCoveredByMutex);
|
||||||
entry->d_ino = vnode->covered_by->id;
|
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
|
// copy back from userland buffer if needed
|
||||||
|
|||||||
Reference in New Issue
Block a user