mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
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: David Howells <dhowells@redhat.com> Cc: Ian Kent <raven@themaw.net> Acked-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
210f855963
commit
62328a0239
3 changed files with 37 additions and 13 deletions
|
@ -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 @@ out_kill_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)
|
||||||
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 @@ fail_unlock:
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue