diff -ur linux-2.6.7-PRISTINE/fs/dcache.c linux-2.6.7/fs/dcache.c
--- linux-2.6.7-PRISTINE/fs/dcache.c	2004-07-22 00:24:53.000000000 +0200
+++ linux-2.6.7/fs/dcache.c	2004-07-24 16:31:45.000000000 +0200
@@ -1666,6 +1666,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 -ur linux-2.6.7-PRISTINE/fs/Kconfig linux-2.6.7/fs/Kconfig
--- linux-2.6.7-PRISTINE/fs/Kconfig	2004-07-22 00:24:53.000000000 +0200
+++ linux-2.6.7/fs/Kconfig	2004-07-24 20:08:27.000000000 +0200
@@ -623,7 +623,7 @@
 
 config MSDOS_FS
 	tristate "MSDOS fs support"
-	depends on FAT_FS
+	depends on FAT_FS && BROKEN
 	help
 	  This allows you to mount MSDOS partitions of your hard drive (unless
 	  they are compressed; to access compressed MSDOS partitions under
@@ -673,9 +673,8 @@
 	  vfat.
 
 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
+	tristate "UMSDOS: Unix-like file system on top of standard MSDOS fs"
+	depends on MSDOS_FS
 	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
diff -ur linux-2.6.7-PRISTINE/fs/msdos/Makefile linux-2.6.7/fs/msdos/Makefile
--- linux-2.6.7-PRISTINE/fs/msdos/Makefile	2004-07-22 00:24:14.000000000 +0200
+++ linux-2.6.7/fs/msdos/Makefile	2004-07-24 16:18:21.000000000 +0200
@@ -4,4 +4,4 @@
 
 obj-$(CONFIG_MSDOS_FS) += msdos.o
 
-msdos-y := namei.o
+msdos-objs := namei.o msdosfs_syms.o
diff -ur linux-2.6.7-PRISTINE/fs/msdos/namei.c linux-2.6.7/fs/msdos/namei.c
--- linux-2.6.7-PRISTINE/fs/msdos/namei.c	2004-07-22 00:24:14.000000000 +0200
+++ linux-2.6.7/fs/msdos/namei.c	2004-07-24 16:28:14.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 -ur linux-2.6.7-PRISTINE/fs/umsdos/dir.c linux-2.6.7/fs/umsdos/dir.c
--- linux-2.6.7-PRISTINE/fs/umsdos/dir.c	2004-02-04 04:43:47.000000000 +0100
+++ linux-2.6.7/fs/umsdos/dir.c	2004-07-22 00:29:52.000000000 +0200
@@ -368,15 +368,16 @@
 	if (UMSDOS_I(inode)->i_patched)
 		goto out;
 	UMSDOS_I(inode)->i_patched = 1;
-	if (S_ISREG (entry->mode))
-		entry->mtime = inode->i_mtime;
-	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;
-	inode->i_uid = entry->uid;
-	inode->i_gid = entry->gid;
+        if (S_ISREG (entry->mode))
+                entry->mtime = inode->i_mtime.tv_sec;
+        inode->i_mode = entry->mode;
+        inode->i_rdev = entry -> rdev;
+        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 +594,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, 0);
 		d_drop(dentry);
 		if (result)
 			goto out_fail;
@@ -628,8 +629,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, 0) :
+				UMSDOS_lookup(parent->d_inode, dentry, 0);
 			if (result)
 				goto out_fail;
 			return dentry;
@@ -646,16 +647,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 +676,7 @@
 		memcpy(path, UMSDOS_PSDROOT_NAME, UMSDOS_PSDROOT_LEN);
 	}
 	dput(old_root);
+        mntput(rootmnt);
 
 	return path;
 }
diff -ur linux-2.6.7-PRISTINE/fs/umsdos/inode.c linux-2.6.7/fs/umsdos/inode.c
--- linux-2.6.7-PRISTINE/fs/umsdos/inode.c	2004-02-04 04:43:11.000000000 +0100
+++ linux-2.6.7/fs/umsdos/inode.c	2004-07-24 18:47:14.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,7 @@
 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;
@@ -150,7 +152,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 +285,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)
@@ -343,7 +345,9 @@
 	.clear_inode	= fat_clear_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 +359,16 @@
 /*
  * 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
-	 */
-	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) {
-		if (!silent)
-			printk(KERN_INFO "VFS: Can't find a valid "
-			       "UMSDOS filesystem on dev %s.\n", sb->s_id);
-		return NULL;
-	}
+	res = fat_fill_super(sb, data, silent, &umsdos_rdir_inode_operations, 0);
+	if(res)
+		return res;
 
