From: Miklos Szeredi Date: Sun, 14 Nov 2004 09:19:51 +0000 (+0000) Subject: merge from 2_0_merge2 to 2_1_pre1 X-Git-Tag: before_interruptible~23 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=08ddb8e5e0af8c1326607f4d06c0dbc85733e483;p=qemu-gpiodev%2Flibfuse.git merge from 2_0_merge2 to 2_1_pre1 --- diff --git a/ChangeLog b/ChangeLog index 5a785cb..1f905b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2004-11-14 Miklos Szeredi + + * Released 2.1-pre1 + +2004-11-14 Miklos Szeredi + + * 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 * 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 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 @@ -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 */ 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");