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

Commit 535cb8f3 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

lockd: Fix server refcounting



The server shouldn't actually delete the struct nlm_host until it hits
the garbage collector. In order to make that work correctly with the
refcount API, we can bump the refcount by one, and then use
refcount_dec_if_one() in the garbage collector.

Signed-off-by: default avatarTrond Myklebust <trondmy@gmail.com>
Acked-by: default avatarJ. Bruce Fields <bfields@fieldses.org>
parent 8f39fce8
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -388,6 +388,8 @@ struct nlm_host *nlmsvc_lookup_host(const struct svc_rqst *rqstp,
	ln->nrhosts++;
	nrhosts++;

	refcount_inc(&host->h_count);

	dprintk("lockd: %s created host %s (%s)\n",
		__func__, host->h_name, host->h_addrbuf);

@@ -662,8 +664,7 @@ nlm_gc_hosts(struct net *net)
	for_each_host_safe(host, next, chain, nlm_server_hosts) {
		if (net && host->net != net)
			continue;
		if (refcount_read(&host->h_count) || host->h_inuse
		 || time_before(jiffies, host->h_expires)) {
		if (host->h_inuse || time_before(jiffies, host->h_expires)) {
			dprintk("nlm_gc_hosts skipping %s "
				"(cnt %d use %d exp %ld net %x)\n",
				host->h_name, refcount_read(&host->h_count),
@@ -671,6 +672,7 @@ nlm_gc_hosts(struct net *net)
				host->net->ns.inum);
			continue;
		}
		if (refcount_dec_if_one(&host->h_count))
			nlm_destroy_host_locked(host);
	}