knfsd: exportfs: remove iget abuse

When the exportfs interface was added the expectation was that filesystems
provide an operation to convert from a file handle to an inode/dentry, but it
kept a backwards compat option that still calls into iget.

Calling into iget from non-filesystem code is very bad, because it gives too
little information to filesystem, and simply crashes if the filesystem doesn't
implement the ->read_inode routine.

Fortunately there are only two filesystems left using this fallback: efs and
jfs.  This patch moves a copy of export_iget to each of those to implement the
get_dentry method.

While this is a temporary increase of lines of code in the kernel it allows
for a much cleaner interface and important code restructuring in later
patches.

[[email protected]: add jfs_get_inode_flags() declaration]
Signed-off-by: Dave Kleikamp <[email protected]>
Signed-off-by: Christoph Hellwig <[email protected]>
Signed-off-by: Neil Brown <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
Christoph Hellwig 2007-07-17 04:04:29 -07:00 • committed by Linus Torvalds
commit 5ca2960733
7 changed files with 71 additions and 53 deletions

View file

@ -75,6 +75,38 @@ struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, struct namei
return NULL;
}
struct dentry *efs_get_dentry(struct super_block *sb, void *vobjp)
{
__u32 *objp = vobjp;
unsigned long ino = objp[0];
__u32 generation = objp[1];
struct inode *inode;
struct dentry *result;
if (ino == 0)
return ERR_PTR(-ESTALE);
inode = iget(sb, ino);
if (inode == NULL)
return ERR_PTR(-ENOMEM);
if (is_bad_inode(inode) ||
(generation && inode->i_generation != generation)) {
result = ERR_PTR(-ESTALE);
goto out_iput;
}
result = d_alloc_anon(inode);
if (!result) {
result = ERR_PTR(-ENOMEM);
goto out_iput;
}
return result;
out_iput:
iput(inode);
return result;
}
struct dentry *efs_get_parent(struct dentry *child)
{
struct dentry *parent;

View file

@ -114,6 +114,7 @@ static const struct super_operations efs_superblock_operations = {
};
static struct export_operations efs_export_ops = {
.get_dentry = efs_get_dentry,
.get_parent = efs_get_parent,
};