|
|
@@ -0,0 +1,367 @@
|
|
|
+--- 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(¤t->pending.signal, SIGPIPE);
|