Commit 92cadfcf authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull nfsd fixes from Chuck Lever:

 - Protect NFSD writes against filesystem freezing

 - Fix a potential memory leak during server shutdown

* tag 'nfsd-6.3-2' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux:
  SUNRPC: Fix a server shutdown leak
  NFSD: Protect against filesystem freezing
parents ae195ca1 9ca6705d
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -1104,7 +1104,9 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
	since = READ_ONCE(file->f_wb_err);
	since = READ_ONCE(file->f_wb_err);
	if (verf)
	if (verf)
		nfsd_copy_write_verifier(verf, nn);
		nfsd_copy_write_verifier(verf, nn);
	file_start_write(file);
	host_err = vfs_iter_write(file, &iter, &pos, flags);
	host_err = vfs_iter_write(file, &iter, &pos, flags);
	file_end_write(file);
	if (host_err < 0) {
	if (host_err < 0) {
		nfsd_reset_write_verifier(nn);
		nfsd_reset_write_verifier(nn);
		trace_nfsd_writeverf_reset(nn, rqstp, host_err);
		trace_nfsd_writeverf_reset(nn, rqstp, host_err);
+5 −1
Original line number Original line Diff line number Diff line
@@ -798,6 +798,7 @@ svc_start_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
static int
static int
svc_stop_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
svc_stop_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
{
{
	struct svc_rqst	*rqstp;
	struct task_struct *task;
	struct task_struct *task;
	unsigned int state = serv->sv_nrthreads-1;
	unsigned int state = serv->sv_nrthreads-1;


@@ -806,7 +807,10 @@ svc_stop_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
		task = choose_victim(serv, pool, &state);
		task = choose_victim(serv, pool, &state);
		if (task == NULL)
		if (task == NULL)
			break;
			break;
		kthread_stop(task);
		rqstp = kthread_data(task);
		/* Did we lose a race to svo_function threadfn? */
		if (kthread_stop(task) == -EINTR)
			svc_exit_thread(rqstp);
		nrservs++;
		nrservs++;
	} while (nrservs < 0);
	} while (nrservs < 0);
	return 0;
	return 0;