--- 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 */ _