Patch from Maneesh Soni The following patch should enable smalldevfs to work with dcache_rcu. The locking problem is because smalldevfs is written keeping fastwalk in mind where as dcache_rcu backs out fastwalk code to 2.5.10 level. devfs/base.c | 13 +++++-------- 1 files changed, 5 insertions(+), 8 deletions(-) diff -puN fs/devfs/base.c~smalldevfs-dcache_rcu-fix fs/devfs/base.c --- 25/fs/devfs/base.c~smalldevfs-dcache_rcu-fix 2003-02-23 22:39:16.000000000 -0800 +++ 25-akpm/fs/devfs/base.c 2003-02-23 22:39:17.000000000 -0800 @@ -60,8 +60,7 @@ static int walk_parents_mkdir(const char memcpy(buf, *path, len); buf[len] = '\0'; - spin_lock(&dcache_lock); - err = link_path_walk(buf, nd); /* releases dcache_lock */ + err = link_path_walk(buf, nd); if (err) return err; @@ -101,14 +100,13 @@ static int devfs_decode(devfs_handle_t d memset(&nd, 0, sizeof(nd)); nd.flags = LOOKUP_PARENT; - nd.mnt = devfs_vfsmount; - nd.dentry = dir; + nd.mnt = mntget(devfs_vfsmount); + nd.dentry = dget(dir); err = walk_parents_mkdir(&name, &nd, is_dir); if (err) return err; - spin_lock(&dcache_lock); err = link_path_walk(name, &nd); if (err) return err; @@ -247,10 +245,9 @@ void devfs_remove(const char *fmt, ...) buf[sizeof(buf)-1] = '\0'; memset(&nd, 0, sizeof(nd)); - nd.mnt = devfs_vfsmount; - nd.dentry = devfs_vfsmount->mnt_sb->s_root; + nd.mnt = mntget(devfs_vfsmount); + nd.dentry = dget(devfs_vfsmount->mnt_sb->s_root); - spin_lock(&dcache_lock); err = link_path_walk(buf, &nd); if (!err) { devfs_unregister(nd.dentry); _