diff -urwN linux-2.6.8.1-PRISTINE/fs/Kconfig linux-2.6.8.1-mn/fs/Kconfig
--- linux-2.6.8.1-PRISTINE/fs/Kconfig	2004-10-04 18:57:06.000000000 +0200
+++ linux-2.6.8.1-mn/fs/Kconfig	2004-10-01 12:33:05.000000000 +0200
@@ -622,6 +622,34 @@
 	  as well. To compile this as a module, choose M here: the module will
 	  be called msdos.
 
+config UMSDOS_FS
+	tristate "UMSDOS: Unix-like file system on top of standard MSDOS fs"
+	depends on MSDOS_FS && BROKEN
+	help
+	  Say Y here if you want to run Linux from within an existing DOS
+	  partition of your hard drive. The advantage of this is that you can
+	  get away without repartitioning your hard drive (which often implies
+	  backing everything up and restoring afterwards) and hence you're
+	  able to quickly try out Linux or show it to your friends; the
+	  disadvantage is that Linux becomes susceptible to DOS viruses and
+	  that UMSDOS is somewhat slower than ext2fs.  Another use of UMSDOS
+	  is to write files with long unix filenames to MSDOS floppies; it
+	  also allows Unix-style soft-links and owner/permissions of files on
+	  MSDOS floppies.  You will need a program called umssync in order to
+	  make use of UMSDOS; read
+	  <file:Documentation/filesystems/umsdos.txt>.
+
+	  To get utilities for initializing/checking UMSDOS file system, or
+	  latest patches and/or information, visit the UMSDOS home page at
+	  <http://linux.voyager.hr/umsdos/>.
+
+	  This option enlarges your kernel by about 28 KB and it only works if
+	  you said Y to both "DOS FAT fs support" and "MSDOS fs support"
+	  above.  To compile this as a module, choose M here: the module will be
+	  called umsdos.  Note that the file system of your root partition
+	  (the one containing the directory /) cannot be a module, so saying M
+	  could be dangerous.  If unsure, say N.
+
 config VFAT_FS
 	tristate "VFAT (Windows-95) fs support"
 	select FAT_FS
@@ -663,35 +691,6 @@
 	  mount option for FAT filesystems.  Note that UTF8 is *not* a
 	  supported charset for FAT filesystems.
 
-config UMSDOS_FS
-#dep_tristate '    UMSDOS: Unix-like file system on top of standard MSDOS fs' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS
-# UMSDOS is temprory broken
-	bool
-	help
-	  Say Y here if you want to run Linux from within an existing DOS
-	  partition of your hard drive. The advantage of this is that you can
-	  get away without repartitioning your hard drive (which often implies
-	  backing everything up and restoring afterwards) and hence you're
-	  able to quickly try out Linux or show it to your friends; the
-	  disadvantage is that Linux becomes susceptible to DOS viruses and
-	  that UMSDOS is somewhat slower than ext2fs.  Another use of UMSDOS
-	  is to write files with long unix filenames to MSDOS floppies; it
-	  also allows Unix-style soft-links and owner/permissions of files on
-	  MSDOS floppies.  You will need a program called umssync in order to
-	  make use of UMSDOS; read
-	  <file:Documentation/filesystems/umsdos.txt>.
-
-	  To get utilities for initializing/checking UMSDOS file system, or
-	  latest patches and/or information, visit the UMSDOS home page at
-	  <http://www.voyager.hr/~mnalis/umsdos/>.
-
-	  This option enlarges your kernel by about 28 KB and it only works if
-	  you said Y to both "DOS FAT fs support" and "MSDOS fs support"
-	  above.  To compile this as a module, choose M here: the module will be
-	  called umsdos.  Note that the file system of your root partition
-	  (the one containing the directory /) cannot be a module, so saying M
-	  could be dangerous.  If unsure, say N.
-
 config NTFS_FS
 	tristate "NTFS file system support"
 	select NLS
diff -urwN linux-2.6.8.1-PRISTINE/fs/dcache.c linux-2.6.8.1-mn/fs/dcache.c
--- linux-2.6.8.1-PRISTINE/fs/dcache.c	2004-10-04 18:57:09.000000000 +0200
+++ linux-2.6.8.1-mn/fs/dcache.c	2004-10-01 11:33:47.000000000 +0200
@@ -1647,6 +1647,7 @@
 EXPORT_SYMBOL(d_lookup);
 EXPORT_SYMBOL(d_move);
 EXPORT_SYMBOL(d_path);
+EXPORT_SYMBOL(__d_path);
 EXPORT_SYMBOL(d_prune_aliases);
 EXPORT_SYMBOL(d_rehash);
 EXPORT_SYMBOL(d_splice_alias);
