diff -ur linux-2.3.31.orig/Documentation/Configure.help linux/Documentation/Configure.help
--- linux-2.3.31.orig/Documentation/Configure.help	Thu Dec  9 04:54:08 1999
+++ linux/Documentation/Configure.help	Thu Dec  9 04:56:49 1999
@@ -8311,6 +8311,10 @@
   MSDOS floppies. You will need a program called umssync in order to
   make use of umsdos; read Documentation/filesystems/umsdos.txt. 
 
+  To get utilities for initializing/checking UMSDOS filesystem, or
+  latest patches and/or information, visit UMSDOS homepage 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 "fat fs support" and "msdos fs support" above. If
   you want to compile this as a module ( = code which can be inserted
diff -ur linux-2.3.31.orig/MAINTAINERS linux/MAINTAINERS
--- linux-2.3.31.orig/MAINTAINERS	Thu Dec  9 04:54:08 1999
+++ linux/MAINTAINERS	Thu Dec  9 04:56:49 1999
@@ -917,8 +917,9 @@
 
 UMSDOS FILESYSTEM
 P:	Matija Nalis
-M:	mnalis@jagor.srce.hr
+M:	Matija Nalis <mnalis-umsdos@voyager.hr>
 L:	linux-kernel@vger.rutgers.edu
+W:	http://www.voyager.hr/~mnalis/umsdos/
 S:	Maintained
 
 UNIFORM CDROM DRIVER
diff -ur linux-2.3.31.orig/fs/umsdos/README-WIP.txt linux/fs/umsdos/README-WIP.txt
--- linux-2.3.31.orig/fs/umsdos/README-WIP.txt	Fri Jun 25 11:23:18 1999
+++ linux/fs/umsdos/README-WIP.txt	Mon Nov 29 03:51:51 1999
@@ -11,6 +11,16 @@
 come and test it! See notes below for some more information, or if
 you are trying to use UMSDOS as root partition.
 
+Userland NOTE: new umsdos_progs (umssync, umssetup, udosctl & friends) that
+will compile and work on 2.2.x kernels and glibc based systems may be found
+at http://cvs.linux.hr/
+
+Also look at the quick-hack "homepage" for umsdos filesystem at 
+http://www.voyager.hr/~mnalis/umsdos
+
+Information below is getting outdated slowly -- I'll fix it one day when I
+get enough time - there are more important things to fix right now.
+
 Legend: those lines marked with '+' on the beggining of line indicates it
 passed all of my tests, and performed perfect in all of them.
 
diff -ur linux-2.3.31.orig/fs/umsdos/check.c linux/fs/umsdos/check.c
--- linux-2.3.31.orig/fs/umsdos/check.c	Wed Dec  1 06:51:55 1999
+++ linux/fs/umsdos/check.c	Wed Dec  1 06:29:38 1999
@@ -60,6 +60,14 @@
 
 #if UMS_DEBUG
 /*
+ * check for wait queue in 2.3.x
+ */
+inline void uq_log (char *txt, struct inode *inode)
+{
+	printk (KERN_ERR "%s: (%lu) magic=%lu creator=%lu lock=%u\n", txt, inode->i_ino, inode->u.umsdos_i.dir_info.p.__magic, inode->u.umsdos_i.dir_info.p.__creator, inode->u.umsdos_i.dir_info.p.lock.lock);
+}
+
+/*
  * check a superblock
  */
 
@@ -213,6 +221,7 @@
 	}
 }
 #else
+inline void uq_log (char *txt, struct inode *inode) {};
 void check_sb (struct super_block *sb, const char c) {};
 void check_inode (struct inode *inode) {};
 void checkd_inode (struct inode *inode) {};
diff -ur linux-2.3.31.orig/fs/umsdos/dir.c linux/fs/umsdos/dir.c
--- linux-2.3.31.orig/fs/umsdos/dir.c	Thu Dec  9 04:53:58 1999
+++ linux/fs/umsdos/dir.c	Thu Dec  9 04:56:23 1999
@@ -49,9 +49,7 @@
 	umsdos_dentry_validate,	/* d_revalidate(struct dentry *, int) */
 	NULL,			/* d_hash */
 	NULL,			/* d_compare */
-	umsdos_dentry_dput,	/* d_delete(struct dentry *) */
-	NULL,
-	NULL,
+	umsdos_dentry_dput	/* d_delete(struct dentry *) */
 };
 
 
@@ -836,5 +834,5 @@
 	NULL,			/* writepage */
 	NULL,			/* truncate */
 	NULL,			/* permission */
-	NULL,			/* revalidate */
+	NULL			/* revalidate */
 };
diff -ur linux-2.3.31.orig/fs/umsdos/inode.c linux/fs/umsdos/inode.c
--- linux-2.3.31.orig/fs/umsdos/inode.c	Wed Dec  1 06:53:14 1999
+++ linux/fs/umsdos/inode.c	Wed Dec  1 06:40:21 1999
@@ -94,6 +94,11 @@
 		printk(KERN_ERR "umsdos_setup_dir: %s/%s not a dir!\n",
 			dir->d_parent->d_name.name, dir->d_name.name);
 
+	init_waitqueue_head (&inode->u.umsdos_i.dir_info.p);
+	inode->u.umsdos_i.dir_info.looking = 0;
+	inode->u.umsdos_i.dir_info.creating = 0;
+	inode->u.umsdos_i.dir_info.pid = 0;
+
 	inode->i_op = &umsdos_rdir_inode_operations;
 	if (umsdos_have_emd(dir)) {
 Printk((KERN_DEBUG "umsdos_setup_dir: %s/%s using EMD\n",
@@ -311,7 +316,7 @@
 	NULL,			/* write_super */
 	fat_statfs,		/* statfs */
 	NULL,			/* remount_fs */
-	fat_clear_inode,	/* clear_inode */
+	fat_clear_inode		/* clear_inode */
 };
 
 /*
@@ -333,7 +338,7 @@
 	if (!res)
 		goto out_fail;
 
-	printk (KERN_INFO "UMSDOS 0.85 "
+	printk (KERN_INFO "UMSDOS 0.86 "
 		"(compatibility level %d.%d, fast msdos)\n", 
 		UMSDOS_VERSION, UMSDOS_RELEASE);
 
diff -ur linux-2.3.31.orig/fs/umsdos/ioctl.c linux/fs/umsdos/ioctl.c
--- linux-2.3.31.orig/fs/umsdos/ioctl.c	Sat Sep 26 01:30:07 1998
+++ linux/fs/umsdos/ioctl.c	Wed Dec  1 06:26:46 1999
@@ -217,14 +217,11 @@
 		 * 
 		 * Return 0 if success.
 		 */
-		extern struct inode_operations umsdos_rdir_inode_operations;
 
 		ret = umsdos_make_emd(dentry);
 Printk(("UMSDOS_ioctl_dir: INIT_EMD %s/%s, ret=%d\n",
 dentry->d_parent->d_name.name, dentry->d_name.name, ret));
-		dir->i_op = (ret == 0)
-		    ? &umsdos_dir_inode_operations
-		    : &umsdos_rdir_inode_operations;
+		umsdos_setup_dir (dentry);
 		goto out;
 	}
 
@@ -280,6 +277,8 @@
 old_dentry->d_parent->d_name.name, old_dentry->d_name.name,
 new_dentry->d_parent->d_name.name, new_dentry->d_name.name);
 			ret = msdos_rename (dir, old_dentry, dir, new_dentry);
+			d_drop(new_dentry);
+			d_drop(old_dentry);
 			dput(new_dentry);
 		}
 		dput(old_dentry);
diff -ur linux-2.3.31.orig/fs/umsdos/namei.c linux/fs/umsdos/namei.c
--- linux-2.3.31.orig/fs/umsdos/namei.c	Fri Jun 25 11:22:28 1999
+++ linux/fs/umsdos/namei.c	Wed Dec  1 06:40:24 1999
@@ -22,7 +22,20 @@
 #include <linux/umsdos_fs.h>
 #include <linux/malloc.h>
 
-#if 1
+#define UMSDOS_DIR_LOCK
+
+#ifdef UMSDOS_DIR_LOCK
+
+static inline void u_sleep_on (struct inode *dir)
+{
+	sleep_on (&dir->u.umsdos_i.dir_info.p);
+}
+
+static inline void u_wake_up (struct inode *dir)
+{
+    	wake_up (&dir->u.umsdos_i.dir_info.p);
+}
+
 /*
  * Wait for creation exclusivity.
  * Return 0 if the dir was already available.
@@ -34,9 +47,10 @@
 {
 	int ret = 0;
 
-	if (dir->u.umsdos_i.u.dir_info.creating
-	    && dir->u.umsdos_i.u.dir_info.pid != current->pid) {
-		sleep_on (&dir->u.umsdos_i.u.dir_info.p);
+	if (dir->u.umsdos_i.dir_info.creating
+	    && dir->u.umsdos_i.dir_info.pid != current->pid) {
+	    	PRINTK (("creating && dir_info.pid=%lu, current->pid=%u\n", dir->u.umsdos_i.dir_info.pid, current->pid));
+	    	u_sleep_on (dir);
 		ret = 1;
 	}
 	return ret;
@@ -47,8 +61,8 @@
  */
 static void umsdos_waitlookup (struct inode *dir)
 {
-	while (dir->u.umsdos_i.u.dir_info.looking) {
-		sleep_on (&dir->u.umsdos_i.u.dir_info.p);
+	while (dir->u.umsdos_i.dir_info.looking) {
+	    	u_sleep_on (dir);
 	}
 }
 
@@ -90,8 +104,8 @@
 	 * if we (the process) own the lock
 	 */
 	while (umsdos_waitcreate (dir) != 0);
-	dir->u.umsdos_i.u.dir_info.creating++;
-	dir->u.umsdos_i.u.dir_info.pid = current->pid;
+	dir->u.umsdos_i.dir_info.creating++;
+	dir->u.umsdos_i.dir_info.pid = current->pid;
 	umsdos_waitlookup (dir);
 }
 
