diff options
Diffstat (limited to 'packages/linux-uml/linux-uml-2.4.26/12-hostfs.patch')
-rw-r--r-- | packages/linux-uml/linux-uml-2.4.26/12-hostfs.patch | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/packages/linux-uml/linux-uml-2.4.26/12-hostfs.patch b/packages/linux-uml/linux-uml-2.4.26/12-hostfs.patch index e69de29bb2..124f975650 100644 --- a/packages/linux-uml/linux-uml-2.4.26/12-hostfs.patch +++ b/packages/linux-uml/linux-uml-2.4.26/12-hostfs.patch @@ -0,0 +1,109 @@ +diff -ru linux-2.4.26-1.orig/arch/um/fs/hostfs/externfs.c linux-2.4.26-1.hno/arch/um/fs/hostfs/externfs.c +--- linux-2.4.26-1.orig/arch/um/fs/hostfs/externfs.c Mon May 17 23:36:17 2004 ++++ linux-2.4.26-1.hno/arch/um/fs/hostfs/externfs.c Tue May 18 00:10:42 2004 +@@ -1133,7 +1133,7 @@ + if((mount_arg != NULL) && (*mount_arg != '\0')) + root = mount_arg; + +- return(uml_strdup(mount_arg)); ++ return(uml_strdup(root)); + } + + struct super_block *hostfs_read_super(struct super_block *sb, void *data, +diff -ru linux-2.4.26-1.orig/arch/um/fs/hostfs/host_file.c linux-2.4.26-1.hno/arch/um/fs/hostfs/host_file.c +--- linux-2.4.26-1.orig/arch/um/fs/hostfs/host_file.c Mon May 17 23:36:17 2004 ++++ linux-2.4.26-1.hno/arch/um/fs/hostfs/host_file.c Tue May 18 11:40:47 2004 +@@ -72,28 +72,21 @@ + { + char tmp[HOSTFS_BUFSIZE], *file; + int mode = 0, err; ++ struct openflags flags = OPENFLAGS(); + +- if(r && !w) +- mode = O_RDONLY; +- else if(!r && w) +- mode = O_WRONLY; +- else if(r && w) +- mode = O_RDWR; +- else { +- printk("Impossible mode in host_open_file - r = %d, w = %d", +- r, w); +- return(-EINVAL); +- } +- ++ if (r) ++ flags = of_read(flags); ++ if (w) ++ flags = of_write(flags); + if(append) +- mode |= O_APPEND; ++ flags = of_append(flags); + + err = -ENOMEM; + file = get_path(path, tmp, sizeof(tmp)); + if(file == NULL) + goto out; + +- err = open_filehandle(file, of_create(of_rdwr(OPENFLAGS())), mode, fh); ++ err = open_filehandle(file, flags, 0, fh); + out: + free_path(file, tmp); + return(err); +diff -ru linux-2.4.26-1.orig/arch/um/fs/hostfs/host_fs.c linux-2.4.26-1.hno/arch/um/fs/hostfs/host_fs.c +--- linux-2.4.26-1.orig/arch/um/fs/hostfs/host_fs.c Mon May 17 23:36:17 2004 ++++ linux-2.4.26-1.hno/arch/um/fs/hostfs/host_fs.c Tue May 18 11:38:51 2004 +@@ -111,10 +111,14 @@ + { + const char *path[] = { jail_dir, mount, file, NULL }; + int uid; ++ int gid; ++ int rc; + ++ /* These should be mount flags from an internal "superblock" */ + *uid_out = 0; ++ *gid_out = 0; + return(host_stat_file(path, dev_out, inode_out, mode_out, nlink_out, +- &uid, gid_out, size_out, atime_out, mtime_out, ++ &uid, &gid, size_out, atime_out, mtime_out, + ctime_out, blksize_out, blocks_out)); + } + +@@ -138,6 +142,12 @@ + goto out; + + err = host_open_file(path, 1, 1, fh); ++ if (err == -EISDIR) { ++ kfree(fh); ++ return NULL; ++ } ++ if (err == -EPERM) ++ err = host_open_file(path, 1, 0, fh); + if(err) + goto out_free; + +@@ -175,10 +185,9 @@ + len - ignore_end); + + out: +- if(err < 0) +- (*completion)(buf, err, arg); +- else err = 0; +- ++ (*completion)(buf, err, arg); ++ if (err > 0) ++ err = 0; + return(err); + } + +@@ -191,8 +200,9 @@ + + err = write_file(fh, offset + start, buf + start, len); + +- if(err < 0) +- (*completion)((char *) buf, err, arg); ++ (*completion)((char *) buf, err, arg); ++ if (err > 0) ++ err = 0; + return(err); + } + |