-	printk (KERN_INFO "UMSDOS 0.86k "
+	printk (KERN_INFO "UMSDOS 0.87 "
 		"(compatibility level %d.%d, fast msdos)\n", 
 		UMSDOS_VERSION, UMSDOS_RELEASE);
 
@@ -402,14 +393,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 +412,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 +433,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 +463,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 +490,4 @@
 module_init(init_umsdos_fs)
 module_exit(exit_umsdos_fs)
 MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("UN*X semantics over MS-DOS filesystem");
diff -ur linux-2.6.7-PRISTINE/fs/umsdos/ioctl.c linux-2.6.7/fs/umsdos/ioctl.c
--- linux-2.6.7-PRISTINE/fs/umsdos/ioctl.c	2004-02-04 04:43:10.000000000 +0100
+++ linux-2.6.7/fs/umsdos/ioctl.c	2004-07-22 00:29:52.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)))
@@ -433,10 +433,10 @@
 		 * 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 =
+		MSDOS_SB(dir->i_sb)->options.fs_uid = data.umsdos_dirent.uid;
+		MSDOS_SB(dir->i_sb)->options.fs_gid = data.umsdos_dirent.gid;
+		MSDOS_SB(dir->i_sb)->options.fs_fmask =
+			MSDOS_SB(dir->i_sb)->options.fs_dmask =
 				data.umsdos_dirent.mode;
 		ret = 0;
 	}
diff -ur linux-2.6.7-PRISTINE/fs/umsdos/Makefile linux-2.6.7/fs/umsdos/Makefile
--- linux-2.6.7-PRISTINE/fs/umsdos/Makefile	2004-02-04 04:43:29.000000000 +0100
+++ linux-2.6.7/fs/umsdos/Makefile	2004-07-22 23:35:51.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 -ur linux-2.6.7-PRISTINE/fs/umsdos/mangle.c linux-2.6.7/fs/umsdos/mangle.c
--- linux-2.6.7-PRISTINE/fs/umsdos/mangle.c	2004-02-04 04:44:21.000000000 +0100
+++ linux-2.6.7/fs/umsdos/mangle.c	2004-07-22 00:29:52.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 -ur linux-2.6.7-PRISTINE/fs/umsdos/namei.c linux-2.6.7/fs/umsdos/namei.c
--- linux-2.6.7-PRISTINE/fs/umsdos/namei.c	2004-02-04 04:44:06.000000000 +0100
+++ linux-2.6.7/fs/umsdos/namei.c	2004-07-22 00:29:52.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
 
diff -ur linux-2.6.7-PRISTINE/fs/umsdos/README-WIP.txt linux-2.6.7/fs/umsdos/README-WIP.txt
--- linux-2.6.7-PRISTINE/fs/umsdos/README-WIP.txt	2004-02-04 04:43:43.000000000 +0100
+++ linux-2.6.7/fs/umsdos/README-WIP.txt	2004-07-24 19:05:14.000000000 +0200
@@ -1,4 +1,21 @@
-Changes by Matija Nalis (mnalis@jagor.srce.hr) on umsdos dentry fixing
+DEVELOPER NOTES (20040724) 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
+
+------------------- 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 -ur linux-2.6.7-PRISTINE/include/linux/msdos_fs.h linux-2.6.7/include/linux/msdos_fs.h
--- linux-2.6.7-PRISTINE/include/linux/msdos_fs.h	2004-07-22 00:24:16.000000000 +0200
+++ linux-2.6.7/include/linux/msdos_fs.h	2004-07-22 00:29:52.000000000 +0200
@@ -309,6 +309,29 @@
 	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);
+extern int msdos_fill_super(struct super_block *sb, void *data, int silent);
+
+/* 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 -ur linux-2.6.7-PRISTINE/include/linux/umsdos_fs.p linux-2.6.7/include/linux/umsdos_fs.p
--- linux-2.6.7-PRISTINE/include/linux/umsdos_fs.p	2004-02-04 04:43:39.000000000 +0100
+++ linux-2.6.7/include/linux/umsdos_fs.p	2004-07-22 00:29:52.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,9 @@
 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);
 
+#include <linux/umsdos_fs_i.h>
+
 static inline struct umsdos_inode_info *UMSDOS_I(struct inode *inode)
 {
-	return &inode->u.umsdos_i;
+	return ( struct umsdos_inode_info* )&inode->u.generic_ip;
 }
