Package: shfs-source
Version: 0.35-6.2
Followup-For: Bug #420770

Attached is a patch from gentoo. I haven't tested it extensively, but it
applies more or less cleanly and seems to work.

-- System Information:
Debian Release: lenny/sid
  APT prefers testing
  APT policy: (750, 'testing'), (110, 'unstable')
Architecture: powerpc (ppc)

Kernel: Linux 2.6.18cavybook1
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages shfs-source depends on:
ii  bzip2                         1.0.3-6    high-quality block-sorting file co
ii  debconf                       1.5.13     Debian configuration management sy
ii  debhelper                     5.0.49     helper programs for debian/rules
ii  module-assistant              0.10.11    tool to make module package creati

Versions of packages shfs-source recommends:
ii  shfs-utils                    0.35-6.2   (secure) SHell File System mount p

-- no debconf information
--- shfs-0.35.orig/shfs/Linux-2.6/fcache.c	2007-01-03 22:29:26.000000000 -0600
+++ shfs-0.35/shfs/Linux-2.6/fcache.c	2007-01-03 22:34:21.000000000 -0600
@@ -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;
--- shfs-0.35.orig/shfs/Linux-2.6/inode.c	2004-06-01 08:16:19.000000000 -0500
+++ shfs-0.35/shfs/Linux-2.6/inode.c	2007-01-03 22:39:44.000000000 -0600
@@ -35,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;
 
@@ -52,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;
 
@@ -75,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;
@@ -107,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;
@@ -172,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);
--- shfs-0.35.orig/shfs/Linux-2.6/dir.c	2007-01-03 22:38:23.000000000 -0600
+++ shfs-0.35/shfs/Linux-2.6/dir.c	2007-01-03 22:39:06.000000000 -0600
@@ -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;
 }
 
--- shfs-0.35.orig/shfs/Linux-2.6/file.c	2007-01-03 22:40:24.000000000 -0600
+++ shfs-0.35/shfs/Linux-2.6/file.c	2007-01-03 22:45:11.000000000 -0600
@@ -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 = {
--- shfs-0.35.orig/shfs/Linux-2.6/proc.c	2007-01-03 22:45:32.000000000 -0600
+++ shfs-0.35/shfs/Linux-2.6/proc.c	2007-01-03 22:57:17.000000000 -0600
@@ -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(&current->pending.signal, SIGPIPE);

Reply via email to