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

Commit 0b7c2f6f authored by Chuck Lever's avatar Chuck Lever Committed by J. Bruce Fields
Browse files

NFSD: Refactor socket creation out of __write_ports()



Clean up: Refactor the socket creation logic out of __write_ports() to
make it easier to understand and maintain.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 82d56591
Loading
Loading
Loading
Loading
+34 −30
Original line number Diff line number Diff line
@@ -910,6 +910,37 @@ static ssize_t write_versions(struct file *file, char *buf, size_t size)
	return rv;
}

/*
 * A single 'fd' number was written, in which case it must be for
 * a socket of a supported family/protocol, and we use it as an
 * nfsd listener.
 */
static ssize_t __write_ports_addfd(char *buf)
{
	char *mesg = buf;
	int fd, err;

	err = get_int(&mesg, &fd);
	if (err != 0 || fd < 0)
		return -EINVAL;

	err = nfsd_create_serv();
	if (err != 0)
		return err;

	err = svc_addsock(nfsd_serv, fd, buf);
	if (err >= 0) {
		err = lockd_up();
		if (err < 0)
			svc_sock_names(buf + strlen(buf) + 1, nfsd_serv, buf);

		/* Decrease the count, but don't shut down the service */
		nfsd_serv->sv_nrthreads--;
	}

	return err < 0 ? err : 0;
}

/*
 * A '-' followed by the 'name' of a socket means we close the socket.
 */
@@ -995,36 +1026,9 @@ static ssize_t __write_ports(struct file *file, char *buf, size_t size)
			len = svc_xprt_names(nfsd_serv, buf, 0);
		return len;
	}
	/* Either a single 'fd' number is written, in which
	 * case it must be for a socket of a supported family/protocol,
	 * and we use it as an nfsd socket, or
	 * A '-' followed by the 'name' of a socket in which case
	 * we close the socket.
	 */
	if (isdigit(buf[0])) {
		char *mesg = buf;
		int fd;
		int err;
		err = get_int(&mesg, &fd);
		if (err)
			return -EINVAL;
		if (fd < 0)
			return -EINVAL;
		err = nfsd_create_serv();
		if (!err) {
			err = svc_addsock(nfsd_serv, fd, buf);
			if (err >= 0) {
				err = lockd_up();
				if (err < 0)
					svc_sock_names(buf+strlen(buf)+1, nfsd_serv, buf);
			}
			/* Decrease the count, but don't shutdown the
			 * the service
			 */
			nfsd_serv->sv_nrthreads--;
		}
		return err < 0 ? err : 0;
	}

	if (isdigit(buf[0]))
		return __write_ports_addfd(buf);

	if (buf[0] == '-' && isdigit(buf[1]))
		return __write_ports_delfd(buf);