mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			378 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			378 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Index: shfs-0.35/shfs/Linux-2.6/fcache.c
 | |
| ===================================================================
 | |
| --- shfs-0.35.orig/shfs/Linux-2.6/fcache.c	2007-06-04 13:22:57.997038392 +0200
 | |
| +++ shfs-0.35/shfs/Linux-2.6/fcache.c	2007-06-04 13:22:59.019882896 +0200
 | |
| @@ -100,7 +100,11 @@
 | |
|  		VERBOSE("dir in file cache?\n");
 | |
|  		return -EINVAL;
 | |
|  	}
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	p = (struct shfs_inode_info *)inode->i_private;
 | |
| +#else
 | |
|  	p = (struct shfs_inode_info *)inode->u.generic_ip;
 | |
| +#endif
 | |
|  	if (!p) {
 | |
|  		VERBOSE("inode without info\n");
 | |
|  		return -EINVAL;
 | |
| @@ -127,7 +131,11 @@
 | |
|  		VERBOSE("dir in file cache?\n");
 | |
|  		return -EINVAL;
 | |
|  	}
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	p = (struct shfs_inode_info *)inode->i_private;
 | |
| +#else
 | |
|  	p = (struct shfs_inode_info *)inode->u.generic_ip;
 | |
| +#endif
 | |
|  	if (!p) {
 | |
|  		VERBOSE("inode without info\n");
 | |
|  		return -EINVAL;
 | |
| @@ -160,7 +168,11 @@
 | |
|  	if (result == 0) {
 | |
|  		struct shfs_inode_info *p;
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +		p = (struct shfs_inode_info *)f->f_dentry->d_inode->i_private;
 | |
| +#else
 | |
|  		p = (struct shfs_inode_info *)f->f_dentry->d_inode->u.generic_ip;
 | |
| +#endif
 | |
|  		if (!p) {
 | |
|  			VERBOSE("inode without info\n");
 | |
|  			return -EINVAL;
 | |
| @@ -184,7 +196,11 @@
 | |
|  		return -EINVAL;
 | |
|  	}
 | |
|  	DEBUG("ino: %lu\n", inode->i_ino);
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	p = (struct shfs_inode_info *)inode->i_private;
 | |
| +#else
 | |
|  	p = (struct shfs_inode_info *)inode->u.generic_ip;
 | |
| +#endif
 | |
|  	if (!p) {
 | |
|  		VERBOSE("inode without info\n");
 | |
|  		return -EINVAL;
 | |
| @@ -226,7 +242,11 @@
 | |
|  		VERBOSE("dir in file cache?\n");
 | |
|  		return -EINVAL;
 | |
|  	}
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	p = (struct shfs_inode_info *)inode->i_private;
 | |
| +#else
 | |
|  	p = (struct shfs_inode_info *)inode->u.generic_ip;
 | |
| +#endif
 | |
|  	if (!p) {
 | |
|  		VERBOSE("inode without info\n");
 | |
|  		return -EINVAL;
 | |
| @@ -327,7 +347,11 @@
 | |
|  		VERBOSE("dir in file cache?\n");
 | |
|  		return -EINVAL;
 | |
|  	}
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	p = (struct shfs_inode_info *)inode->i_private;
 | |
| +#else
 | |
|  	p = (struct shfs_inode_info *)inode->u.generic_ip;
 | |
| +#endif
 | |
|  	if (!p) {
 | |
|  		VERBOSE("inode without info\n");
 | |
|  		return -EINVAL;
 | |
| Index: shfs-0.35/shfs/Linux-2.6/inode.c
 | |
| ===================================================================
 | |
| --- shfs-0.35.orig/shfs/Linux-2.6/inode.c	2007-06-04 13:22:58.637940960 +0200
 | |
| +++ shfs-0.35/shfs/Linux-2.6/inode.c	2007-06-04 13:22:59.020882744 +0200
 | |
| @@ -36,7 +36,11 @@
 | |
|  shfs_set_inode_attr(struct inode *inode, struct shfs_fattr *fattr)
 | |
|  {
 | |
|  	struct shfs_sb_info *info = info_from_inode(inode);
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	struct shfs_inode_info *i = inode->i_private;
 | |
| +#else
 | |
|  	struct shfs_inode_info *i = inode->u.generic_ip;
 | |
| +#endif
 | |
|  	struct timespec last_time = inode->i_mtime;
 | |
|  	loff_t last_size = inode->i_size;
 | |
|  
 | |
| @@ -53,7 +57,9 @@
 | |
|  	inode->i_ctime	= fattr->f_ctime;
 | |
|  	inode->i_atime	= fattr->f_atime;
 | |
|  	inode->i_mtime	= fattr->f_mtime;
 | |
| +#ifdef STRUCT_INODE_HAS_I_BLKSIZE
 | |
|  	inode->i_blksize= fattr->f_blksize;
 | |
| +#endif
 | |
|  	inode->i_blocks	= fattr->f_blocks;
 | |
|  	inode->i_size	= fattr->f_size;
 | |
|  
 | |
| @@ -76,7 +82,11 @@
 | |
|  	if (!inode)
 | |
|  		return NULL;
 | |
|  	inode->i_ino = fattr->f_ino;
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	i = inode->i_private = (struct shfs_inode_info *)KMEM_ALLOC("inode", inode_cache, GFP_KERNEL);
 | |
| +#else
 | |
|  	i = inode->u.generic_ip = (struct shfs_inode_info *)KMEM_ALLOC("inode", inode_cache, GFP_KERNEL);
 | |
| +#endif
 | |
|  	if (!i)
 | |
|  		return NULL;
 | |
|  	i->cache = NULL;
 | |
| @@ -108,7 +118,11 @@
 | |
|  	struct shfs_inode_info *i;
 | |
|  
 | |
|  	DEBUG("ino: %lu\n", inode->i_ino);
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	i = (struct shfs_inode_info *)inode->i_private;
 | |
| +#else
 | |
|  	i = (struct shfs_inode_info *)inode->u.generic_ip;
 | |
| +#endif
 | |
|  	if (!i) {
 | |
|  		VERBOSE("invalid inode\n");
 | |
|  		goto out;
 | |
| @@ -176,7 +190,11 @@
 | |
|  {
 | |
|  	struct shfs_sb_info *info = info_from_dentry(dentry);
 | |
|  	struct inode *inode = dentry->d_inode;
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	struct shfs_inode_info *i = (struct shfs_inode_info *)inode->i_private;
 | |
| +#else
 | |
|  	struct shfs_inode_info *i = (struct shfs_inode_info *)inode->u.generic_ip;
 | |
| +#endif
 | |
|  	int result;
 | |
|  
 | |
|          DEBUG("%s\n", dentry->d_name.name);
 | |
| Index: shfs-0.35/shfs/Linux-2.6/dir.c
 | |
| ===================================================================
 | |
| --- shfs-0.35.orig/shfs/Linux-2.6/dir.c	2007-06-04 13:22:58.822912840 +0200
 | |
| +++ shfs-0.35/shfs/Linux-2.6/dir.c	2007-06-04 13:22:59.020882744 +0200
 | |
| @@ -302,8 +302,13 @@
 | |
|  	
 | |
|  	shfs_invalid_dir_cache(dir);
 | |
|  	result = shfs_instantiate(dentry);
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	if (forced_write && dentry->d_inode && dentry->d_inode->i_private)
 | |
| +		((struct shfs_inode_info *)dentry->d_inode->i_private)->unset_write_on_close = 1;
 | |
| +#else
 | |
|  	if (forced_write && dentry->d_inode && dentry->d_inode->u.generic_ip)
 | |
|  		((struct shfs_inode_info *)dentry->d_inode->u.generic_ip)->unset_write_on_close = 1;
 | |
| +#endif
 | |
|  	return result;
 | |
|  }
 | |
|  
 | |
| Index: shfs-0.35/shfs/Linux-2.6/file.c
 | |
| ===================================================================
 | |
| --- shfs-0.35.orig/shfs/Linux-2.6/file.c	2007-06-04 13:22:58.397977440 +0200
 | |
| +++ shfs-0.35/shfs/Linux-2.6/file.c	2007-06-04 13:22:59.020882744 +0200
 | |
| @@ -90,7 +90,11 @@
 | |
|  	struct dentry *dentry = f->f_dentry;
 | |
|  	struct shfs_sb_info *info = info_from_dentry(dentry);
 | |
|  	struct inode *inode = p->mapping->host;
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	struct shfs_inode_info *i = (struct shfs_inode_info *)inode->i_private;
 | |
| +#else
 | |
|  	struct shfs_inode_info *i = (struct shfs_inode_info *)inode->u.generic_ip;
 | |
| +#endif
 | |
|  	char *buffer = kmap(p) + offset;
 | |
|  	int written = 0, result;
 | |
|  	unsigned count = to - offset;
 | |
| @@ -252,8 +256,13 @@
 | |
|  		}
 | |
|  	}
 | |
|  	/* if file was forced to be writeable, change attrs back on close */
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	if (dentry->d_inode && dentry->d_inode->i_private) {
 | |
| +		if  (((struct shfs_inode_info *)dentry->d_inode->i_private)->unset_write_on_close) {
 | |
| +#else
 | |
|  	if (dentry->d_inode && dentry->d_inode->u.generic_ip) {
 | |
|  		if  (((struct shfs_inode_info *)dentry->d_inode->u.generic_ip)->unset_write_on_close) {
 | |
| +#endif
 | |
|  			char name[SHFS_PATH_MAX];
 | |
|  
 | |
|  			if (get_name(dentry, name) < 0)
 | |
| @@ -302,7 +311,8 @@
 | |
|  		goto error;
 | |
|  	}
 | |
|  	if (result != 0) {
 | |
| -		copy_to_user(buf, (char *)page, result);
 | |
| +		if (copy_to_user(buf, (char *)page, result))
 | |
| +			goto error;
 | |
|  		*ppos += result;
 | |
|  	}
 | |
|  error:
 | |
| @@ -315,11 +325,15 @@
 | |
|  static ssize_t 
 | |
|  shfs_slow_write(struct file *f, const char *buf, size_t count, loff_t *offset)
 | |
|  {
 | |
| -	int written = 0;
 | |
| +	ssize_t written = 0;
 | |
|  	int result;
 | |
|  	
 | |
|  	DEBUG("\n");
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	written = do_sync_write(f, buf, count, offset);
 | |
| +#else
 | |
|  	written = generic_file_write(f, buf, count, offset);
 | |
| +#endif
 | |
|  	if (written > 0) {
 | |
|  		result = do_file_flush(f);
 | |
|  		written = result < 0 ? result: written;
 | |
| @@ -330,14 +344,23 @@
 | |
|  
 | |
|  struct file_operations shfs_file_operations = {
 | |
|  	.llseek		= generic_file_llseek,
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	.read		= do_sync_read,
 | |
| +	.write		= do_sync_write,
 | |
| +#else
 | |
|  	.read		= generic_file_read,
 | |
|  	.write		= generic_file_write,
 | |
| +#endif
 | |
|  	.ioctl		= shfs_ioctl,
 | |
|  	.mmap		= generic_file_mmap,
 | |
|  	.open		= shfs_file_open,
 | |
|  	.flush		= shfs_file_flush,
 | |
|  	.release	= shfs_file_release,
 | |
|  	.fsync		= shfs_file_sync,
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	.aio_read	= generic_file_aio_read,
 | |
| +	.aio_write	= generic_file_aio_write,
 | |
| +#endif
 | |
|  };
 | |
|  
 | |
|  struct file_operations shfs_slow_operations = {
 | |
| Index: shfs-0.35/shfs/Linux-2.6/proc.c
 | |
| ===================================================================
 | |
| --- shfs-0.35.orig/shfs/Linux-2.6/proc.c	2007-06-04 13:22:58.398977288 +0200
 | |
| +++ shfs-0.35/shfs/Linux-2.6/proc.c	2007-06-04 13:22:59.021882592 +0200
 | |
| @@ -149,7 +149,12 @@
 | |
|  {
 | |
|  	struct file *f = info->sock;
 | |
|  	mm_segment_t fs;
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	ssize_t result = 0;
 | |
| +	loff_t begin;
 | |
| +#else
 | |
|  	int c, result = 0;
 | |
| +#endif
 | |
|  	unsigned long flags, sigpipe;
 | |
|  	sigset_t old_set;
 | |
|  
 | |
| @@ -161,7 +166,9 @@
 | |
|  			return result;
 | |
|  	}
 | |
|  	
 | |
| +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
 | |
|  	c = count;
 | |
| +#endif
 | |
|  
 | |
|  	fs = get_fs();
 | |
|  	set_fs(get_ds());
 | |
| @@ -173,6 +180,16 @@
 | |
|  	SIGRECALC;
 | |
|  	SIGUNLOCK(flags);
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	begin = f->f_pos;
 | |
| +	result = do_sync_write(f, buffer, count, &f->f_pos);
 | |
| +
 | |
| +	if (result < 0) {
 | |
| +		DEBUG("error: %d\n", result);
 | |
| +		fput(f);
 | |
| +		info->sock = NULL;
 | |
| +	}
 | |
| +#else
 | |
|  	do {
 | |
|  		struct iovec vec[1];
 | |
|  
 | |
| @@ -190,6 +207,7 @@
 | |
|  		buffer += result;
 | |
|  		c -= result;
 | |
|  	} while (c > 0);
 | |
| +#endif
 | |
|  
 | |
|  	SIGLOCK(flags);
 | |
|  	if (result == -EPIPE && !sigpipe) {
 | |
| @@ -204,7 +222,11 @@
 | |
|  
 | |
|  	DEBUG(">%d\n", result);
 | |
|  	if (result < 0)
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +		set_garbage(info, 1, count - (f->f_pos - begin));
 | |
| +#else
 | |
|  		set_garbage(info, 1, c);
 | |
| +#endif
 | |
|  	else
 | |
|  		result = count;
 | |
|  	return result;
 | |
| @@ -222,6 +244,9 @@
 | |
|  	int c, result = 0;
 | |
|  	unsigned long flags, sigpipe;
 | |
|  	sigset_t old_set;
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	loff_t begin;
 | |
| +#endif
 | |
|  
 | |
|  	if (!f)
 | |
|  		return -EIO;
 | |
| @@ -256,6 +281,20 @@
 | |
|  	fs = get_fs();
 | |
|  	set_fs(get_ds());
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +	begin = f->f_pos;
 | |
| +	result = do_sync_read(f, buffer, c, &f->f_pos);
 | |
| +
 | |
| +	if (!result) {
 | |
| +		/* peer has closed socket */
 | |
| +		result = -EIO;
 | |
| +	}
 | |
| +	if (result < 0) {
 | |
| +		DEBUG("error: %d\n", result);
 | |
| +		fput(f);
 | |
| +		info->sock = NULL;
 | |
| +	}
 | |
| +#else
 | |
|  	do {
 | |
|  		struct iovec vec[1];
 | |
|  
 | |
| @@ -277,6 +316,7 @@
 | |
|  		buffer += result;
 | |
|  		c -= result;
 | |
|  	} while (c > 0);
 | |
| +#endif
 | |
|  
 | |
|  	SIGLOCK(flags);
 | |
|  	if (result == -EPIPE && !sigpipe) {
 | |
| @@ -291,7 +331,11 @@
 | |
|  	
 | |
|  	DEBUG("<%d\n", result);
 | |
|  	if (result < 0)
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +		set_garbage(info, 0, count - (f->f_pos - begin));
 | |
| +#else
 | |
|  		set_garbage(info, 0, c);
 | |
| +#endif
 | |
|  	else
 | |
|  		result = count;
 | |
|  	return result;
 | |
| @@ -316,8 +360,10 @@
 | |
|  			return result;
 | |
|  	}
 | |
|  	while (1) {
 | |
| +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
 | |
|  		struct iovec vec[1];
 | |
|  
 | |
| +#endif
 | |
|  		nl = memchr(BUFFER, '\n', LEN);
 | |
|  		if (nl) {
 | |
|  			*nl = '\0';
 | |
| @@ -348,9 +394,13 @@
 | |
|  		fs = get_fs();
 | |
|  		set_fs(get_ds());
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
 | |
| +		result = do_sync_read(f, BUFFER+LEN, c, &f->f_pos);
 | |
| +#else
 | |
|  		vec[0].iov_base = BUFFER+LEN;
 | |
|  		vec[0].iov_len = c;
 | |
|  		result = f->f_op->readv(f, (const struct iovec *)&vec, 1, &f->f_pos);
 | |
| +#endif
 | |
|  		SIGLOCK(flags);
 | |
|  		if (result == -EPIPE && !sigpipe) {
 | |
|  			sigdelset(¤t->pending.signal, SIGPIPE);
 |