Commit b89aa544 authored by Al Viro's avatar Al Viro
Browse files

convert binderfs



Objects are created either by d_alloc_name()+d_add() (in
binderfs_ctl_create()) or by simple_start_creating()+d_instantiate().
Removals are by simple_recurisive_removal().

Switch d_add()/d_instantiate() to d_make_persistent() + dput().
Voila - kill_litter_super() is not needed anymore.

Fold dput()+unlocking the parent into simple_done_creating(), while
we are at it.

NOTE: return value of binderfs_create_file() is borrowed; it may get
stored in proc->binderfs_entry.  See binder_release()...

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 02da8d2c
Loading
Loading
Loading
Loading
+14 −19
Original line number Diff line number Diff line
@@ -189,9 +189,9 @@ static int binderfs_binder_device_create(struct inode *ref_inode,
		goto err;
	}
	inode->i_private = device;
	d_instantiate(dentry, inode);
	d_make_persistent(dentry, inode);
	fsnotify_create(root->d_inode, dentry);
	inode_unlock(d_inode(root));
	simple_done_creating(dentry);

	binder_add_device(device);

@@ -432,7 +432,8 @@ static int binderfs_binder_ctl_create(struct super_block *sb)

	inode->i_private = device;
	info->control_dentry = dentry;
	d_add(dentry, inode);
	d_make_persistent(dentry, inode);
	dput(dentry);

	return 0;

@@ -479,19 +480,16 @@ struct dentry *binderfs_create_file(struct dentry *parent, const char *name,
	sb = parent_inode->i_sb;
	new_inode = binderfs_make_inode(sb, S_IFREG | 0444);
	if (!new_inode) {
		dput(dentry);
		dentry = ERR_PTR(-ENOMEM);
		goto out;
		simple_done_creating(dentry);
		return ERR_PTR(-ENOMEM);
	}

	new_inode->i_fop = fops;
	new_inode->i_private = data;
	d_instantiate(dentry, new_inode);
	d_make_persistent(dentry, new_inode);
	fsnotify_create(parent_inode, dentry);

out:
	inode_unlock(parent_inode);
	return dentry;
	simple_done_creating(dentry);
	return dentry; // borrowed
}

static struct dentry *binderfs_create_dir(struct dentry *parent,
@@ -510,21 +508,18 @@ static struct dentry *binderfs_create_dir(struct dentry *parent,
	sb = parent_inode->i_sb;
	new_inode = binderfs_make_inode(sb, S_IFDIR | 0755);
	if (!new_inode) {
		dput(dentry);
		dentry = ERR_PTR(-ENOMEM);
		goto out;
		simple_done_creating(dentry);
		return ERR_PTR(-ENOMEM);
	}

	new_inode->i_fop = &simple_dir_operations;
	new_inode->i_op = &simple_dir_inode_operations;

	set_nlink(new_inode, 2);
	d_instantiate(dentry, new_inode);
	d_make_persistent(dentry, new_inode);
	inc_nlink(parent_inode);
	fsnotify_mkdir(parent_inode, dentry);

out:
	inode_unlock(parent_inode);
	simple_done_creating(dentry);
	return dentry;
}

@@ -740,7 +735,7 @@ static void binderfs_kill_super(struct super_block *sb)
	 * During inode eviction struct binderfs_info is needed.
	 * So first wipe the super_block then free struct binderfs_info.
	 */
	kill_litter_super(sb);
	kill_anon_super(sb);

	if (info && info->ipc_ns)
		put_ipc_ns(info->ipc_ns);