fix oops
authorMiklos Szeredi <miklos@szeredi.hu>
Sun, 14 Nov 2004 01:02:44 +0000 (01:02 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Sun, 14 Nov 2004 01:02:44 +0000 (01:02 +0000)
ChangeLog
kernel/dev.c
kernel/file.c
kernel/fuse_i.h

index ffdb7742a2fbedc0961d2baf8e72ce20c01192a2..494815b17cc905937a875e241db7db581e8b1996 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-11-14  Miklos Szeredi <miklos@szeredi.hu>
+
+       * Fix bug in fuse_readpages() causing Oops in certain situations.
+       Bug found by Vincenzo Ciancia.
+
 2004-11-11  Miklos Szeredi <miklos@szeredi.hu>
 
        * Check kernel interface version in fusermount to prevent
index e3ead6746c2f96073ba9565b2072fce4d405ab52..9250fe1f370a70a81ec7a80f5518ce12f2eb85f8 100644 (file)
@@ -131,24 +131,22 @@ static struct fuse_req *do_get_request(struct fuse_conn *fc)
 
 struct fuse_req *fuse_get_request(struct fuse_conn *fc)
 {
-       struct fuse_req *req;
-       
        if (down_interruptible(&fc->unused_sem))
                return NULL;
+       return  do_get_request(fc);
+}
 
-       req = do_get_request(fc);
-       return req;
+struct fuse_req *fuse_get_request_nonint(struct fuse_conn *fc)
+{
+       down(&fc->unused_sem);
+       return do_get_request(fc);
 }
 
 struct fuse_req *fuse_get_request_nonblock(struct fuse_conn *fc)
 {
-       struct fuse_req *req;
-
        if (down_trylock(&fc->unused_sem))
                return NULL;
-       
-       req = do_get_request(fc);
-       return req;
+       return  do_get_request(fc);
 }
 
 void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req)
index aa6662b7af22e3f72b7414f7b8663c6776e341d4..cea140f89aecf847b7adc70de0b1ac95a38d8efc 100644 (file)
@@ -375,7 +375,7 @@ static int fuse_readpages_fill(void *_data, struct page *page)
             req->pages[req->num_pages - 1]->index + 1 != page->index)) {
                struct fuse_conn *fc = INO_FC(page->mapping->host);
                fuse_send_readpages(req, data->file, inode);
-               data->req = req = fuse_get_request(fc);
+               data->req = req = fuse_get_request_nonint(fc);
        }
        req->pages[req->num_pages] = page;
        req->num_pages ++;
@@ -389,7 +389,7 @@ static int fuse_readpages(struct file *file, struct address_space *mapping,
        struct fuse_conn *fc = INO_FC(inode);
        struct fuse_readpages_data data;
 
-       data.req = fuse_get_request(fc);
+       data.req = fuse_get_request_nonint(fc);
        data.file = file;
        data.inode = inode;
        
index c256bb250848dcf1a27fd6d376e20c2cd5aef2b6..d2eeece80eb0e403ad3d18350a06062d27204d84 100644 (file)
@@ -343,6 +343,11 @@ void fuse_reset_request(struct fuse_req *req);
  */
 struct fuse_req *fuse_get_request(struct fuse_conn *fc);
 
+/**
+ * Reserve a preallocated request, non-interruptible
+ */
+struct fuse_req *fuse_get_request_nonint(struct fuse_conn *fc);
+
 /**
  * Reserve a preallocated request, non-blocking
  */