From 4c4ecb78445606ac5ba0910655725cc111302721 Mon Sep 17 00:00:00 2001 From: manu Date: Wed, 3 Jun 2015 14:07:05 +0000 Subject: [PATCH] Fix dot-lookup when readdir does not provide inodes Some filesystems do not provide inode numbers through readdir (FUSE mounts without -o use_ino). We therefore have to lookup each directory entry to get the missing numbers. dot and double-dot are exceptions, as we already know the values. Moreover, the lookup code does not expect to get requests for dot and will abort perfused(8) when it gets some. In order to fix that, we just check for dot and double-dot special case and use the known values instead of sending a lookup. --- lib/libperfuse/ops.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/libperfuse/ops.c b/lib/libperfuse/ops.c index 7e248a4a47a4..e8f150317215 100644 --- a/lib/libperfuse/ops.c +++ b/lib/libperfuse/ops.c @@ -1,4 +1,4 @@ -/* $NetBSD: ops.c,v 1.83 2015/02/15 20:21:29 manu Exp $ */ +/* $NetBSD: ops.c,v 1.84 2015/06/03 14:07:05 manu Exp $ */ /*- * Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved. @@ -651,13 +651,17 @@ fuse_to_dirent(struct puffs_usermount *pu, puffs_cookie_t opc, struct puffs_node *pn; struct perfuse_node_data *pnd = PERFUSE_NODE_DATA(opc); - /* - * Avoid breaking out of fs - * by lookup to .. on root - */ - if ((strcmp(name, "..") == 0) && - (pnd->pnd_nodeid == FUSE_ROOT_ID)) { - fd->ino = FUSE_ROOT_ID; + if (strcmp(name, "..") == 0) { + /* + * Avoid breaking out of fs + * by lookup to .. on root + */ + if (pnd->pnd_nodeid == FUSE_ROOT_ID) + fd->ino = FUSE_ROOT_ID; + else + fd->ino = pnd->pnd_parent_nodeid; + } else if (strcmp(name, ".") == 0 ) { + fd->ino = pnd->pnd_nodeid; } else { int error;