[PATCH] ufs: little directory lookup optimization
authorEvgeniy Dushistov <dushistov@mail.ru>
Sun, 25 Jun 2006 12:47:25 +0000 (05:47 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 25 Jun 2006 17:01:03 +0000 (10:01 -0700)
This patch make little optimization of ufs_find_entry like "ext2" does.  Save
number of page and reuse it again in the next call.

Signed-off-by: Evgeniy Dushistov <dushistov@mail.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/ufs/dir.c
fs/ufs/ialloc.c
fs/ufs/inode.c
include/linux/ufs_fs_i.h

index 732c3fd2b6f24ea6b57b1177391fecc3e8120005..7f0a0aa63584e729d53d01177ed74a0372ea830a 100644 (file)
@@ -252,6 +252,7 @@ struct ufs_dir_entry *ufs_find_entry(struct inode *dir, struct dentry *dentry,
        unsigned long start, n;
        unsigned long npages = ufs_dir_pages(dir);
        struct page *page = NULL;
+       struct ufs_inode_info *ui = UFS_I(dir);
        struct ufs_dir_entry *de;
 
        UFSD("ENTER, dir_ino %lu, name %s, namlen %u\n", dir->i_ino, name, namelen);
@@ -262,8 +263,8 @@ struct ufs_dir_entry *ufs_find_entry(struct inode *dir, struct dentry *dentry,
        /* OFFSET_CACHE */
        *res_page = NULL;
 
-       /* start = ei->i_dir_start_lookup; */
-       start = 0;
+       start = ui->i_dir_start_lookup;
+
        if (start >= npages)
                start = 0;
        n = start;
@@ -295,7 +296,7 @@ out:
 
 found:
        *res_page = page;
-       /* ei->i_dir_start_lookup = n; */
+       ui->i_dir_start_lookup = n;
        return de;
 }
 
index ad017fa2dd216f094c50044a552b4e0d087f03c8..c684aaad99987d3fafadb5293cc76cd526ffb5fd 100644 (file)
@@ -264,6 +264,7 @@ cg_found:
        ufsi->i_shadow = 0;
        ufsi->i_osync = 0;
        ufsi->i_oeftflag = 0;
+       ufsi->i_dir_start_lookup = 0;
        memset(&ufsi->i_u1, 0, sizeof(ufsi->i_u1));
 
        insert_inode_hash(inode);
index 01f75446234163dffca05591c7a3f2aca35554b2..c57612d443d058e840df3112fd721af8954b745a 100644 (file)
@@ -628,12 +628,12 @@ void ufs_read_inode (struct inode * inode)
        ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow);
        ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag);
        ufsi->i_lastfrag = (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift;
+       ufsi->i_dir_start_lookup = 0;
        
        if (S_ISCHR(mode) || S_ISBLK(mode) || inode->i_blocks) {
                for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++)
                        ufsi->i_u1.i_data[i] = ufs_inode->ui_u2.ui_addr.ui_db[i];
-       }
-       else {
+       } else {
                for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++)
                        ufsi->i_u1.i_symlink[i] = ufs_inode->ui_u2.ui_symlink[i];
        }
index 21665a9539783726556a4435e94fe86a5b533fa8..f50ce3b0cd524ed41454f8345cb2fffc4ee7b443 100644 (file)
@@ -27,6 +27,7 @@ struct ufs_inode_info {
        __u32   i_oeftflag;
        __u16   i_osync;
        __u32   i_lastfrag;
+       __u32   i_dir_start_lookup;
        struct inode vfs_inode;
 };