From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Yihao Wu <wuyihao@linux.alibaba.com>,
Jeff Layton <jlayton@kernel.org>,
Anna Schumaker <Anna.Schumaker@Netapp.com>
Subject: [PATCH 5.1 29/70] NFSv4.1: Again fix a race where CB_NOTIFY_LOCK fails to wake a waiter
Date: Sun, 9 Jun 2019 18:41:40 +0200 [thread overview]
Message-ID: <20190609164129.477690330@linuxfoundation.org> (raw)
In-Reply-To: <20190609164127.541128197@linuxfoundation.org>
From: Yihao Wu <wuyihao@linux.alibaba.com>
commit 52b042ab9948cc367b61f9ca9c18603aa7813c3a upstream.
Commit b7dbcc0e433f "NFSv4.1: Fix a race where CB_NOTIFY_LOCK fails to wake a waiter"
found this bug. However it didn't fix it.
This commit replaces schedule_timeout() with wait_woken() and
default_wake_function() with woken_wake_function() in function
nfs4_retry_setlk() and nfs4_wake_lock_waiter(). wait_woken() uses
memory barriers in its implementation to avoid potential race condition
when putting a process into sleeping state and then waking it up.
Fixes: a1d617d8f134 ("nfs: allow blocking locks to be awoken by lock callbacks")
Cc: stable@vger.kernel.org #4.9+
Signed-off-by: Yihao Wu <wuyihao@linux.alibaba.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
fs/nfs/nfs4proc.c | 24 +++++++-----------------
1 file changed, 7 insertions(+), 17 deletions(-)
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -6867,7 +6867,6 @@ struct nfs4_lock_waiter {
struct task_struct *task;
struct inode *inode;
struct nfs_lowner *owner;
- bool notified;
};
static int
@@ -6889,13 +6888,13 @@ nfs4_wake_lock_waiter(wait_queue_entry_t
/* Make sure it's for the right inode */
if (nfs_compare_fh(NFS_FH(waiter->inode), &cbnl->cbnl_fh))
return 0;
-
- waiter->notified = true;
}
/* override "private" so we can use default_wake_function */
wait->private = waiter->task;
- ret = autoremove_wake_function(wait, mode, flags, key);
+ ret = woken_wake_function(wait, mode, flags, key);
+ if (ret)
+ list_del_init(&wait->entry);
wait->private = waiter;
return ret;
}
@@ -6904,7 +6903,6 @@ static int
nfs4_retry_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
{
int status = -ERESTARTSYS;
- unsigned long flags;
struct nfs4_lock_state *lsp = request->fl_u.nfs4_fl.owner;
struct nfs_server *server = NFS_SERVER(state->inode);
struct nfs_client *clp = server->nfs_client;
@@ -6914,8 +6912,7 @@ nfs4_retry_setlk(struct nfs4_state *stat
.s_dev = server->s_dev };
struct nfs4_lock_waiter waiter = { .task = current,
.inode = state->inode,
- .owner = &owner,
- .notified = false };
+ .owner = &owner};
wait_queue_entry_t wait;
/* Don't bother with waitqueue if we don't expect a callback */
@@ -6928,21 +6925,14 @@ nfs4_retry_setlk(struct nfs4_state *stat
add_wait_queue(q, &wait);
while(!signalled()) {
- waiter.notified = false;
status = nfs4_proc_setlk(state, cmd, request);
if ((status != -EAGAIN) || IS_SETLK(cmd))
break;
status = -ERESTARTSYS;
- spin_lock_irqsave(&q->lock, flags);
- if (waiter.notified) {
- spin_unlock_irqrestore(&q->lock, flags);
- continue;
- }
- set_current_state(TASK_INTERRUPTIBLE);
- spin_unlock_irqrestore(&q->lock, flags);
-
- freezable_schedule_timeout(NFS4_LOCK_MAXTIMEOUT);
+ freezer_do_not_count();
+ wait_woken(&wait, TASK_INTERRUPTIBLE, NFS4_LOCK_MAXTIMEOUT);
+ freezer_count();
}
finish_wait(q, &wait);
next prev parent reply other threads:[~2019-06-09 16:45 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-09 16:41 [PATCH 5.1 00/70] 5.1.9-stable review Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 01/70] ethtool: fix potential userspace buffer overflow Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 02/70] Fix memory leak in sctp_process_init Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 03/70] ipv4: not do cache for local delivery if bc_forwarding is enabled Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 04/70] ipv6: fix the check before getting the cookie in rt6_get_cookie Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 05/70] net: ethernet: ti: cpsw_ethtool: fix ethtool ring param set Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 06/70] net: mvpp2: Use strscpy to handle stat strings Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 07/70] net: rds: fix memory leak in rds_ib_flush_mr_pool Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 08/70] net: sfp: read eeprom in maximum 16 byte increments Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 09/70] packet: unconditionally free po->rollover Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 10/70] pktgen: do not sleep with the thread lock held Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 11/70] Revert "fib_rules: return 0 directly if an exactly same rule exists when NLM_F_EXCL not supplied" Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 12/70] udp: only choose unbound UDP socket for multicast when not in a VRF Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 13/70] ipv6: use READ_ONCE() for inet->hdrincl as in ipv4 Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 14/70] ipv6: fix EFAULT on sendto with icmpv6 and hdrincl Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 15/70] net: aquantia: fix wol configuration not applied sometimes Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 16/70] neighbor: Reset gc_entries counter if new entry is released before insert Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 17/70] neighbor: Call __ipv4_neigh_lookup_noref in neigh_xmit Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 18/70] cls_matchall: avoid panic when receiving a packet before filter set Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 19/70] ipmr_base: Do not reset index in mr_table_dump Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 20/70] net/mlx4_en: ethtool, Remove unsupported SFP EEPROM high pages query Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 21/70] net/tls: replace the sleeping lock around RX resync with a bit lock Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 22/70] rcu: locking and unlocking need to always be at least barriers Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 23/70] habanalabs: fix debugfs code Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 24/70] ARC: mm: SIGSEGV userspace trying to access kernel virtual memory Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 25/70] parisc: Use implicit space register selection for loading the coherence index of I/O pdirs Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 26/70] parisc: Fix crash due alternative coding for NP iopdir_fdc bit Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 27/70] SUNRPC fix regression in umount of a secure mount Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 28/70] SUNRPC: Fix a use after free when a server rejects the RPCSEC_GSS credential Greg Kroah-Hartman
2019-06-09 16:41 ` Greg Kroah-Hartman [this message]
2019-06-09 16:41 ` [PATCH 5.1 30/70] NFSv4.1: Fix bug only first CB_NOTIFY_LOCK is handled Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 31/70] fuse: fallocate: fix return with locked inode Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 32/70] fuse: fix copy_file_range() in the writeback case Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 33/70] pstore: Set tfm to NULL on free_buf_for_compression Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 34/70] pstore/ram: Run without kernel crash dump region Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 35/70] kbuild: use more portable command -v for cc-cross-prefix Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 36/70] memstick: mspro_block: Fix an error code in mspro_block_issue_req() Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 37/70] mmc: tmio: fix SCC error handling to avoid false positive CRC error Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 38/70] mmc: sdhci_am654: Fix SLOTTYPE write Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 39/70] x86/power: Fix nosmt vs hibernation triple fault during resume Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 40/70] x86/insn-eval: Fix use-after-free access to LDT entry Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 41/70] i2c: xiic: Add max_read_len quirk Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 42/70] s390/mm: fix address space detection in exception handling Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 43/70] nvme-rdma: fix queue mapping when queue count is limited Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 44/70] xen-blkfront: switch kcalloc to kvcalloc for large array allocation Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 45/70] MIPS: Bounds check virt_addr_valid Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 46/70] MIPS: pistachio: Build uImage.gz by default Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 47/70] genwqe: Prevent an integer overflow in the ioctl Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 48/70] test_firmware: Use correct snprintf() limit Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 49/70] drm/rockchip: fix fb references in async update Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 50/70] drm/vc4: " Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 51/70] drm/gma500/cdv: Check vbt config bits when detecting lvds panels Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 52/70] drm/msm: fix fb references in async update Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 53/70] drm: add non-desktop quirk for Valve HMDs Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 54/70] drm/nouveau: add kconfig option to turn off nouveau legacy contexts. (v3) Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 55/70] drm: add non-desktop quirks to Sensics and OSVR headsets Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 56/70] drm: Fix timestamp docs for variable refresh properties Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 57/70] drm/amdgpu/psp: move psp version specific function pointers to early_init Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 58/70] drm/radeon: prefer lower reference dividers Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 59/70] drm/amdgpu: remove ATPX_DGPU_REQ_POWER_FOR_DISPLAYS check when hotplug-in Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 60/70] drm/i915: Fix I915_EXEC_RING_MASK Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 61/70] drm/amdgpu/soc15: skip reset on init Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 62/70] drm/amd/display: Add ASICREV_IS_PICASSO Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 63/70] drm/amdgpu: fix ring test failure issue during s3 in vce 3.0 (V2) Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 64/70] drm/i915/fbc: disable framebuffer compression on GeminiLake Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 65/70] drm/i915/gvt: emit init breadcrumb for gvt request Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 66/70] drm/i915: Maintain consistent documentation subsection ordering Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 67/70] drm: dont block fb changes for async plane updates Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 68/70] drm/i915/gvt: Initialize intel_gvt_gtt_entry in stack Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 69/70] drm/amd: fix fb references in async update Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 70/70] TTY: serial_core, add ->install Greg Kroah-Hartman
2019-06-09 22:37 ` [PATCH 5.1 00/70] 5.1.9-stable review Jiunn Chang
2019-06-10 5:57 ` Greg Kroah-Hartman
2019-06-10 6:03 ` Naresh Kamboju
2019-06-10 14:26 ` Greg Kroah-Hartman
2019-06-10 8:52 ` Jon Hunter
2019-06-10 14:25 ` Greg Kroah-Hartman
2019-06-10 14:45 ` Guenter Roeck
2019-06-10 14:51 ` Greg Kroah-Hartman
2019-06-10 22:01 ` shuah
2019-06-11 7:21 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190609164129.477690330@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=Anna.Schumaker@Netapp.com \
--cc=jlayton@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=wuyihao@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).