diff -urwN linux-2.6.8.1-PRISTINE/fs/fat/fatfs_syms.c linux-2.6.8.1-mn/fs/fat/fatfs_syms.c
--- linux-2.6.8.1-PRISTINE/fs/fat/fatfs_syms.c	2004-08-04 11:55:42.000000000 +0200
+++ linux-2.6.8.1-mn/fs/fat/fatfs_syms.c	2004-08-07 23:28:36.000000000 +0200
@@ -32,6 +32,10 @@
 EXPORT_SYMBOL(fat_add_entries);
 EXPORT_SYMBOL(fat_dir_empty);
 EXPORT_SYMBOL(fat_truncate);
+EXPORT_SYMBOL(fat_alloc_inode);
+EXPORT_SYMBOL(fat_destroy_inode);
+EXPORT_SYMBOL(fat_remount);
+EXPORT_SYMBOL(fat_show_options);
 
 int __init fat_init_inodecache(void);
 void __exit fat_destroy_inodecache(void);
diff -urwN linux-2.6.8.1-PRISTINE/fs/fat/inode.c linux-2.6.8.1-mn/fs/fat/inode.c
--- linux-2.6.8.1-PRISTINE/fs/fat/inode.c	2004-10-04 18:57:10.000000000 +0200
+++ linux-2.6.8.1-mn/fs/fat/inode.c	2004-10-01 11:33:48.000000000 +0200
@@ -189,7 +189,7 @@
 	kfree(sbi);
 }
 
-static int fat_show_options(struct seq_file *m, struct vfsmount *mnt)
+int fat_show_options(struct seq_file *m, struct vfsmount *mnt)
 {
 	struct msdos_sb_info *sbi = MSDOS_SB(mnt->mnt_sb);
 	struct fat_mount_options *opts = &sbi->options;
@@ -715,7 +715,7 @@
 
 static kmem_cache_t *fat_inode_cachep;
 
-static struct inode *fat_alloc_inode(struct super_block *sb)
+struct inode *fat_alloc_inode(struct super_block *sb)
 {
 	struct msdos_inode_info *ei;
 	ei = (struct msdos_inode_info *)kmem_cache_alloc(fat_inode_cachep, SLAB_KERNEL);
@@ -724,7 +724,7 @@
 	return &ei->vfs_inode;
 }
 
-static void fat_destroy_inode(struct inode *inode)
+void fat_destroy_inode(struct inode *inode)
 {
 	kmem_cache_free(fat_inode_cachep, MSDOS_I(inode));
 }
@@ -757,7 +757,7 @@
 		printk(KERN_INFO "fat_inode_cache: not all structures were freed\n");
 }
 
