---

 fs/hpfs/buffer.c           |   18 -----------
 fs/hpfs/dir.c              |   10 +++---
 fs/hpfs/hpfs_fn.h          |    3 -
 fs/hpfs/inode.c            |   70 ++++++++++++++++++++++++++++++---------------
 fs/hpfs/namei.c            |   14 +--------
 fs/hpfs/super.c            |    9 -----
 include/linux/hpfs_fs_sb.h |    5 ---
 7 files changed, 58 insertions(+), 71 deletions(-)

diff -puN fs/hpfs/buffer.c~HPFS4-hpfs_lock_iget-RC4-rc1 fs/hpfs/buffer.c
--- 25/fs/hpfs/buffer.c~HPFS4-hpfs_lock_iget-RC4-rc1	2004-02-29 12:49:38.000000000 -0800
+++ 25-akpm/fs/hpfs/buffer.c	2004-02-29 12:53:12.000000000 -0800
@@ -26,24 +26,6 @@ void hpfs_unlock_creation(struct super_b
 	up(&hpfs_sb(s)->hpfs_creation_de);
 }
 
-void hpfs_lock_iget(struct super_block *s, int mode)
-{
-#ifdef DEBUG_LOCKS
-	printk("lock iget\n");
-#endif
-	while (hpfs_sb(s)->sb_rd_inode) sleep_on(&hpfs_sb(s)->sb_iget_q);
-	hpfs_sb(s)->sb_rd_inode = mode;
-}
-
-void hpfs_unlock_iget(struct super_block *s)
-{
-#ifdef DEBUG_LOCKS
-	printk("unlock iget\n");
-#endif
-	hpfs_sb(s)->sb_rd_inode = 0;
-	wake_up(&hpfs_sb(s)->sb_iget_q);
-}
-
 void hpfs_lock_inode(struct inode *i)
 {
 	if (i) {
diff -puN fs/hpfs/dir.c~HPFS4-hpfs_lock_iget-RC4-rc1 fs/hpfs/dir.c
--- 25/fs/hpfs/dir.c~HPFS4-hpfs_lock_iget-RC4-rc1	2004-02-29 12:49:38.000000000 -0800
+++ 25-akpm/fs/hpfs/dir.c	2004-02-29 12:53:12.000000000 -0800
@@ -243,20 +243,22 @@ struct dentry *hpfs_lookup(struct inode 
 	 * Go find or make an inode.
 	 */
 
-	hpfs_lock_iget(dir->i_sb, de->directory || (de->ea_size && hpfs_sb(dir->i_sb)->sb_eas) ? 1 : 2);
 	result = iget_locked(dir->i_sb, ino);
 	if (!result) {
-		hpfs_unlock_iget(dir->i_sb);
 		hpfs_error(dir->i_sb, "hpfs_lookup: can't get inode");
 		goto bail1;
 	}
 	if (result->i_state & I_NEW) {
-		hpfs_read_inode(result);
+		if (de->directory)
+			hpfs_read_inode(result);
+		else if (de->ea_size && hpfs_sb(dir->i_sb)->sb_eas)
+			hpfs_read_inode(result);
+		else
+			hpfs_read_inode_light(result);
 		unlock_new_inode(result);
 	}
 	hpfs_result = hpfs_i(result);
 	if (!de->directory) hpfs_result->i_parent_dir = dir->i_ino;
-	hpfs_unlock_iget(dir->i_sb);
 
 	hpfs_decide_conv(result, (char *)name, len);
 
diff -puN fs/hpfs/hpfs_fn.h~HPFS4-hpfs_lock_iget-RC4-rc1 fs/hpfs/hpfs_fn.h
--- 25/fs/hpfs/hpfs_fn.h~HPFS4-hpfs_lock_iget-RC4-rc1	2004-02-29 12:49:38.000000000 -0800
+++ 25-akpm/fs/hpfs/hpfs_fn.h	2004-02-29 12:53:12.000000000 -0800
@@ -192,8 +192,6 @@ void hpfs_remove_fnode(struct super_bloc
 
 void hpfs_lock_creation(struct super_block *);
 void hpfs_unlock_creation(struct super_block *);
-void hpfs_lock_iget(struct super_block *, int);
-void hpfs_unlock_iget(struct super_block *);
 void hpfs_lock_inode(struct inode *);
 void hpfs_unlock_inode(struct inode *);
 void *hpfs_map_sector(struct super_block *, unsigned, struct buffer_head **, int);
@@ -250,6 +248,7 @@ ssize_t hpfs_file_write(struct file *fil
 /* inode.c */
 
 void hpfs_read_inode(struct inode *);
+void hpfs_read_inode_light(struct inode *);
 void hpfs_write_inode_ea(struct inode *, struct fnode *);
 void hpfs_write_inode(struct inode *);
 void hpfs_write_inode_nolock(struct inode *);
diff -puN fs/hpfs/inode.c~HPFS4-hpfs_lock_iget-RC4-rc1 fs/hpfs/inode.c
--- 25/fs/hpfs/inode.c~HPFS4-hpfs_lock_iget-RC4-rc1	2004-02-29 12:49:38.000000000 -0800
+++ 25-akpm/fs/hpfs/inode.c	2004-02-29 12:53:12.000000000 -0800
@@ -57,6 +57,44 @@ struct address_space_operations hpfs_sym
 	.readpage	= hpfs_symlink_readpage
 };
 
+void hpfs_read_inode_light(struct inode *i)
+{
+	struct super_block *sb = i->i_sb;
+	struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
+
+	i->i_uid = hpfs_sb(sb)->sb_uid;
+	i->i_gid = hpfs_sb(sb)->sb_gid;
+	i->i_mode = hpfs_sb(sb)->sb_mode;
+	hpfs_inode->i_conv = hpfs_sb(sb)->sb_conv;
+	i->i_blksize = 512;
+	i->i_size = -1;
+	i->i_blocks = -1;
+
+	hpfs_inode->i_dno = 0;
+	hpfs_inode->i_n_secs = 0;
+	hpfs_inode->i_file_sec = 0;
+	hpfs_inode->i_disk_sec = 0;
+	hpfs_inode->i_dpos = 0;
+	hpfs_inode->i_dsubdno = 0;
+	hpfs_inode->i_ea_mode = 0;
+	hpfs_inode->i_ea_uid = 0;
+	hpfs_inode->i_ea_gid = 0;
+	hpfs_inode->i_ea_size = 0;
+
+	hpfs_inode->i_rddir_off = NULL;
+	hpfs_inode->i_dirty = 0;
+
+	i->i_ctime.tv_sec = i->i_ctime.tv_nsec = 0;
+	i->i_mtime.tv_sec = i->i_mtime.tv_nsec = 0;
+	i->i_atime.tv_sec = i->i_atime.tv_nsec = 0;
+
+	i->i_mode |= S_IFREG;
+	i->i_mode &= ~0111;
+	i->i_op = &hpfs_file_iops;
+	i->i_fop = &hpfs_file_ops;
+	i->i_nlink = 1;
+}
+
 void hpfs_read_inode(struct inode *i)
 {
 	struct buffer_head *bh;
@@ -92,16 +130,6 @@ void hpfs_read_inode(struct inode *i)
 	i->i_mtime.tv_sec = i->i_mtime.tv_nsec = 0;
 	i->i_atime.tv_sec = i->i_atime.tv_nsec = 0;
 
-	if (!hpfs_sb(i->i_sb)->sb_rd_inode)
-		hpfs_error(i->i_sb, "read_inode: sb_rd_inode == 0");
-	if (hpfs_sb(i->i_sb)->sb_rd_inode == 2) {
-		i->i_mode |= S_IFREG;
-		i->i_mode &= ~0111;
-		i->i_op = &hpfs_file_iops;
-		i->i_fop = &hpfs_file_ops;
-		i->i_nlink = 1;
-		return;
-	}
 	if (!(fnode = hpfs_map_fnode(sb, i->i_ino, &bh))) {
 		/*i->i_mode |= S_IFREG;
 		i->i_mode &= ~0111;
@@ -241,21 +269,17 @@ void hpfs_write_inode(struct inode *i)
 		hpfs_inode->i_rddir_off = NULL;
 	}
 	hpfs_inode->i_dirty = 0;
-	hpfs_lock_iget(i->i_sb, 1);
 	parent = iget_locked(i->i_sb, hpfs_inode->i_parent_dir);
-	if (!parent) {
-		hpfs_unlock_iget(i->i_sb);
-		return;
-	}
-	if (parent->i_state & I_NEW) {
-		hpfs_read_inode(parent);
-		unlock_new_inode(parent);
+	if (parent) {
+		if (parent->i_state & I_NEW) {
+			hpfs_read_inode(parent);
+			unlock_new_inode(parent);
+		}
+		hpfs_lock_inode(parent);
+		hpfs_write_inode_nolock(i);
+		hpfs_unlock_inode(parent);
+		iput(parent);
 	}
-	hpfs_unlock_iget(i->i_sb);
-	hpfs_lock_inode(parent);
-	hpfs_write_inode_nolock(i);
-	hpfs_unlock_inode(parent);
-	iput(parent);
 }
 
 void hpfs_write_inode_nolock(struct inode *i)
diff -puN fs/hpfs/namei.c~HPFS4-hpfs_lock_iget-RC4-rc1 fs/hpfs/namei.c
--- 25/fs/hpfs/namei.c~HPFS4-hpfs_lock_iget-RC4-rc1	2004-02-29 12:49:38.000000000 -0800
+++ 25-akpm/fs/hpfs/namei.c	2004-02-29 12:53:12.000000000 -0800
@@ -72,7 +72,6 @@ int hpfs_mkdir(struct inode *dir, struct
 	hpfs_mark_4buffers_dirty(&qbh0);
 	hpfs_brelse4(&qbh0);
 	dir->i_nlink++;
-	hpfs_lock_iget(dir->i_sb, 1);
 
 	result = iget_locked(dir->i_sb, fno);
 	if (!result)
@@ -99,7 +98,6 @@ int hpfs_mkdir(struct inode *dir, struct
 	d_instantiate(dentry, result);
 
 out:
-	hpfs_unlock_iget(dir->i_sb);
 	hpfs_unlock_inode(dir);
 	unlock_kernel();
 	return 0;
@@ -152,13 +150,12 @@ int hpfs_create(struct inode *dir, struc
 	fnode->up = dir->i_ino;
 	mark_buffer_dirty(bh);
 	brelse(bh);
-	hpfs_lock_iget(dir->i_sb, 2);
 
 	result = iget_locked(dir->i_sb, fno);
 	if (!result)
 		goto out;
 
-	hpfs_read_inode(result);
+	hpfs_read_inode_light(result);
 	unlock_new_inode(result);
 
 	hpfs_decide_conv(result, (char *)name, len);
@@ -185,7 +182,6 @@ int hpfs_create(struct inode *dir, struc
 	}
 	d_instantiate(dentry, result);
 out:
-	hpfs_unlock_iget(dir->i_sb);
 	hpfs_unlock_inode(dir);
 	unlock_kernel();
 	return 0;
@@ -236,13 +232,12 @@ int hpfs_mknod(struct inode *dir, struct
 	memcpy(fnode->name, name, len > 15 ? 15 : len);
 	fnode->up = dir->i_ino;
 	mark_buffer_dirty(bh);
-	hpfs_lock_iget(dir->i_sb, 2);
 
 	result = iget_locked(dir->i_sb, fno);
 	if (!result)
 		goto out;
 
-	hpfs_read_inode(result);
+	hpfs_read_inode_light(result);
 	unlock_new_inode(result);
 
 	hpfs_i(result)->i_parent_dir = dir->i_ino;
@@ -263,7 +258,6 @@ int hpfs_mknod(struct inode *dir, struct
 	d_instantiate(dentry, result);
 
 out:
-	hpfs_unlock_iget(dir->i_sb);
 	hpfs_unlock_inode(dir);
 	brelse(bh);
 	unlock_kernel();
@@ -318,13 +312,12 @@ int hpfs_symlink(struct inode *dir, stru
 	fnode->up = dir->i_ino;
 	mark_buffer_dirty(bh);
 	brelse(bh);
-	hpfs_lock_iget(dir->i_sb, 2);
 
 	result = iget_locked(dir->i_sb, fno);
 	if (!result)
 		goto out;
 
-	hpfs_read_inode(result);
+	hpfs_read_inode_light(result);
 	unlock_new_inode(result);
 
 	hpfs_i(result)->i_parent_dir = dir->i_ino;
@@ -351,7 +344,6 @@ int hpfs_symlink(struct inode *dir, stru
 	d_instantiate(dentry, result);
 
 out:
-	hpfs_unlock_iget(dir->i_sb);
 	hpfs_unlock_inode(dir);
 	unlock_kernel();
 	return 0;
diff -puN fs/hpfs/super.c~HPFS4-hpfs_lock_iget-RC4-rc1 fs/hpfs/super.c
--- 25/fs/hpfs/super.c~HPFS4-hpfs_lock_iget-RC4-rc1	2004-02-29 12:49:38.000000000 -0800
+++ 25-akpm/fs/hpfs/super.c	2004-02-29 12:53:12.000000000 -0800
@@ -211,7 +211,6 @@ static struct super_operations hpfs_sops
 {
 	.alloc_inode	= hpfs_alloc_inode,
 	.destroy_inode	= hpfs_destroy_inode,
-        .read_inode	= hpfs_read_inode,
 	.delete_inode	= hpfs_delete_inode,
 	.put_super	= hpfs_put_super,
 	.statfs		= hpfs_statfs,
@@ -470,9 +469,7 @@ static int hpfs_fill_super(struct super_
 	sbi->sb_bmp_dir = NULL;
 	sbi->sb_cp_table = NULL;
 
-	sbi->sb_rd_inode = 0;
 	init_MUTEX(&sbi->hpfs_creation_de);
-	init_waitqueue_head(&sbi->sb_iget_q);
 
 	uid = current->uid;
 	gid = current->gid;
@@ -613,15 +610,11 @@ static int hpfs_fill_super(struct super_
 	brelse(bh1);
 	brelse(bh0);
 
-	hpfs_lock_iget(s, 1);
 	root = iget_locked(s, sbi->sb_root);
-	if (!root) {
-		hpfs_unlock_iget(s);
+	if (!root)
 		goto bail0;
-	}
 	hpfs_read_inode(root);
 	unlock_new_inode(root);
-	hpfs_unlock_iget(s);
 	s->s_root = d_alloc_root(root);
 	if (!s->s_root) {
 		iput(root);
diff -puN include/linux/hpfs_fs_sb.h~HPFS4-hpfs_lock_iget-RC4-rc1 include/linux/hpfs_fs_sb.h
--- 25/include/linux/hpfs_fs_sb.h~HPFS4-hpfs_lock_iget-RC4-rc1	2004-02-29 12:49:38.000000000 -0800
+++ 25-akpm/include/linux/hpfs_fs_sb.h	2004-02-29 12:53:06.000000000 -0800
@@ -20,11 +20,6 @@ struct hpfs_sb_info {
 	unsigned sb_lowercase : 1;	/* downcase filenames hackery */
 	unsigned sb_was_error : 1;	/* there was an error, set dirty flag */
 	unsigned sb_chkdsk : 2;		/* chkdsk: 0-no, 1-on errs, 2-allways */
-	unsigned sb_rd_fnode : 2;	/* read fnode 0-no 1-dirs 2-all */
-	unsigned sb_rd_inode : 2;	/* lookup tells read_inode: 1-read fnode
-					   2-don't read fnode, file
-					   3-don't read fnode, direcotry */
-	wait_queue_head_t sb_iget_q;
 	unsigned char *sb_cp_table;	/* code page tables: */
 					/* 	128 bytes uppercasing table & */
 					/*	128 bytes lowercasing table */

_