From: Miklos Szeredi Date: Wed, 7 Dec 2005 12:57:59 +0000 (+0000) Subject: fix X-Git-Tag: fuse_2_5_0_pre1~2 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=c53cddd73b690a87c76c1f675d4aa3b526a541db;p=qemu-gpiodev%2Flibfuse.git fix --- diff --git a/ChangeLog b/ChangeLog index 637ca23..86a4365 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-12-07 Miklos Szeredi + + * Return EIO for file operations (read, write, fsync, flush) on + open files whose inode has become "bad". Inodes will be marked + "bad" if their type changes. Bug report by Csaba Henk + 2005-12-06 Miklos Szeredi * Use bigger request buffer size. write() did not work on archs diff --git a/kernel/dir.c b/kernel/dir.c index 3258d42..8c161b6 100644 --- a/kernel/dir.c +++ b/kernel/dir.c @@ -837,7 +837,12 @@ static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir) struct page *page; struct inode *inode = file->f_dentry->d_inode; struct fuse_conn *fc = get_fuse_conn(inode); - struct fuse_req *req = fuse_get_request(fc); + struct fuse_req *req; + + if (is_bad_inode(inode)) + return -EIO; + + req = fuse_get_request(fc); if (!req) return -EINTR; diff --git a/kernel/file.c b/kernel/file.c index 2365d2e..0a625a2 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -177,6 +177,9 @@ static int fuse_flush(struct file *file) struct fuse_flush_in inarg; int err; + if (is_bad_inode(inode)) + return -EIO; + if (fc->no_flush) return 0; @@ -213,6 +216,9 @@ int fuse_fsync_common(struct file *file, struct dentry *de, int datasync, struct fuse_fsync_in inarg; int err; + if (is_bad_inode(inode)) + return -EIO; + if ((!isdir && fc->no_fsync) || (isdir && fc->no_fsyncdir)) return 0; @@ -286,8 +292,15 @@ static int fuse_readpage(struct file *file, struct page *page) { struct inode *inode = page->mapping->host; struct fuse_conn *fc = get_fuse_conn(inode); - struct fuse_req *req = fuse_get_request(fc); - int err = -EINTR; + struct fuse_req *req; + int err; + + err = -EIO; + if (is_bad_inode(inode)) + goto out; + + err = -EINTR; + req = fuse_get_request(fc); if (!req) goto out; @@ -359,6 +372,10 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, struct fuse_conn *fc = get_fuse_conn(inode); struct fuse_readpages_data data; int err; + + if (is_bad_inode(inode)) + return -EIO; + data.file = file; data.inode = inode; data.req = fuse_get_request(fc); @@ -518,6 +535,9 @@ static int fuse_commit_write(struct file *file, struct page *page, loff_t pos = page_offset(page) + offset; struct fuse_req *req; + if (is_bad_inode(inode)) + return -EIO; + if (count > fc->max_write) return -EIO; @@ -593,7 +613,12 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf, size_t nmax = write ? fc->max_write : fc->max_read; loff_t pos = *ppos; ssize_t res = 0; - struct fuse_req *req = fuse_get_request(fc); + struct fuse_req *req; + + if (is_bad_inode(inode)) + return -EIO; + + req = fuse_get_request(fc); if (!req) return -EINTR; @@ -666,6 +691,9 @@ static ssize_t fuse_file_read(struct file *file, char __user *buf, struct inode *inode = file->f_dentry->d_inode; struct fuse_conn *fc = get_fuse_conn(inode); + if (is_bad_inode(file)) + return -EIO; + if (fc->flags & FUSE_LARGE_READ) { int res; down(&inode->i_sem);