fix
diff --git a/ChangeLog b/ChangeLog
index dddc1ee..fe88ba4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2005-05-27  Miklos Szeredi <miklos@szeredi.hu>
+
+	* Add "readdir_ino" mount option, which tries to fill in the d_ino
+	field in struct dirent.  This mount option is ignored if "use_ino"
+	is used.  It helps some programs (e.g. 'pwd' used over NFS from a
+	non-Linux OS).  Patch by David Shaw.
+
 2005-05-12  Miklos Szeredi <miklos@szeredi.hu>
 
 	* Released 2.3-rc1
diff --git a/lib/fuse.c b/lib/fuse.c
index 91c749f..042268b 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -37,10 +37,8 @@
 /** Only allow root or the owner to access the filesystem */
 #define FUSE_ALLOW_ROOT  (1 << 4)
 
-#define FUSE_KERNEL_MINOR_VERSION_NEED 1
-#define FUSE_VERSION_FILE_OLD "/proc/fs/fuse/version"
-#define FUSE_VERSION_FILE_NEW "/sys/fs/fuse/version"
-#define FUSE_DEV_OLD "/proc/fs/fuse/dev"
+/** Make a best effort to fill in inode number in a readdir **/
+#define FUSE_READDIR_INO (1 << 5)
 
 #define FUSE_MAX_PATH 4096
 #define PARAM_T(inarg, type) (((char *)(inarg)) + sizeof(type))
@@ -82,6 +80,7 @@
     int filled;
     unsigned long fh;
     int error;
+    struct node *node;
 };
 
 struct fuse_cmd {
@@ -1597,6 +1596,11 @@
     dh->contents = NULL;
     dh->len = 0;
     dh->filled = 0;
+    if (f->flags & FUSE_READDIR_INO) {
+        pthread_mutex_lock(&f->lock);
+        dh->node = get_node(f, in->nodeid);
+        pthread_mutex_unlock(&f->lock);
+    }
     mutex_init(&dh->lock);
 
     memset(&outarg, 0, sizeof(outarg));
@@ -1649,8 +1653,17 @@
     unsigned newlen;
     unsigned char *newptr;
 
-    if (!(dh->fuse->flags & FUSE_USE_INO))
+    if (!(dh->fuse->flags & FUSE_USE_INO)) {
         ino = (ino_t) -1;
+        if (dh->fuse->flags & FUSE_READDIR_INO) {
+            struct node *node;
+            pthread_mutex_lock(&dh->fuse->lock);
+            node = lookup_node(dh->fuse, dh->node->nodeid, name);
+            if (node)
+                ino  = (ino_t) node->nodeid;
+            pthread_mutex_unlock(&dh->fuse->lock);
+        }
+    }
 
     if (namelen > FUSE_NAME_MAX)
         namelen = FUSE_NAME_MAX;
@@ -2097,7 +2110,8 @@
     if (strcmp(opt, "debug") == 0 ||
         strcmp(opt, "hard_remove") == 0 ||
         strcmp(opt, "use_ino") == 0 ||
-        strcmp(opt, "allow_root") == 0)
+        strcmp(opt, "allow_root") == 0 ||
+        strcmp(opt, "readdir_ino") == 0)
         return 1;
     else
         return 0;
@@ -2124,6 +2138,8 @@
                 f->flags |= FUSE_USE_INO;
             else if (strcmp(opt, "allow_root") == 0)
                 f->flags |= FUSE_ALLOW_ROOT;
+            else if (strcmp(opt, "readdir_ino") == 0)
+                f->flags |= FUSE_READDIR_INO;
             else
                 fprintf(stderr, "fuse: warning: unknown option `%s'\n", opt);
         }
diff --git a/lib/helper.c b/lib/helper.c
index d1a3d1f..af77c0f 100644
--- a/lib/helper.c
+++ b/lib/helper.c
@@ -44,7 +44,9 @@
             "    hard_remove            immediate removal (don't hide files)\n"
             "    debug                  enable debug output\n"
             "    fsname=NAME            set filesystem name in mtab\n"
-            "    use_ino                let filesystem set inode numbers\n");
+            "    use_ino                let filesystem set inode numbers\n"
+            "    readdir_ino            try to fill in d_ino in readdir\n"
+            );
 }
 
 static void invalid_option(const char *argv[], int argctr)