Patch "nfsd: Extend the mutex holding region around in nfsd4_process_open2()" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
nfsd: Extend the mutex holding region around in nfsd4_process_open2()
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
nfsd-extend-the-mutex-holding-region-around-in-nfsd4_process_open2.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
5cc1fb2a093e254b656c64ff24b0b76bed1d34d9Mon Sep 17 00:00:00 2001
From: Oleg Drokin <[email protected]>
Date: Tue, 14 Jun 2016 23:28:05 -0400
Subject: nfsd: Extend the mutex holding region around in nfsd4_process_open2()
From: Oleg Drokin <[email protected]>
commit 5cc1fb2a093e254b656c64ff24b0b76bed1d34d9 upstream.
To avoid racing entry into nfs4_get_vfs_file().
Make init_open_stateid() return with locked stateid to be unlocked by the caller.
--- fs/nfsd/nfs4state.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
fs/nfsd/nfs4state.c +13 -3
@@ -3452,6 +3452,10 @@ init_open_stateid(struct nfs4_ol_stateidstruct nfs4_openowner *oo = open->op_openowner;struct nfs4_ol_stateid *retstp =NULL ; +/* We are moving these outside of the spinlocks to avoid the warnings */ +mutex_init (&stp->st_mutex); +mutex_lock (&stp->st_mutex); +spin_lock (&oo->oo_owner.so_client->cl_lock);spin_lock (&fp->fi_lock);
@@ -3467,13 +3471,17 @@ init_open_stateid(struct nfs4_ol_stateid stp->st_access_bmap =0 ; stp->st_deny_bmap =0 ; stp->st_openstp =NULL ; -mutex_init (&stp->st_mutex);list_add (&stp->st_perstateowner, &oo->oo_owner.so_stateids);list_add (&stp->st_perfile, &fp->fi_stateids); out_unlock:spin_unlock (&fp->fi_lock);spin_unlock (&oo->oo_owner.so_client->cl_lock); +if (retstp) { +mutex_lock (&retstp->st_mutex); +/* Not that we need to, just for neatness */ +mutex_unlock (&stp->st_mutex); + }return retstp; }
@@ -4309,11 +4317,14 @@ nfsd4_process_open2(struct svc_rqst *rqs }else { stp = open->op_stp; open->op_stp =NULL ; +/* +* init_open_stateid() either returns a locked stateid +* it found, or initializes and locks the new one we passed in +*/ swapstp =init_open_stateid (stp, fp, open);if (swapstp) {nfs4_put_stid (&stp->st_stid); stp = swapstp; -mutex_lock (&stp->st_mutex); status =nfs4_upgrade_open (rqstp, fp, current_fh, stp, open);if (status) {
@@ -4322,7 +4333,6 @@ nfsd4_process_open2(struct svc_rqst *rqs } goto upgrade_out; } -mutex_lock (&stp->st_mutex); status =nfs4_get_vfs_file (rqstp, fp, current_fh, stp, open);if (status) {mutex_unlock (&stp->st_mutex);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/nfsd-always-lock-state-exclusively.patch queue-4.4/nfsd-extend-the-mutex-holding-region-around-in-nfsd4_process_open2.patch queue-4.4/make-nfs_atomic_open-call-d_drop-on-all-open_context-errors.patch