-static int fat_remount(struct super_block *sb, int *flags, char *data)
+int fat_remount(struct super_block *sb, int *flags, char *data)
 {
 	*flags |= MS_NODIRATIME;
 	return 0;
diff -urwN linux-2.6.8.1-PRISTINE/fs/msdos/Makefile linux-2.6.8.1-mn/fs/msdos/Makefile
--- linux-2.6.8.1-PRISTINE/fs/msdos/Makefile	2004-08-04 11:55:45.000000000 +0200
+++ linux-2.6.8.1-mn/fs/msdos/Makefile	2004-08-04 12:58:54.000000000 +0200
@@ -4,4 +4,4 @@
 
 obj-$(CONFIG_MSDOS_FS) += msdos.o
 
-msdos-y := namei.o
+msdos-objs := namei.o msdosfs_syms.o
diff -urwN linux-2.6.8.1-PRISTINE/fs/msdos/msdosfs_syms.c linux-2.6.8.1-mn/fs/msdos/msdosfs_syms.c
--- linux-2.6.8.1-PRISTINE/fs/msdos/msdosfs_syms.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.8.1-mn/fs/msdos/msdosfs_syms.c	2004-08-04 19:52:01.000000000 +0200
@@ -0,0 +1,26 @@
+/*
+ * linux/fs/msdos/msdosfs_syms.c
+ *
+ * Exported kernel symbols for the MS-DOS filesystem.
+ * These symbols are used by umsdos.
+ */
+
+#include <linux/module.h>
+
+#include <linux/mm.h>
+#include <linux/msdos_fs.h>
+#include <linux/init.h>
+
+/*
+ * Support for umsdos fs
+ *
+ * These symbols are _always_ exported, in case someone
+ * wants to install the umsdos module later.
+ */
+EXPORT_SYMBOL(msdos_create);
+EXPORT_SYMBOL(msdos_lookup);
+EXPORT_SYMBOL(msdos_mkdir);
+EXPORT_SYMBOL(msdos_rename);
+EXPORT_SYMBOL(msdos_rmdir);
+EXPORT_SYMBOL(msdos_unlink);
+
diff -urwN linux-2.6.8.1-PRISTINE/fs/msdos/namei.c linux-2.6.8.1-mn/fs/msdos/namei.c
--- linux-2.6.8.1-PRISTINE/fs/msdos/namei.c	2004-08-04 11:55:45.000000000 +0200
+++ linux-2.6.8.1-mn/fs/msdos/namei.c	2004-08-04 12:58:54.000000000 +0200
@@ -193,7 +193,7 @@
  */
 
 /***** Get inode using directory and name */
-static struct dentry *msdos_lookup(struct inode *dir, struct dentry *dentry,
+struct dentry *msdos_lookup(struct inode *dir, struct dentry *dentry,
 		struct nameidata *nd)
 {
 	struct super_block *sb = dir->i_sb;
@@ -259,7 +259,7 @@
 }
 
 /***** Create a file */
-static int msdos_create(struct inode *dir, struct dentry *dentry, int mode,
+int msdos_create(struct inode *dir, struct dentry *dentry, int mode,
 		struct nameidata *nd)
 {
 	struct super_block *sb = dir->i_sb;
@@ -304,7 +304,7 @@
 }
 
 /***** Remove a directory */
-static int msdos_rmdir(struct inode *dir, struct dentry *dentry)
+int msdos_rmdir(struct inode *dir, struct dentry *dentry)
 {
 	struct inode *inode = dentry->d_inode;
 	loff_t i_pos;
@@ -343,7 +343,7 @@
 }
 
 /***** Make a directory */
-static int msdos_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+int msdos_mkdir(struct inode *dir, struct dentry *dentry, int mode)
 {
 	struct super_block *sb = dir->i_sb;
 	struct buffer_head *bh;
@@ -410,7 +410,7 @@
 }
 
 /***** Unlink a file */
-static int msdos_unlink(struct inode *dir, struct dentry *dentry)
+int msdos_unlink(struct inode *dir, struct dentry *dentry)
 {
 	struct inode *inode = dentry->d_inode;
 	loff_t i_pos;
@@ -536,7 +536,7 @@
 }
 
 /***** Rename, a wrapper for rename_same_dir & rename_diff_dir */
-static int msdos_rename(struct inode *old_dir, struct dentry *old_dentry,
+int msdos_rename(struct inode *old_dir, struct dentry *old_dentry,
 		struct inode *new_dir, struct dentry *new_dentry)
 {
 	struct buffer_head *old_bh;
diff -urwN linux-2.6.8.1-PRISTINE/fs/umsdos/Makefile linux-2.6.8.1-mn/fs/umsdos/Makefile
--- linux-2.6.8.1-PRISTINE/fs/umsdos/Makefile	2004-08-04 11:55:51.000000000 +0200
+++ linux-2.6.8.1-mn/fs/umsdos/Makefile	2004-08-04 12:58:54.000000000 +0200
@@ -2,7 +2,7 @@
 # Makefile for the umsdos Unix-like filesystem routines.
 #
 
-obj-$(CONFIG_UMSDOS) += umsdos.o
+obj-$(CONFIG_UMSDOS_FS) += umsdos.o
 
 umsdos-objs := dir.o  inode.o ioctl.o mangle.o namei.o rdir.o emd.o
 
diff -urwN linux-2.6.8.1-PRISTINE/fs/umsdos/README-WIP.txt linux-2.6.8.1-mn/fs/umsdos/README-WIP.txt
--- linux-2.6.8.1-PRISTINE/fs/umsdos/README-WIP.txt	2004-08-04 11:55:51.000000000 +0200
+++ linux-2.6.8.1-mn/fs/umsdos/README-WIP.txt	2004-10-04 16:01:37.000000000 +0200
@@ -1,4 +1,35 @@
-Changes by Matija Nalis (mnalis@jagor.srce.hr) on umsdos dentry fixing
+DEVELOPER NOTES (20041004) WORK IN PROGRESS
+
++       struct inode *new_dir
++		new_dir->i_version++;
+
+bunch of
++       lock_kernel();
++	unlock_kernel()
+and
+-       error = fat_scan(old_dir, old_msdos_name, &old_bh, &old_de, &old_ino);
++       error = fat_scan(old_dir, old_msdos_name, &old_bh, &old_de, &old_i_pos);
+
+check with and without PREEMPT
+enable all kernel checks
+
+check include/linux/fs.h struct inode union umsdos_ ?
+UMSDOS_put_super: kdev_same(sb->s_dev, ROOT_DEV) and kdev_t_to_nr(inode->i_rdev)
+ioctl.c: dir->i_sb->u.msdos_sb.options.fs_uid vs
+         dir->i_sb->s_fs_info.options.fs_uid
+
+include/linux/msdos_fs.h: dmsdos ?! move externs to appropriate sections
+
+verify
+-       return &inode->u.umsdos_i;
++       return ( struct umsdos_inode_info* )&inode->u.generic_ip;
+
+Documentation/filesystems/vfs.txt
+Documentation/filesystems/porting
+
+------------------- stuff below is obsoleted ? ----------------------------
+
+Changes by Matija Nalis (mnalis-umsdos2@voyager.hr) on umsdos dentry fixing
 (started by Peter T. Waltenberg <peterw@karaka.chch.cri.nz>)
 (Final conversion to dentries Bill Hawes <whawes@star.net>)
 
diff -urwN linux-2.6.8.1-PRISTINE/fs/umsdos/dir.c linux-2.6.8.1-mn/fs/umsdos/dir.c
--- linux-2.6.8.1-PRISTINE/fs/umsdos/dir.c	2004-08-04 11:55:51.000000000 +0200
+++ linux-2.6.8.1-mn/fs/umsdos/dir.c	2004-08-05 00:30:20.000000000 +0200
@@ -369,14 +369,19 @@
 		goto out;
 	UMSDOS_I(inode)->i_patched = 1;
 	if (S_ISREG (entry->mode))
-		entry->mtime = inode->i_mtime;
+		entry->mtime = inode->i_mtime.tv_sec;
 	inode->i_mode = entry->mode;
-	inode->i_rdev = to_kdev_t (entry->rdev);
-	inode->i_atime = entry->atime;
-	inode->i_ctime = entry->ctime;
-	inode->i_mtime = entry->mtime;
+	/* TBD: still using 16-bit dev_t; is this a problem? */
+	/*inode->i_rdev = entry -> rdev;*/
+	inode->i_rdev = old_decode_dev (entry->rdev);
 	inode->i_uid = entry->uid;
 	inode->i_gid = entry->gid;
+	inode->i_atime.tv_sec = entry->atime;
+	inode->i_atime.tv_nsec = 0;
+	inode->i_ctime.tv_sec = entry->ctime;
+	inode->i_ctime.tv_nsec = 0;
+	inode->i_mtime.tv_sec = entry->mtime;
+	inode->i_mtime.tv_nsec = 0;
 
 	/* #Specification: umsdos / i_nlink
 	 * The nlink field of an inode is maintained by the MSDOS file system
@@ -593,7 +598,7 @@
 	dentry = d_alloc(parent, &qstr);
 	if (dentry) {
 		/* XXXXXXXXXXXXXXXXXXX Race alert! */
-		result = UMSDOS_rlookup(parent->d_inode, dentry);
+		result = UMSDOS_rlookup(parent->d_inode, dentry, NULL);
 		d_drop(dentry);
 		if (result)
 			goto out_fail;
@@ -628,8 +633,8 @@
 		dentry = d_alloc(parent, &qstr);
 		if (dentry) {
 			result = real ?
-				UMSDOS_rlookup(parent->d_inode, dentry) :
-				UMSDOS_lookup(parent->d_inode, dentry);
+				UMSDOS_rlookup(parent->d_inode, dentry, NULL) :
+				UMSDOS_lookup(parent->d_inode, dentry, NULL);
 			if (result)
 				goto out_fail;
 			return dentry;
@@ -646,16 +651,23 @@
 /*
  * Return a path relative to our root.
  */
+char * __d_path( struct dentry *dentry, struct vfsmount *vfsmnt,
+                        struct dentry *root, struct vfsmount *rootmnt,
+                        char *buffer, int buflen);
+#include <linux/mount.h>
+
 char * umsdos_d_path(struct dentry *dentry, char * buffer, int len)
 {
 	struct dentry * old_root;
+        struct vfsmount *rootmnt;
 	char * path;
 
 	read_lock(&current->fs->lock);
+        rootmnt = mntget(current->fs->rootmnt);
 	old_root = dget(current->fs->root);
 	read_unlock(&current->fs->lock);
 	spin_lock(&dcache_lock);
-	path = __d_path(dentry, current->fs->rootmnt, dentry->d_sb->s_root, current->fs->rootmnt, buffer, len); /* FIXME: current->fs->rootmnt */
+	path = __d_path(dentry, current->fs->rootmnt, dentry->d_sb->s_root, rootmnt, buffer, len); /* FIXME: (still valid?) current->fs->rootmnt */
 	spin_unlock(&dcache_lock);
 
 	if (*path == '/')
@@ -668,6 +680,7 @@
 		memcpy(path, UMSDOS_PSDROOT_NAME, UMSDOS_PSDROOT_LEN);
 	}
 	dput(old_root);
+        mntput(rootmnt);
 
 	return path;
 }
diff -urwN linux-2.6.8.1-PRISTINE/fs/umsdos/inode.c linux-2.6.8.1-mn/fs/umsdos/inode.c
--- linux-2.6.8.1-PRISTINE/fs/umsdos/inode.c	2004-08-04 11:55:51.000000000 +0200
+++ linux-2.6.8.1-mn/fs/umsdos/inode.c	2004-10-04 16:26:37.000000000 +0200
@@ -19,6 +19,8 @@
 #include <linux/umsdos_fs.h>
 #include <linux/list.h>
 #include <linux/pagemap.h>
+#include <linux/root_dev.h>
+#include <linux/smp_lock.h>
 
 extern struct dentry_operations umsdos_dentry_operations;
 
@@ -49,7 +51,8 @@
 void UMSDOS_put_super (struct super_block *sb)
 {
 	Printk ((KERN_DEBUG "UMSDOS_put_super: entering\n"));
-	if (saved_root && pseudo_root && kdev_same(sb->s_dev, ROOT_DEV)) {
+	if (saved_root && pseudo_root && 
+	    sb->s_dev == ROOT_DEV) {
 		shrink_dcache_parent(saved_root);
 		dput(saved_root);
 		saved_root = NULL;
@@ -67,7 +70,7 @@
 void umsdos_setup_dir(struct dentry *dir)
 {
 	struct inode *inode = dir->d_inode;
-	struct umsdos_inode_info *ui = UMSDOS_I(inode);
+	struct umsdos_add_inode_info *ui = UMSDOS_I(inode);
 
 	if (!S_ISDIR(inode->i_mode))
 		printk(KERN_ERR "umsdos_setup_dir: %s/%s not a dir!\n",
@@ -150,7 +153,7 @@
 		inode->i_op = &umsdos_symlink_inode_operations;
 	} else
 		init_special_inode(inode, inode->i_mode,
-					kdev_t_to_nr(inode->i_rdev));
+					inode->i_rdev);
 }
 
 
@@ -283,11 +286,11 @@
 	if (attr->ia_valid & ATTR_MODE)
 		entry->mode = cpu_to_le16(attr->ia_mode);
 	if (attr->ia_valid & ATTR_ATIME)
-		entry->atime = cpu_to_le32(attr->ia_atime);
+		entry->atime = cpu_to_le32(attr->ia_atime.tv_sec);
 	if (attr->ia_valid & ATTR_MTIME)
-		entry->mtime = cpu_to_le32(attr->ia_mtime);
+		entry->mtime = cpu_to_le32(attr->ia_mtime.tv_sec);
 	if (attr->ia_valid & ATTR_CTIME)
-		entry->ctime = cpu_to_le32(attr->ia_ctime);
+		entry->ctime = cpu_to_le32(attr->ia_ctime.tv_sec);
 	entry->nlink = cpu_to_le16(inode->i_nlink);
 	ret=mapping->a_ops->commit_write(NULL,page,offs,offs+UMSDOS_REC_SIZE);
 	if (ret)
@@ -335,15 +338,25 @@
 
 static struct super_operations umsdos_sops =
 {
+	.alloc_inode	= fat_alloc_inode,
+	.destroy_inode	= fat_destroy_inode,
 	.write_inode	= UMSDOS_write_inode,
-	.put_inode	= UMSDOS_put_inode,
 	.delete_inode	= fat_delete_inode,
 	.put_super	= UMSDOS_put_super,
 	.statfs		= UMSDOS_statfs,
 	.clear_inode	= fat_clear_inode,
+	.remount_fs	= fat_remount,
+
+	.read_inode	= make_bad_inode,
+
+	.show_options	= fat_show_options,
+
+	.put_inode	= UMSDOS_put_inode,
 };
 
-int UMSDOS_statfs(struct super_block *sb,struct statfs *buf)
+#include <linux/statfs.h>
+
+int UMSDOS_statfs(struct super_block *sb,struct kstatfs *buf)
 {
 	int ret;
 	ret = fat_statfs (sb, buf);
@@ -355,29 +368,24 @@
 /*
  * Read the super block of an Extended MS-DOS FS.
  */
-struct super_block *UMSDOS_read_super (struct super_block *sb, void *data,
-				      int silent)
+static int UMSDOS_fill_super (struct super_block *sb, void *data, int silent)
 {
-	struct super_block *res;
+	int res;
 	struct dentry *new_root;
 
 	/*
 	 * Call msdos-fs to mount the disk.
-	 * Note: this returns res == sb or NULL
+	 * Note: this returns res == 0 (success) else error.
 	 */
-	MSDOS_SB(sb)->options.isvfat = 0;
-	res = fat_read_super(sb, data, silent, &umsdos_rdir_inode_operations);
-
-	if (IS_ERR(res))
-		return NULL;
-	if (res == NULL) {
+	res = fat_fill_super(sb, data, silent, &umsdos_rdir_inode_operations, 0);
+	if (res) {
 		if (!silent)
 			printk(KERN_INFO "VFS: Can't find a valid "
 			       "UMSDOS filesystem on dev %s.\n", sb->s_id);
-		return NULL;
+		return res;
 	}
 
-	printk (KERN_INFO "UMSDOS 0.86k "
+	printk (KERN_INFO "UMSDOS 0.87a "
 		"(compatibility level %d.%d, fast msdos)\n", 
 		UMSDOS_VERSION, UMSDOS_RELEASE);
 
@@ -402,14 +410,16 @@
 		printk(KERN_INFO "UMSDOS: changed to alternate root\n");
 		dget (sb->s_root); sb->s_root = dget(new_root);
 	}
-	return sb;
+	return 0;
 }
 
 /*
  * Check for an alternate root if we're the root device.
  */
 
-extern kdev_t ROOT_DEV;
+#include <linux/root_dev.h>
+#include <linux/namei.h>
+
 static struct dentry *check_pseudo_root(struct super_block *sb)
 {
 	struct dentry *root, *sbin, *init;
@@ -419,7 +429,7 @@
 	 * must check like this, because we can be used with initrd
 	 */
 		
-	if (!kdev_same(sb->s_dev, ROOT_DEV))
+	if (sb->s_dev != ROOT_DEV)
 		goto out_noroot;
 
 	/* 
@@ -440,11 +450,18 @@
 	sbin = lookup_one_len("sbin", root, 4);
 	if (IS_ERR(sbin))
 		goto out_dput;
-	if (!sbin->d_inode || !S_ISDIR(sbin->d_inode->i_mode))
+printk(KERN_INFO "check_pseudo_root: 1\n");
+	if (!sbin->d_inode)
+		goto out_dput_sbin;
+printk(KERN_INFO "check_pseudo_root: 2x\n");
+	if (!S_ISDIR(sbin->d_inode->i_mode))
 		goto out_dput_sbin;
+printk(KERN_INFO "check_pseudo_root: 3\n");
 	init = lookup_one_len("init", sbin, 4);
+printk(KERN_INFO "check_pseudo_root: 4\n");
 	if (IS_ERR(init))
 		goto out_dput_sbin;
+printk(KERN_INFO "check_pseudo_root: 5\n");
 	if (!init->d_inode)
 		goto out_dput_init;
 	printk(KERN_INFO "check_pseudo_root: found %s/%s, enabling pseudo-root\n", init->d_parent->d_name.name, init->d_name.name);
@@ -463,8 +480,19 @@
 	return NULL;
 }
 
+static struct super_block *umsdos_get_sb(struct file_system_type *fs_type,
+        int flags, const char *dev_name, void *data)
+{
+        return get_sb_bdev(fs_type, flags, dev_name, data, UMSDOS_fill_super);
+}
 
-static DECLARE_FSTYPE_DEV(umsdos_fs_type, "umsdos", UMSDOS_read_super);
+static struct file_system_type umsdos_fs_type = {
+        .owner          = THIS_MODULE,
+        .name           = "umsdos",
+        .get_sb         = umsdos_get_sb,
+        .kill_sb        = kill_block_super,
+        .fs_flags       = FS_REQUIRES_DEV,
+};
 
 static int __init init_umsdos_fs (void)
 {
@@ -479,3 +507,4 @@
 module_init(init_umsdos_fs)
 module_exit(exit_umsdos_fs)
 MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("UN*X semantics over MS-DOS filesystem");
diff -urwN linux-2.6.8.1-PRISTINE/fs/umsdos/ioctl.c linux-2.6.8.1-mn/fs/umsdos/ioctl.c
--- linux-2.6.8.1-PRISTINE/fs/umsdos/ioctl.c	2004-08-04 11:55:51.000000000 +0200
+++ linux-2.6.8.1-mn/fs/umsdos/ioctl.c	2004-08-05 00:55:44.000000000 +0200
@@ -402,9 +402,9 @@
 			data.stat.st_ino = inode->i_ino;
 			data.stat.st_mode = inode->i_mode;
 			data.stat.st_size = inode->i_size;
-			data.stat.st_atime = inode->i_atime;
-			data.stat.st_ctime = inode->i_ctime;
-			data.stat.st_mtime = inode->i_mtime;
+			data.stat.st_atime = inode->i_atime.tv_sec;
+			data.stat.st_ctime = inode->i_ctime.tv_sec;
+			data.stat.st_mtime = inode->i_mtime.tv_sec;
 			ret = -EFAULT;
 			if (!copy_to_user (&idata->stat, &data.stat, 
 						sizeof (data.stat)))
@@ -414,6 +414,7 @@
 		goto out;
 	}
 	else if (cmd == UMSDOS_DOS_SETUP) {
+		struct msdos_sb_info *msdossbi = (struct msdos_sb_info *)dir->i_sb->s_fs_info;
 		/* #Specification: ioctl / UMSDOS_DOS_SETUP
 		 * The UMSDOS_DOS_SETUP ioctl allow changing the
 		 * default permission of the MS-DOS filesystem driver
@@ -433,10 +434,11 @@
 		 * umsdos_dirent.uid and gid sets the owner and group.
 		 * umsdos_dirent.mode set the permissions flags.
 		 */
-		dir->i_sb->u.msdos_sb.options.fs_uid = data.umsdos_dirent.uid;
-		dir->i_sb->u.msdos_sb.options.fs_gid = data.umsdos_dirent.gid;
-		dir->i_sb->u.msdos_sb.options.fs_fmask =
-			dir->i_sb->u.msdos_sb.options.fs_dmask =
+		msdossbi->options.fs_uid = data.umsdos_dirent.uid;
+		msdossbi->options.fs_gid = data.umsdos_dirent.gid;
+		msdossbi->options.fs_fmask =
+				data.umsdos_dirent.mode;
+		msdossbi->options.fs_dmask =
 				data.umsdos_dirent.mode;
 		ret = 0;
 	}
diff -urwN linux-2.6.8.1-PRISTINE/fs/umsdos/mangle.c linux-2.6.8.1-mn/fs/umsdos/mangle.c
--- linux-2.6.8.1-PRISTINE/fs/umsdos/mangle.c	2004-08-04 11:55:51.000000000 +0200
+++ linux-2.6.8.1-mn/fs/umsdos/mangle.c	2004-08-04 12:58:54.000000000 +0200
@@ -10,6 +10,7 @@
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
+#include <linux/msdos_fs.h>
 #include <linux/umsdos_fs.h>
 
 /* (This file is used outside of the kernel) */
diff -urwN linux-2.6.8.1-PRISTINE/fs/umsdos/namei.c linux-2.6.8.1-mn/fs/umsdos/namei.c
--- linux-2.6.8.1-PRISTINE/fs/umsdos/namei.c	2004-08-04 11:55:51.000000000 +0200
+++ linux-2.6.8.1-mn/fs/umsdos/namei.c	2004-08-06 11:14:22.000000000 +0200
@@ -21,6 +21,7 @@
 #include <linux/msdos_fs.h>
 #include <linux/umsdos_fs.h>
 #include <linux/slab.h>
+#include <linux/sched.h>
 
 #define UMSDOS_DIR_LOCK
 
@@ -253,7 +254,7 @@
 		goto out;
 
 	info.entry.mode = mode;
-	info.entry.rdev = rdev;
+	info.entry.rdev = old_encode_dev(rdev);
 	info.entry.flags = flags;
 	info.entry.uid = current->fsuid;
 	info.entry.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid;
diff -urwN linux-2.6.8.1-PRISTINE/include/linux/msdos_fs.h linux-2.6.8.1-mn/include/linux/msdos_fs.h
--- linux-2.6.8.1-PRISTINE/include/linux/msdos_fs.h	2004-08-04 11:55:21.000000000 +0200
+++ linux-2.6.8.1-mn/include/linux/msdos_fs.h	2004-10-04 16:09:14.000000000 +0200
@@ -280,6 +280,13 @@
 extern int fat_statfs(struct super_block *sb, struct kstatfs *buf);
 extern void fat_write_inode(struct inode *inode, int wait);
 extern int fat_notify_change(struct dentry * dentry, struct iattr * attr);
+struct inode *fat_alloc_inode(struct super_block *sb);
+void fat_destroy_inode(struct inode *inode);
+int fat_remount(struct super_block *sb, int *flags, char *data);
+int fat_show_options(struct seq_file *m, struct vfsmount *mnt);
+
+
+
 
 /* fat/misc.c */
 extern void fat_fs_panic(struct super_block *s, const char *fmt, ...);
@@ -309,6 +316,28 @@
 	return fat__get_entry(dir, pos, bh, de, i_pos);
 }
 
+/* msdos/namei.c  - these are for Umsdos */
+extern struct dentry *msdos_lookup(struct inode *dir, struct dentry *, struct nameidata *);
+extern int msdos_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *);
+extern int msdos_rmdir(struct inode *dir, struct dentry *dentry);
+extern int msdos_mkdir(struct inode *dir, struct dentry *dentry, int mode);
+extern int msdos_unlink(struct inode *dir, struct dentry *dentry);
+extern int msdos_rename(struct inode *old_dir, struct dentry *old_dentry,
+			struct inode *new_dir, struct dentry *new_dentry);
+
+/* vfat/namei.c - these are for dmsdos */
+extern struct dentry *vfat_lookup(struct inode *dir, struct dentry *, struct nameidata *);
+extern int vfat_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *);
+extern int vfat_rmdir(struct inode *dir, struct dentry *dentry);
+extern int vfat_unlink(struct inode *dir, struct dentry *dentry);
+extern int vfat_mkdir(struct inode *dir, struct dentry *dentry, int mode);
+extern int vfat_rename(struct inode *old_dir, struct dentry *old_dentry,
+		       struct inode *new_dir, struct dentry *new_dentry);
+extern int vfat_fill_super(struct super_block *sb, void *data, int silent);
+
+/* vfat/vfatfs_syms.c */
+extern struct file_system_type vfat_fs_type;
+
 #endif /* __KERNEL__ */
 
 #endif
diff -urwN linux-2.6.8.1-PRISTINE/include/linux/msdos_fs_i.h linux-2.6.8.1-mn/include/linux/msdos_fs_i.h
--- linux-2.6.8.1-PRISTINE/include/linux/msdos_fs_i.h	2004-08-04 11:55:21.000000000 +0200
+++ linux-2.6.8.1-mn/include/linux/msdos_fs_i.h	2004-10-04 16:01:44.000000000 +0200
@@ -2,6 +2,7 @@
 #define _MSDOS_FS_I
 
 #include <linux/fs.h>
+#include <linux/umsdos_fs_i.h>
 
 /*
  * MS-DOS file system inode data in memory
@@ -19,6 +20,7 @@
 	int i_ctime_ms;	/* unused change time in milliseconds */
 	loff_t i_pos;	/* on-disk position of directory entry or 0 */
 	struct list_head i_fat_hash;	/* hash by i_location */
+	struct umsdos_add_inode_info ums_inode; /* used by UMSDOS */
 	struct inode vfs_inode;
 };
 
diff -urwN linux-2.6.8.1-PRISTINE/include/linux/umsdos_fs.h linux-2.6.8.1-mn/include/linux/umsdos_fs.h
--- linux-2.6.8.1-PRISTINE/include/linux/umsdos_fs.h	2004-08-04 11:55:21.000000000 +0200
+++ linux-2.6.8.1-mn/include/linux/umsdos_fs.h	2004-10-04 16:25:58.000000000 +0200
@@ -175,6 +175,11 @@
 extern struct file_operations umsdos_dir_operations;
 extern struct file_operations umsdos_rdir_operations;
 
+static inline struct umsdos_add_inode_info *UMSDOS_I(struct inode *inode)
+{
+	return &(MSDOS_I(inode)->ums_inode);
+}
+
 #include <linux/umsdos_fs.p>
 
 #endif				/* __KERNEL__ */
diff -urwN linux-2.6.8.1-PRISTINE/include/linux/umsdos_fs.p linux-2.6.8.1-mn/include/linux/umsdos_fs.p
--- linux-2.6.8.1-PRISTINE/include/linux/umsdos_fs.p	2004-08-04 11:55:21.000000000 +0200
+++ linux-2.6.8.1-mn/include/linux/umsdos_fs.p	2004-10-04 16:15:32.000000000 +0200
@@ -37,8 +37,8 @@
 int UMSDOS_notify_change (struct dentry *, struct iattr *attr);
 int umsdos_notify_change_locked(struct dentry *, struct iattr *attr);
 void UMSDOS_put_inode (struct inode *);
-int UMSDOS_statfs (struct super_block *, struct statfs *);
-struct super_block *UMSDOS_read_super (struct super_block *, void *, int);
+int UMSDOS_statfs (struct super_block *, struct kstatfs *);
+int UMSDOS_read_super (struct super_block *, void *, int);
 void UMSDOS_put_super (struct super_block *);
 
 void umsdos_setup_dir(struct dentry *);
@@ -74,7 +74,7 @@
 		 struct dentry *dentry);
 int UMSDOS_create (struct inode *dir,
 		   struct dentry *dentry,
-		   int mode);
+		   int mode, struct nameidata*);
 
 int UMSDOS_mkdir (struct inode *dir,
 		  struct dentry *dentry,
@@ -94,7 +94,3 @@
 struct dentry *umsdos_rlookup_x (struct inode *dir, struct dentry *dentry, int nopseudo);
 struct dentry *UMSDOS_rlookup (struct inode *dir, struct dentry *dentry, struct nameidata *nd);
 
-static inline struct umsdos_inode_info *UMSDOS_I(struct inode *inode)
-{
-	return &inode->u.umsdos_i;
-}
diff -urwN linux-2.6.8.1-PRISTINE/include/linux/umsdos_fs_i.h linux-2.6.8.1-mn/include/linux/umsdos_fs_i.h
--- linux-2.6.8.1-PRISTINE/include/linux/umsdos_fs_i.h	2004-08-04 11:55:21.000000000 +0200
+++ linux-2.6.8.1-mn/include/linux/umsdos_fs_i.h	2004-10-04 16:01:36.000000000 +0200
@@ -5,9 +5,6 @@
 #include <linux/types.h>
 #endif
 
-#include <linux/msdos_fs_i.h>
-#include <linux/pipe_fs_i.h>
-
 /* #Specification: strategy / in memory inode
  * Here is the information specific to the inode of the UMSDOS file
  * system. This information is added to the end of the standard struct
@@ -47,8 +44,7 @@
 				 * lock */
 };
 
-struct umsdos_inode_info {
-	struct msdos_inode_info msdos_info;
+struct umsdos_add_inode_info {
 	struct dir_locking_info dir_info;
 	int i_patched;		/* Inode has been patched */
 	int i_is_hlink;		/* Resolved hardlink inode? */
