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

Commit 1654a04c authored by Jeff Layton's avatar Jeff Layton Committed by J. Bruce Fields
Browse files

sunrpc: don't wait for write before allowing reads from use-gss-proxy file



It doesn't make much sense to make reads from this procfile hang. As
far as I can tell, only gssproxy itself will open this file and it
never reads from it. Change it to just give the present setting of
sn->use_gss_proxy without waiting for anything.

Note that we do not want to call use_gss_proxy() in this codepath
since an inopportune read of this file could cause it to be disabled
prematurely.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 73ca6590
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -137,7 +137,6 @@ void init_gssp_clnt(struct sunrpc_net *sn)
{
	mutex_init(&sn->gssp_lock);
	sn->gssp_clnt = NULL;
	init_waitqueue_head(&sn->gssp_wq);
}

int set_gssp_clnt(struct net *net)
@@ -154,7 +153,6 @@ int set_gssp_clnt(struct net *net)
		sn->gssp_clnt = clnt;
	}
	mutex_unlock(&sn->gssp_lock);
	wake_up(&sn->gssp_wq);
	return ret;
}

+2 −31
Original line number Diff line number Diff line
@@ -1295,34 +1295,9 @@ static int set_gss_proxy(struct net *net, int type)
	else
		ret = -EBUSY;
	spin_unlock(&use_gssp_lock);
	wake_up(&sn->gssp_wq);
	return ret;
}

static inline bool gssp_ready(struct sunrpc_net *sn)
{
	switch (sn->use_gss_proxy) {
		case -1:
			return false;
		case 0:
			return true;
		case 1:
			return sn->gssp_clnt;
	}
	WARN_ON_ONCE(1);
	return false;
}

static int wait_for_gss_proxy(struct net *net, struct file *file)
{
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);

	if (file->f_flags & O_NONBLOCK && !gssp_ready(sn))
		return -EAGAIN;
	return wait_event_interruptible(sn->gssp_wq, gssp_ready(sn));
}


static ssize_t write_gssp(struct file *file, const char __user *buf,
			 size_t count, loff_t *ppos)
{
@@ -1355,16 +1330,12 @@ static ssize_t read_gssp(struct file *file, char __user *buf,
			 size_t count, loff_t *ppos)
{
	struct net *net = PDE_DATA(file_inode(file));
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
	unsigned long p = *ppos;
	char tbuf[10];
	size_t len;
	int ret;

	ret = wait_for_gss_proxy(net, file);
	if (ret)
		return ret;

	snprintf(tbuf, sizeof(tbuf), "%d\n", use_gss_proxy(net));
	snprintf(tbuf, sizeof(tbuf), "%d\n", sn->use_gss_proxy);
	len = strlen(tbuf);
	if (p >= len)
		return 0;
+0 −1
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ struct sunrpc_net {
	unsigned int rpcb_is_af_local : 1;

	struct mutex gssp_lock;
	wait_queue_head_t gssp_wq;
	struct rpc_clnt *gssp_clnt;
	int use_gss_proxy;
	int pipe_version;