} else if (write && (res == -EINTR || res == -EIO)) fuse_invalidate_attr(inode); 
} fuse_invalidate_attr(inode); 
static ssize_t fuse_direct_io(struct file *file, const char __user *buf,			      size_t count, loff_t *ppos, int write){	struct inode *inode = file->f_dentry->d_inode;	struct fuse_conn *fc = get_fuse_conn(inode);	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);	if (!req)		return -ERESTARTSYS;	while (count) {		size_t tmp;		size_t nres;		size_t nbytes = min(count, nmax);		int err = fuse_get_user_pages(req, buf, nbytes, !write);		if (err) {			res = err;			break;		}		tmp = (req->num_pages << PAGE_SHIFT) - req->page_offset;		nbytes = min(nbytes, tmp);		if (write)			nres = fuse_send_write(req, file, inode, pos, nbytes);		else			nres = fuse_send_read(req, file, inode, pos, nbytes);		fuse_release_user_pages(req, !write);		if (req->out.h.error) {			if (!res)				res = req->out.h.error;			break;		} else if (nres > nbytes) {			res = -EIO;			break;		}		count -= nres;		res += nres;		pos += nres;		buf += nres;		if (nres != nbytes)			break;		if (count)			fuse_reset_request(req);	}	fuse_put_request(fc, req);	if (res > 0) {		if (write && pos > i_size_read(inode))			i_size_write(inode, pos);		*ppos = pos;	} else if (write && (res == -EINTR || res == -EIO))		fuse_invalidate_attr(inode);	return res;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/b36c31ba95f0fe0a03c727300d9c4c54438a5636/file.c/buggy/fs/fuse/file.c