aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--configure.in2
-rw-r--r--kernel/configure.ac2
-rw-r--r--kernel/dev.c16
-rw-r--r--kernel/dir.c21
-rw-r--r--kernel/file.c4
-rw-r--r--kernel/fuse_i.h5
-rw-r--r--kernel/inode.c2
8 files changed, 46 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 5a785cb..1f905b1 100644
--- 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>
diff --git a/configure.in b/configure.in
index d9a234a..94deca7 100644
--- a/configure.in
+++ b/configure.in
@@ -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)
diff --git a/kernel/configure.ac b/kernel/configure.ac
index 0dad9cb..7be6890 100644
--- a/kernel/configure.ac
+++ b/kernel/configure.ac
@@ -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
diff --git a/kernel/dev.c b/kernel/dev.c
index 0c601d2..d353c7f 100644
--- a/kernel/dev.c
+++ b/kernel/dev.c
@@ -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)
diff --git a/kernel/dir.c b/kernel/dir.c
index a2fe6a8..e322544 100644
--- a/kernel/dir.c
+++ b/kernel/dir.c
@@ -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;
}
diff --git a/kernel/file.c b/kernel/file.c
index a08d236..f89bfb7 100644
--- a/kernel/file.c
+++ b/kernel/file.c
@@ -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;
diff --git a/kernel/fuse_i.h b/kernel/fuse_i.h
index 40dedb2..58d6466 100644
--- a/kernel/fuse_i.h
+++ b/kernel/fuse_i.h
@@ -350,6 +350,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
*/
struct fuse_req *fuse_get_request_nonblock(struct fuse_conn *fc);
diff --git a/kernel/inode.c b/kernel/inode.c
index 591a4df..641d03a 100644
--- a/kernel/inode.c
+++ b/kernel/inode.c
@@ -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");