fs/ext3/namei.c | 29 +++++++++++++++++++++++++++++ include/linux/fs.h | 1 + 2 files changed, 30 insertions(+) Index: lum/include/linux/fs.h =================================================================== --- lum.orig/include/linux/fs.h 2004-06-07 17:25:40.000000000 -0400 +++ lum/include/linux/fs.h 2004-06-07 17:26:11.000000000 -0400 @@ -904,6 +904,7 @@ int (*create) (struct inode *,struct dentry *,int); int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); + int (*lookup_raw) (struct inode *, const char *, int, ino_t *); struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); int (*link_raw) (struct nameidata *,struct nameidata *); Index: lum/fs/ext3/namei.c =================================================================== --- lum.orig/fs/ext3/namei.c 2004-06-07 17:25:39.000000000 -0400 +++ lum/fs/ext3/namei.c 2004-06-07 17:25:47.000000000 -0400 @@ -1128,6 +1128,34 @@ return iopen_connect_dentry(dentry, inode, 1); } +static int ext3_lookup_raw(struct inode *dir, const char *name, + int len, ino_t *data) +{ + struct ext3_dir_entry_2 *de; + struct buffer_head *bh; + struct dentry parent; + struct dentry dentry; + + if (len > EXT3_NAME_LEN) + return -ENAMETOOLONG; + + parent.d_inode = dir; + dentry.d_parent = &parent; + dentry.d_name.name = name; + dentry.d_name.len = len; + + bh = ext3_find_entry(&dentry, &de); + if (bh) { + unsigned long ino = le32_to_cpu(de->inode); + brelse (bh); + if (data) + *data = ino; + return 0; /* found name */ + } + + return -ENOENT; +} + #define S_SHIFT 12 static unsigned char ext3_type_by_mode[S_IFMT >> S_SHIFT] = { [S_IFREG >> S_SHIFT] EXT3_FT_REG_FILE, @@ -2772,6 +2800,7 @@ struct inode_operations ext3_dir_inode_operations = { create: ext3_create, /* BKL held */ lookup: ext3_lookup, /* BKL held */ + lookup_raw: ext3_lookup_raw, /* BKL held */ link: ext3_link, /* BKL held */ unlink: ext3_unlink, /* BKL held */ symlink: ext3_symlink, /* BKL held */