merge from 2_0_merge2 to 2_1_pre1
authorMiklos Szeredi <miklos@szeredi.hu>
Sun, 14 Nov 2004 09:19:51 +0000 (09:19 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Sun, 14 Nov 2004 09:19:51 +0000 (09:19 +0000)
ChangeLog
configure.in
kernel/configure.ac
kernel/dev.c
kernel/dir.c
kernel/file.c
kernel/fuse_i.h
kernel/inode.c

index 5a785cb746932e1df059d936a3c73d16c436fbc1..1f905b1e13d62ab8b5024af6bbd7a3faba9b604b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2004-11-14  Miklos Szeredi <miklos@szeredi.hu>
+
+       * Released 2.1-pre1
+
+2004-11-14  Miklos Szeredi <miklos@szeredi.hu>
+
+       * Fix bug in fuse_readpages() causing Oops in certain situations.
+       Bug found by Vincenzo Ciancia.
+
+       * Fix compilation with kernels versions > 2.6.9.
+
 2004-11-11  Miklos Szeredi <miklos@szeredi.hu>
 
        * Check kernel interface version in fusermount to prevent
@@ -9,7 +20,7 @@
 
        * Check superblock of proc file in addition to inode number
 
-       * Fix reace between request_send_noreply() and fuse_dev_release()
+       * Fix race between request_send_noreply() and fuse_dev_release()
 
 2004-11-10  Miklos Szeredi <miklos@szeredi.hu>
 
index d9a234a979448af715b559a6b315bc6d0adc1690..94deca75b4bc2ae3717c5545c91a2b39a67b1d75 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT(fuse, 2.1-pre0)
+AC_INIT(fuse, 2.1-pre1)
 AM_INIT_AUTOMAKE
 AM_CONFIG_HEADER(include/config.h)
 
index 0dad9cbe6f4d5e06f82c0bb1c12ffcdaa128d8fa..7be68901225f147306c1bb8e731cf6389e527998 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT(fuse-kernel, 2.1-pre0)
+AC_INIT(fuse-kernel, 2.1-pre1)
 AC_CONFIG_HEADERS([config.h])
 
 AC_PROG_INSTALL
index 0c601d281506fe19394131c77d0c3ef79cdc3f14..d353c7f59f4a04c1856aa9ff358b12659e7a1cdd 100644 (file)
@@ -139,24 +139,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 a2fe6a807195b7fb8c189fba098c8b919ef370bc..e3225446c103312bd4cff1e8e72af7ea3648b3c3 100644 (file)
@@ -600,7 +600,12 @@ static int _fuse_permission(struct inode *inode, int mask)
            (!(fc->flags & FUSE_ALLOW_ROOT) || current->fsuid != 0))
                return -EACCES;
        else if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
-               int err = vfs_permission(inode, mask);
+               int err;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+               err = vfs_permission(inode, mask);
+#else
+               err = generic_permission(inode, mask, NULL);
+#endif
 
                /* If permission is denied, try to refresh file
                   attributes.  This is also needed, because the root
@@ -608,8 +613,13 @@ static int _fuse_permission(struct inode *inode, int mask)
 
                if (err == -EACCES) {
                        err = fuse_do_getattr(inode);
-                       if (!err)
+                       if (!err) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
                                err = vfs_permission(inode, mask);
+#else
+                               err = generic_permission(inode, mask, NULL);
+#endif
+                       }
                }
 
                /* FIXME: Need some mechanism to revoke permissions:
@@ -853,9 +863,12 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
        if (attr->ia_valid & ATTR_SIZE) {
                unsigned long limit;
                is_truncate = 1;
-
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
                limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
-               if (limit != RLIM_INFINITY && attr->ia_size > limit) {
+#else
+               limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
+#endif
+               if (limit != RLIM_INFINITY && attr->ia_size > (loff_t) limit) {
                        send_sig(SIGXFSZ, current, 0);
                        return -EFBIG;
                }
index a08d236e856e3033aa19756570b8a721c26bc8fe..f89bfb7824c12146dde247fe790fe20ce7e5b6b7 100644 (file)
@@ -378,7 +378,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 ++;
@@ -392,7 +392,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 40dedb2ae6b55f52462ae91c3c3287301c0250b8..58d64667475684d3377eb7af75378abef63b6b5c 100644 (file)
@@ -349,6 +349,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
  */
index 591a4df6593c0aa035d6db6c42ce05097211d89f..641d03a59089bd89d33e4e7b7afbb4bab21e8ac6 100644 (file)
@@ -367,7 +367,7 @@ static struct fuse_conn *get_conn(struct file *file, struct super_block *sb)
        struct inode *ino;
 
        ino = file->f_dentry->d_inode;
-       if (!ino || !proc_fuse_dev || 
+       if (!ino || !proc_fuse_dev ||
            strcmp(ino->i_sb->s_type->name, "proc") != 0 ||
            proc_fuse_dev->low_ino != ino->i_ino) {
                printk("FUSE: bad communication file descriptor\n");