@@ -110,10 +124,10 @@
 		if (umsdos_waitcreate (dir1) == 0
 		    && umsdos_waitcreate (dir2) == 0) {
 			/* We own both now */
-			dir1->u.umsdos_i.u.dir_info.creating++;
-			dir1->u.umsdos_i.u.dir_info.pid = current->pid;
-			dir2->u.umsdos_i.u.dir_info.creating++;
-			dir2->u.umsdos_i.u.dir_info.pid = current->pid;
+			dir1->u.umsdos_i.dir_info.creating++;
+			dir1->u.umsdos_i.dir_info.pid = current->pid;
+			dir2->u.umsdos_i.dir_info.creating++;
+			dir2->u.umsdos_i.dir_info.pid = current->pid;
 			break;
 		}
 	}
@@ -127,7 +141,7 @@
 void umsdos_startlookup (struct inode *dir)
 {
 	while (umsdos_waitcreate (dir) != 0);
-	dir->u.umsdos_i.u.dir_info.looking++;
+	dir->u.umsdos_i.dir_info.looking++;
 }
 
 /*
@@ -135,12 +149,12 @@
  */
 void umsdos_unlockcreate (struct inode *dir)
 {
-	dir->u.umsdos_i.u.dir_info.creating--;
-	if (dir->u.umsdos_i.u.dir_info.creating < 0) {
-		printk ("UMSDOS: dir->u.umsdos_i.u.dir_info.creating < 0: %d"
-			,dir->u.umsdos_i.u.dir_info.creating);
+	dir->u.umsdos_i.dir_info.creating--;
+	if (dir->u.umsdos_i.dir_info.creating < 0) {
+		printk ("UMSDOS: dir->u.umsdos_i.dir_info.creating < 0: %d"
+			,dir->u.umsdos_i.dir_info.creating);
 	}
-	wake_up (&dir->u.umsdos_i.u.dir_info.p);
+    	u_wake_up (dir);
 }
 
 /*
@@ -148,12 +162,12 @@
  */
 void umsdos_endlookup (struct inode *dir)
 {
-	dir->u.umsdos_i.u.dir_info.looking--;
-	if (dir->u.umsdos_i.u.dir_info.looking < 0) {
-		printk ("UMSDOS: dir->u.umsdos_i.u.dir_info.looking < 0: %d"
-			,dir->u.umsdos_i.u.dir_info.looking);
+	dir->u.umsdos_i.dir_info.looking--;
+	if (dir->u.umsdos_i.dir_info.looking < 0) {
+		printk ("UMSDOS: dir->u.umsdos_i.dir_info.looking < 0: %d"
+			,dir->u.umsdos_i.dir_info.looking);
 	}
-	wake_up (&dir->u.umsdos_i.u.dir_info.p);
+    	u_wake_up (dir);
 }
 
 #else
diff -ur linux-2.3.31.orig/fs/umsdos/rdir.c linux/fs/umsdos/rdir.c
--- linux-2.3.31.orig/fs/umsdos/rdir.c	Thu Dec  9 04:53:58 1999
+++ linux/fs/umsdos/rdir.c	Thu Dec  9 04:55:33 1999
@@ -252,5 +252,5 @@
 	NULL,			/* get_block */
 	NULL,			/* truncate */
 	NULL,			/* permission */
-	NULL,			/* revalidate */
+	NULL			/* revalidate */
 };
diff -ur linux-2.3.31.orig/include/linux/umsdos_fs.h linux/include/linux/umsdos_fs.h
--- linux-2.3.31.orig/include/linux/umsdos_fs.h	Wed Dec  1 06:51:56 1999
+++ linux/include/linux/umsdos_fs.h	Thu Dec  9 05:04:54 1999
@@ -2,7 +2,7 @@
 #define LINUX_UMSDOS_FS_H
 
 
-#define UMS_DEBUG 1	/* define for check_* functions */
+/*#define UMS_DEBUG 1	// define for check_* functions */
 /*#define UMSDOS_DEBUG 1*/
 #define UMSDOS_PARANOIA 1
 
diff -ur linux-2.3.31.orig/include/linux/umsdos_fs_i.h linux/include/linux/umsdos_fs_i.h
--- linux-2.3.31.orig/include/linux/umsdos_fs_i.h	Fri Jun 25 11:24:05 1999
+++ linux/include/linux/umsdos_fs_i.h	Wed Dec  1 06:21:48 1999
@@ -47,15 +47,13 @@
 				 *  Only one at a time, although one
 				 *  may recursively lock, so it is a counter
 				 */
-	long pid;		/* pid of the process owning the creation */
-	/* lock */
+	long pid;		/* pid of the process owning the creation
+				 * lock */
 };
 
 struct umsdos_inode_info {
-	union {
-		struct msdos_inode_info msdos_info;
-		struct dir_locking_info dir_info;
-	} u;
+	struct msdos_inode_info msdos_info;
+	struct dir_locking_info dir_info;
 	int i_patched;			/* Inode has been patched */
 	int i_is_hlink;			/* Resolved hardlink inode? */
 	unsigned long i_emd_owner;	/* Is this the EMD file inode? */

