Commit 0f0a0e54 authored by Matthew Wilcox's avatar Matthew Wilcox
Browse files

devpts: Convert to new IDA API



ida_alloc_max() matches what this driver wants to do.  Also removes a
call to ida_pre_get().  We no longer need the protection of the mutex,
so convert pty_count to an atomic_t and remove the mutex entirely.

Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
parent 169b480e
Loading
Loading
Loading
Loading
+13 −34
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ static int pty_limit = NR_UNIX98_PTY_DEFAULT;
static int pty_reserve = NR_UNIX98_PTY_RESERVE;
static int pty_limit_min;
static int pty_limit_max = INT_MAX;
static int pty_count;
static atomic_t pty_count = ATOMIC_INIT(0);

static struct ctl_table pty_table[] = {
	{
@@ -93,8 +93,6 @@ static struct ctl_table pty_root_table[] = {
	{}
};

static DEFINE_MUTEX(allocated_ptys_lock);

struct pts_mount_opts {
	int setuid;
	int setgid;
@@ -533,44 +531,25 @@ static struct file_system_type devpts_fs_type = {

int devpts_new_index(struct pts_fs_info *fsi)
{
	int index;
	int ida_ret;
	int index = -ENOSPC;

retry:
	if (!ida_pre_get(&fsi->allocated_ptys, GFP_KERNEL))
		return -ENOMEM;
	if (atomic_inc_return(&pty_count) >= (pty_limit -
			  (fsi->mount_opts.reserve ? 0 : pty_reserve)))
		goto out;

	mutex_lock(&allocated_ptys_lock);
	if (pty_count >= (pty_limit -
			  (fsi->mount_opts.reserve ? 0 : pty_reserve))) {
		mutex_unlock(&allocated_ptys_lock);
		return -ENOSPC;
	}
	index = ida_alloc_max(&fsi->allocated_ptys, fsi->mount_opts.max - 1,
			GFP_KERNEL);

	ida_ret = ida_get_new(&fsi->allocated_ptys, &index);
	if (ida_ret < 0) {
		mutex_unlock(&allocated_ptys_lock);
		if (ida_ret == -EAGAIN)
			goto retry;
		return -EIO;
	}

	if (index >= fsi->mount_opts.max) {
		ida_remove(&fsi->allocated_ptys, index);
		mutex_unlock(&allocated_ptys_lock);
		return -ENOSPC;
	}
	pty_count++;
	mutex_unlock(&allocated_ptys_lock);
out:
	if (index < 0)
		atomic_dec(&pty_count);
	return index;
}

void devpts_kill_index(struct pts_fs_info *fsi, int idx)
{
	mutex_lock(&allocated_ptys_lock);
	ida_remove(&fsi->allocated_ptys, idx);
	pty_count--;
	mutex_unlock(&allocated_ptys_lock);
	ida_free(&fsi->allocated_ptys, idx);
	atomic_dec(&pty_count);
}

/**