Commit 62328a02 authored by David Howells's avatar David Howells Committed by Linus Torvalds

iget: stop autofs from using iget() and read_inode()

Stop the autofs filesystem from using iget() and read_inode().  Replace
autofs_read_inode() with autofs_iget(), and call that instead of iget().
autofs_iget() then uses iget_locked() directly and returns a proper error code
instead of an inode in the event of an error.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Cc: Ian Kent <raven@themaw.net>
Acked-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 210f8559
...@@ -150,6 +150,7 @@ extern const struct file_operations autofs_root_operations; ...@@ -150,6 +150,7 @@ extern const struct file_operations autofs_root_operations;
int autofs_fill_super(struct super_block *, void *, int); int autofs_fill_super(struct super_block *, void *, int);
void autofs_kill_sb(struct super_block *sb); void autofs_kill_sb(struct super_block *sb);
struct inode *autofs_iget(struct super_block *, unsigned long);
/* Queue management functions */ /* Queue management functions */
......
...@@ -52,10 +52,7 @@ void autofs_kill_sb(struct super_block *sb) ...@@ -52,10 +52,7 @@ void autofs_kill_sb(struct super_block *sb)
kill_anon_super(sb); kill_anon_super(sb);
} }
static void autofs_read_inode(struct inode *inode);
static const struct super_operations autofs_sops = { static const struct super_operations autofs_sops = {
.read_inode = autofs_read_inode,
.statfs = simple_statfs, .statfs = simple_statfs,
}; };
...@@ -164,7 +161,9 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -164,7 +161,9 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
s->s_time_gran = 1; s->s_time_gran = 1;
sbi->sb = s; sbi->sb = s;
root_inode = iget(s, AUTOFS_ROOT_INO); root_inode = autofs_iget(s, AUTOFS_ROOT_INO);
if (IS_ERR(root_inode))
goto fail_free;
root = d_alloc_root(root_inode); root = d_alloc_root(root_inode);
pipe = NULL; pipe = NULL;
...@@ -230,11 +229,17 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -230,11 +229,17 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
return -EINVAL; return -EINVAL;
} }
static void autofs_read_inode(struct inode *inode) struct inode *autofs_iget(struct super_block *sb, unsigned long ino)
{ {
ino_t ino = inode->i_ino;
unsigned int n; unsigned int n;
struct autofs_sb_info *sbi = autofs_sbi(inode->i_sb); struct autofs_sb_info *sbi = autofs_sbi(sb);
struct inode *inode;
inode = iget_locked(sb, ino);
if (!inode)
return ERR_PTR(-ENOMEM);
if (!(inode->i_state & I_NEW))
return inode;
/* Initialize to the default case (stub directory) */ /* Initialize to the default case (stub directory) */
...@@ -250,7 +255,7 @@ static void autofs_read_inode(struct inode *inode) ...@@ -250,7 +255,7 @@ static void autofs_read_inode(struct inode *inode)
inode->i_op = &autofs_root_inode_operations; inode->i_op = &autofs_root_inode_operations;
inode->i_fop = &autofs_root_operations; inode->i_fop = &autofs_root_operations;
inode->i_uid = inode->i_gid = 0; /* Changed in read_super */ inode->i_uid = inode->i_gid = 0; /* Changed in read_super */
return; goto done;
} }
inode->i_uid = inode->i_sb->s_root->d_inode->i_uid; inode->i_uid = inode->i_sb->s_root->d_inode->i_uid;
...@@ -263,7 +268,7 @@ static void autofs_read_inode(struct inode *inode) ...@@ -263,7 +268,7 @@ static void autofs_read_inode(struct inode *inode)
n = ino - AUTOFS_FIRST_SYMLINK; n = ino - AUTOFS_FIRST_SYMLINK;
if (n >= AUTOFS_MAX_SYMLINKS || !test_bit(n,sbi->symlink_bitmap)) { if (n >= AUTOFS_MAX_SYMLINKS || !test_bit(n,sbi->symlink_bitmap)) {
printk("autofs: Looking for bad symlink inode %u\n", (unsigned int) ino); printk("autofs: Looking for bad symlink inode %u\n", (unsigned int) ino);
return; goto done;
} }
inode->i_op = &autofs_symlink_inode_operations; inode->i_op = &autofs_symlink_inode_operations;
...@@ -275,4 +280,8 @@ static void autofs_read_inode(struct inode *inode) ...@@ -275,4 +280,8 @@ static void autofs_read_inode(struct inode *inode)
inode->i_size = sl->len; inode->i_size = sl->len;
inode->i_nlink = 1; inode->i_nlink = 1;
} }
done:
unlock_new_inode(inode);
return inode;
} }
...@@ -114,8 +114,8 @@ static int try_to_fill_dentry(struct dentry *dentry, struct super_block *sb, str ...@@ -114,8 +114,8 @@ static int try_to_fill_dentry(struct dentry *dentry, struct super_block *sb, str
dentry->d_time = (unsigned long) ent; dentry->d_time = (unsigned long) ent;
if (!dentry->d_inode) { if (!dentry->d_inode) {
inode = iget(sb, ent->ino); inode = autofs_iget(sb, ent->ino);
if (!inode) { if (IS_ERR(inode)) {
/* Failed, but leave pending for next time */ /* Failed, but leave pending for next time */
return 1; return 1;
} }
...@@ -274,6 +274,7 @@ static int autofs_root_symlink(struct inode *dir, struct dentry *dentry, const c ...@@ -274,6 +274,7 @@ static int autofs_root_symlink(struct inode *dir, struct dentry *dentry, const c
unsigned int n; unsigned int n;
int slsize; int slsize;
struct autofs_symlink *sl; struct autofs_symlink *sl;
struct inode *inode;
DPRINTK(("autofs_root_symlink: %s <- ", symname)); DPRINTK(("autofs_root_symlink: %s <- ", symname));
autofs_say(dentry->d_name.name,dentry->d_name.len); autofs_say(dentry->d_name.name,dentry->d_name.len);
...@@ -331,7 +332,12 @@ static int autofs_root_symlink(struct inode *dir, struct dentry *dentry, const c ...@@ -331,7 +332,12 @@ static int autofs_root_symlink(struct inode *dir, struct dentry *dentry, const c
ent->dentry = NULL; /* We don't keep the dentry for symlinks */ ent->dentry = NULL; /* We don't keep the dentry for symlinks */
autofs_hash_insert(dh,ent); autofs_hash_insert(dh,ent);
d_instantiate(dentry, iget(dir->i_sb,ent->ino));
inode = autofs_iget(dir->i_sb, ent->ino);
if (IS_ERR(inode))
return PTR_ERR(inode);
d_instantiate(dentry, inode);
unlock_kernel(); unlock_kernel();
return 0; return 0;
} }
...@@ -428,6 +434,7 @@ static int autofs_root_mkdir(struct inode *dir, struct dentry *dentry, int mode) ...@@ -428,6 +434,7 @@ static int autofs_root_mkdir(struct inode *dir, struct dentry *dentry, int mode)
struct autofs_sb_info *sbi = autofs_sbi(dir->i_sb); struct autofs_sb_info *sbi = autofs_sbi(dir->i_sb);
struct autofs_dirhash *dh = &sbi->dirhash; struct autofs_dirhash *dh = &sbi->dirhash;
struct autofs_dir_ent *ent; struct autofs_dir_ent *ent;
struct inode *inode;
ino_t ino; ino_t ino;
lock_kernel(); lock_kernel();
...@@ -469,7 +476,14 @@ static int autofs_root_mkdir(struct inode *dir, struct dentry *dentry, int mode) ...@@ -469,7 +476,14 @@ static int autofs_root_mkdir(struct inode *dir, struct dentry *dentry, int mode)
autofs_hash_insert(dh,ent); autofs_hash_insert(dh,ent);
inc_nlink(dir); inc_nlink(dir);
d_instantiate(dentry, iget(dir->i_sb,ino));
inode = autofs_iget(dir->i_sb, ino);
if (IS_ERR(inode)) {
drop_nlink(dir);
return PTR_ERR(inode);
}
d_instantiate(dentry, inode);
unlock_kernel(); unlock_kernel();
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment