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

Commit cfdcad4d authored by J. Bruce Fields's avatar J. Bruce Fields
Browse files

knfsd: nfsv4 delegation recall should take reference on client



It's not enough to take a reference on the delegation object itself; we
need to ensure that the rpc_client won't go away just as we're about to
make an rpc call.

Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 1b1a9b31
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -486,6 +486,7 @@ out_put_cred:
	/* Success or failure, now we're either waiting for lease expiration
	/* Success or failure, now we're either waiting for lease expiration
	 * or deleg_return. */
	 * or deleg_return. */
	dprintk("NFSD: nfs4_cb_recall: dp %p dl_flock %p dl_count %d\n",dp, dp->dl_flock, atomic_read(&dp->dl_count));
	dprintk("NFSD: nfs4_cb_recall: dp %p dl_flock %p dl_count %d\n",dp, dp->dl_flock, atomic_read(&dp->dl_count));
	put_nfs4_client(clp);
	nfs4_put_delegation(dp);
	nfs4_put_delegation(dp);
	return;
	return;
}
}
+2 −0
Original line number Original line Diff line number Diff line
@@ -1345,6 +1345,7 @@ void nfsd_break_deleg_cb(struct file_lock *fl)
	 * lock) we know the server hasn't removed the lease yet, we know
	 * lock) we know the server hasn't removed the lease yet, we know
	 * it's safe to take a reference: */
	 * it's safe to take a reference: */
	atomic_inc(&dp->dl_count);
	atomic_inc(&dp->dl_count);
	atomic_inc(&dp->dl_client->cl_count);


	spin_lock(&recall_lock);
	spin_lock(&recall_lock);
	list_add_tail(&dp->dl_recall_lru, &del_recall_lru);
	list_add_tail(&dp->dl_recall_lru, &del_recall_lru);
@@ -1367,6 +1368,7 @@ void nfsd_break_deleg_cb(struct file_lock *fl)
		printk(KERN_INFO "NFSD: Callback thread failed for "
		printk(KERN_INFO "NFSD: Callback thread failed for "
			"for client (clientid %08x/%08x)\n",
			"for client (clientid %08x/%08x)\n",
			clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
			clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
		put_nfs4_client(dp->dl_client);
		nfs4_put_delegation(dp);
		nfs4_put_delegation(dp);
	}
	}
}
}