fixes in kernel module
authorMiklos Szeredi <miklos@szeredi.hu>
Fri, 16 Nov 2001 21:40:00 +0000 (21:40 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Fri, 16 Nov 2001 21:40:00 +0000 (21:40 +0000)
kernel/dev.c
kernel/dir.c
python/fuse.py

index 1cc12a2c4e18326671da6cddee173a543fdb2a83..d4206e136bc428d404cf7035a7d289853ce662d7 100644 (file)
 static struct proc_dir_entry *proc_fs_fuse;
 struct proc_dir_entry *proc_fuse_dev;
 
+static int interrupt_error(enum fuse_opcode opcode)
+{
+       switch(opcode) {
+       case FUSE_LOOKUP:
+       case FUSE_GETATTR:
+       case FUSE_READLINK:
+       case FUSE_GETDIR:
+       case FUSE_OPEN:
+       case FUSE_READ:
+       case FUSE_WRITE:
+               return -ERESTARTSYS;
+
+       default:
+               /* Operations which modify the filesystem cannot be safely
+                   restarted, because it is uncertain whether the
+                   operation has completed or not... */
+               return -EINTR;
+       }
+}
+
 static int request_wait_answer(struct fuse_req *req)
 {
        int ret = 0;
@@ -27,7 +47,7 @@ static int request_wait_answer(struct fuse_req *req)
        while(!list_empty(&req->list)) {
                set_current_state(TASK_INTERRUPTIBLE);
                if(signal_pending(current)) {
-                       ret = -EINTR;
+                       ret = interrupt_error(req->opcode);
                        break;
                }
                spin_unlock(&fuse_lock);
index 8c60afad2b79fbad27e753281d3689759baa81c8..537b71ca2fb3061b8c6e464205356a497e1f5ef7 100644 (file)
@@ -545,7 +545,10 @@ static int fuse_dentry_revalidate(struct dentry *entry, int flags)
 {
        if(!entry->d_inode)
                return 0;
-       else if(!(flags & LOOKUP_CONTINUE))
+       /* Must not revaidate too soon, since kernel revalidate logic is
+           broken, and could return ENOENT */
+       else if(!(flags & LOOKUP_CONTINUE) &&
+               time_after(jiffies, entry->d_time + FUSE_REVALIDATE_TIME))
                return 0;
        else
                return 1;
index dff6f470cc4cfc14d15dc2a7592bd052a1b0a15e..7336fd75f9c96bf3dbb436d5e321a6c97e4b162c 100644 (file)
@@ -105,6 +105,6 @@ class Xmp(Fuse):
 
 if __name__ == '__main__':
        server = Xmp()
-       server.flags = DEBUG
+       server.flags = 0
        server.multithreaded = 1;
        server.main()