You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openwrt/package/shfs/patches/104-shfs_0.35_inode_and_fs....

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(&current->pending.signal, SIGPIPE);