diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | kernel/configure.ac | 2 | ||||
-rw-r--r-- | kernel/dev.c | 16 | ||||
-rw-r--r-- | kernel/dir.c | 21 | ||||
-rw-r--r-- | kernel/file.c | 4 | ||||
-rw-r--r-- | kernel/fuse_i.h | 5 | ||||
-rw-r--r-- | kernel/inode.c | 2 |
8 files changed, 46 insertions, 19 deletions
@@ -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"); |