Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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 */


+18 −9
Original line number Original line Diff line number Diff line
@@ -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;
}
}
+18 −4
Original line number Original line Diff line number Diff line
@@ -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;