NTFS: Optimize for fs_walk function.
This commit is contained in:
@@ -508,70 +508,50 @@ exit:
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
fs_walk(fs_volume *_vol, fs_vnode *_dir, const char *file, ino_t *vnid)
|
fs_walk(fs_volume *_vol, fs_vnode *_dir, const char *file, ino_t *_vnid)
|
||||||
{
|
{
|
||||||
nspace *ns = (nspace*)_vol->private_volume;
|
nspace *ns = (nspace*)_vol->private_volume;
|
||||||
vnode *baseNode = (vnode*)_dir->private_node;
|
vnode *baseNode = (vnode*)_dir->private_node;
|
||||||
vnode *newNode = NULL;
|
vnode *newNode = NULL;
|
||||||
ntfschar *uname = NULL;
|
|
||||||
ntfs_inode *dir_ni = NULL;
|
|
||||||
status_t result = B_NO_ERROR;
|
status_t result = B_NO_ERROR;
|
||||||
int uname_len;
|
|
||||||
|
|
||||||
LOCK_VOL(ns);
|
LOCK_VOL(ns);
|
||||||
|
|
||||||
TRACE("fs_walk - ENTER : find for \"%s\"\n",file);
|
TRACE("fs_walk - ENTER : find for \"%s\"\n",file);
|
||||||
|
|
||||||
if (ns == NULL || _dir == NULL || file == NULL || vnid == NULL) {
|
if (ns == NULL || _dir == NULL || file == NULL || _vnid == NULL) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(file, ".")) {
|
if (!strcmp(file, ".")) {
|
||||||
*vnid = baseNode->vnid;
|
*_vnid = baseNode->vnid;
|
||||||
if (get_vnode(_vol, *vnid, (void**)&newNode) != 0)
|
if (get_vnode(_vol, *_vnid, (void**)&newNode) != 0)
|
||||||
result = ENOENT;
|
result = ENOENT;
|
||||||
} else if (!strcmp(file, "..") && baseNode->vnid != FILE_root) {
|
} else if (!strcmp(file, "..") && baseNode->vnid != FILE_root) {
|
||||||
*vnid = baseNode->parent_vnid;
|
*_vnid = baseNode->parent_vnid;
|
||||||
if (get_vnode(_vol, *vnid, (void**)&newNode) != 0)
|
if (get_vnode(_vol, *_vnid, (void**)&newNode) != 0)
|
||||||
result = ENOENT;
|
result = ENOENT;
|
||||||
} else {
|
} else {
|
||||||
uname = ntfs_calloc(MAX_PATH);
|
ino_t vnid = ntfs_inode_lookup(_vol, baseNode->vnid, file);
|
||||||
uname_len = ntfs_mbstoucs(file, &uname);
|
|
||||||
if (uname_len < 0) {
|
if (vnid == (u64)-1) {
|
||||||
result = EILSEQ;
|
result = errno;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_ni = ntfs_inode_open(ns->ntvol, baseNode->vnid);
|
if (get_vnode(_vol, vnid, (void**)&newNode) != 0)
|
||||||
if (dir_ni == NULL) {
|
|
||||||
result = ENOENT;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
*vnid = MREF(ntfs_inode_lookup_by_name(dir_ni, uname, uname_len));
|
|
||||||
TRACE("fs_walk - VNID = %d\n",*vnid);
|
|
||||||
|
|
||||||
ntfs_inode_close(dir_ni);
|
|
||||||
|
|
||||||
if (*vnid == (u64)-1) {
|
|
||||||
result = EINVAL;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (get_vnode(_vol, *vnid, (void**)&newNode) != 0)
|
|
||||||
result = ENOENT;
|
result = ENOENT;
|
||||||
|
|
||||||
if (newNode!=NULL)
|
if (newNode!=NULL)
|
||||||
newNode->parent_vnid = baseNode->vnid;
|
newNode->parent_vnid = baseNode->vnid;
|
||||||
|
|
||||||
|
*_vnid = vnid;
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
TRACE("fs_walk - EXIT, result is %s\n", strerror(result));
|
TRACE("fs_walk - EXIT, result is %s\n", strerror(result));
|
||||||
|
|
||||||
if (uname)
|
|
||||||
free(uname);
|
|
||||||
|
|
||||||
UNLOCK_VOL(ns);
|
UNLOCK_VOL(ns);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
Reference in New Issue
Block a user