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); }