diff -Naur -X exclude-files ac_cur/arch/um/fs/hostfs/hostfs.h ac/arch/um/fs/hostfs/hostfs.h
--- ac_cur/arch/um/fs/hostfs/hostfs.h	Fri Jun  1 20:50:46 2001
+++ ac/arch/um/fs/hostfs/hostfs.h	Fri Jun  1 21:23:40 2001
@@ -4,6 +4,10 @@
 #define HOSTFS_FILE 1 
 #define HOSTFS_DIR 2 
 #define HOSTFS_SYMLINK 3 
+#define HOSTFS_CHARDEV 4
+#define HOSTFS_BLOCDEV 5
+#define HOSTFS_FIFO 6
+#define HOSTFS_SOCK 7
 
 /* These are exactly the same definitions as in fs.h, but the names are 
  *  changed so that this file can be included in both kernel and user files.
@@ -41,7 +45,7 @@
 		     int *blocks_out);
 extern int access_file(char *path, int r, int w, int x);
 extern int open_file(char *path, int r, int w);
-extern int file_type(const char *path);
+extern int file_type(const char *path, int *rdev);
 extern void *open_dir(char *path, int *err_out);
 extern char *read_dir(void *stream, unsigned long long *pos, int *len_out);
 extern void close_file(void *stream);
@@ -57,6 +61,7 @@
 extern int unlink_file(const char *file);
 extern int do_mkdir(const char *file, int mode);
 extern int do_rmdir(const char *file);
+extern int do_mknod(const char *file, int mode, int dev);
 extern int link_file(const char *from, const char *to);
 extern int do_readlink(char *file, char *buf, int size);
 extern int rename_file(char *from, char *to);
diff -Naur -X exclude-files ac_cur/arch/um/fs/hostfs/hostfs_kern.c ac/arch/um/fs/hostfs/hostfs_kern.c
--- ac_cur/arch/um/fs/hostfs/hostfs_kern.c	Fri Jun  1 20:50:46 2001
+++ ac/arch/um/fs/hostfs/hostfs_kern.c	Fri Jun  1 21:24:46 2001
@@ -318,7 +318,7 @@
 {
 	struct inode *inode;
 	char *name;
-	int type, err = 0;
+	int type, err = 0, rdev;
 
 	inode = get_empty_inode();
 	if(inode == NULL) return(NULL);
@@ -331,7 +331,7 @@
 			err = -ENOMEM;
 			goto out;
 		}
-		type = file_type(name);
+		type = file_type(name, &rdev);
 		kfree(name);
 	}
 	else type = HOSTFS_DIR;
@@ -347,6 +347,21 @@
 	if(type == HOSTFS_SYMLINK) inode->i_mapping->a_ops = &hostfs_link_aops;
 	else inode->i_mapping->a_ops = &hostfs_aops;
 
+	switch (type) {
+	case HOSTFS_CHARDEV:
+		init_special_inode(inode, S_IFCHR, rdev);
+		break;
+	case HOSTFS_BLOCDEV:
+		init_special_inode(inode, S_IFBLK, rdev);
+		break;
+	case HOSTFS_FIFO:
+		init_special_inode(inode, S_IFIFO, 0);
+		break;
+	case HOSTFS_SOCK:
+		init_special_inode(inode, S_IFSOCK, 0);
+		break;
+	}
+	
 	return(inode);
  out:
 	iput(inode);
@@ -481,8 +496,13 @@
 
 int hostfs_mknod(struct inode *ino, struct dentry *dentry, int mode, int dev)
 {
-	not_implemented();
-	return(-EINVAL);
+	char *file;
+	int err;
+
+	if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM);
+	err = do_mknod(file, mode, dev);
+	kfree(file);
+	return(err);
 }
 
 int hostfs_rename(struct inode *from_ino, struct dentry *from,
diff -Naur -X exclude-files ac_cur/arch/um/fs/hostfs/hostfs_user.c ac/arch/um/fs/hostfs/hostfs_user.c
--- ac_cur/arch/um/fs/hostfs/hostfs_user.c	Fri Jun  1 20:50:47 2001
+++ ac/arch/um/fs/hostfs/hostfs_user.c	Fri Jun  1 21:25:29 2001
@@ -41,13 +41,18 @@
 	return(0);
 }
 
-int file_type(const char *path)
+int file_type(const char *path, int *rdev)
 {
 	struct stat buf;
 
 	if(lstat(path, &buf) < 0) return(-errno);
+	*rdev = buf.st_rdev;
 	if(S_ISDIR(buf.st_mode)) return(HOSTFS_DIR);
 	else if(S_ISLNK(buf.st_mode)) return(HOSTFS_SYMLINK);
+	else if(S_ISCHR(buf.st_mode)) return(HOSTFS_CHARDEV);
+	else if(S_ISBLK(buf.st_mode)) return(HOSTFS_BLOCDEV);
+	else if(S_ISFIFO(buf.st_mode)) return(HOSTFS_FIFO);
+	else if(S_ISSOCK(buf.st_mode)) return(HOSTFS_SOCK);
 	else return(HOSTFS_FILE);
 }
 
@@ -252,6 +257,15 @@
 	int err;
 
 	err = rmdir(file);
+	if(err) return(-errno);
+	return(0);
+}
+
+int do_mknod(const char *file, int mode, int dev)
+{
+	int err;
+
+	err = mknod(file, mode, dev);
 	if(err) return(-errno);
 	return(0);
 }
diff -Naur -X exclude-files ac_cur/arch/um/kernel/user_syms.c ac/arch/um/kernel/user_syms.c
--- ac_cur/arch/um/kernel/user_syms.c	Fri Jun  1 20:50:47 2001
+++ ac/arch/um/kernel/user_syms.c	Fri Jun  1 21:25:44 2001
@@ -74,6 +74,7 @@
 EXPORT_SYMBOL(utime);
 EXPORT_SYMBOL(chmod);
 EXPORT_SYMBOL(rename);
+EXPORT_SYMBOL(__xmknod);
 
 EXPORT_SYMBOL(symlink);
 EXPORT_SYMBOL(link);