Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp598168img; Fri, 22 Mar 2019 04:53:09 -0700 (PDT) X-Google-Smtp-Source: APXvYqzBXGV5mWqqui7JUFqduqW3OpoTTdVH/7VsTBczIz9kKzU3nubXIBiG5clzQAOkk02pqdi8 X-Received: by 2002:a17:902:e113:: with SMTP id cc19mr9354817plb.179.1553255589927; Fri, 22 Mar 2019 04:53:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553255589; cv=none; d=google.com; s=arc-20160816; b=IYOKTcVHdc7x9q7proKyqYY8G9OD+t0Qm1lCPRjRJWK3pSKoCmKFUYwG7L+NSsk/0Z hqbFWnJO1hIEpdEEa/LQqabAC0akBLMrgnopr+9KtPKyMUU5/1rqM7URo+7TzwIsX9Nk ed1JX9Pj+uNypawpqDgFv4/MPPg4g8xnM3ZwA2PdRbKS1aKUFT3vMG8SOt0/a1hpBmfl YEdsMTgX3JqagSLBCgslTN1KeiyN5DJjVTriRum+y0LLyXb0GOdSkl/MCr8nUmN5MXMj 0rquXAy3F5gAIMaHRrMMEShje/s/FctKgCoDgWe/6nD3OaG5oWvMunJ+zvYy6qlBq9MX hfAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=m+CTJ++9Mrl/ZRdEWNrQC2SGFZvb7tlxTMeTRGFFbiU=; b=xwnh260kGjMBTe8DPDZJ/XMqs+r08Bcd48ack2whq4d3LHNBogj7LsAv/In1YOpko2 ypOKH3oyx+ECrsM7fJHZEiN5wFzHS38r9ZtCC3vqPeY0L2tGdT/GdYkfI5YQlcxWdTlP d7GTfMvi60CWPX3YQ5w8SfHAdkUJew+h6qJj9vhQIfdBHlXeWLrDsdRF4NimK/dlnVnu pYUfQKwawpyF4PyjPbIDa7eBnv1jalpwdszoQRIXYBf3FZ5/2IxUA1IHGmLIMuop2OoU X8Otch57IJuAjcTo77ZkMyVdlC4jj0ULIkjt/FVMGbL7gNnPxC8y5b8WpO9xZyH+R+oU GuNQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FIqH4i2C; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p2si6242440pfd.257.2019.03.22.04.52.54; Fri, 22 Mar 2019 04:53:09 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FIqH4i2C; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732365AbfCVLvE (ORCPT + 99 others); Fri, 22 Mar 2019 07:51:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:54838 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732485AbfCVLvA (ORCPT ); Fri, 22 Mar 2019 07:51:00 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7B4FA2082C; Fri, 22 Mar 2019 11:50:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1553255459; bh=KCQ6nCeht4Gfefhx4JVGZnX0bBQjjpjTRk/qfUNTccA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FIqH4i2CFvhjmV+LPzbFM6fkcqXugsx6DvpNlbhTcuUI5PtmqjVNgTkChRXXOF5c4 X06qWYdBRznBnRUfnaBuadoN9zgRyLiPDv0Jta5xH2lhS4m+EEbfvaO030R7lENlz+ 8z2w+8bGzuZtRvxRTKU2zYh6RG+No6XL+TgBfbOA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Pavel Shilovsky , Steve French Subject: [PATCH 4.14 079/183] CIFS: Do not reset lease state to NONE on lease break Date: Fri, 22 Mar 2019 12:15:07 +0100 Message-Id: <20190322111247.453291129@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190322111241.819468003@linuxfoundation.org> References: <20190322111241.819468003@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Pavel Shilovsky commit 7b9b9edb49ad377b1e06abf14354c227e9ac4b06 upstream. Currently on lease break the client sets a caching level twice: when oplock is detected and when oplock is processed. While the 1st attempt sets the level to the value provided by the server, the 2nd one resets the level to None unconditionally. This happens because the oplock/lease processing code was changed to avoid races between page cache flushes and oplock breaks. The commit c11f1df5003d534 ("cifs: Wait for writebacks to complete before attempting write.") fixed the races for oplocks but didn't apply the same changes for leases resulting in overwriting the server granted value to None. Fix this by properly processing lease breaks. Signed-off-by: Pavel Shilovsky Signed-off-by: Steve French CC: Stable Signed-off-by: Greg Kroah-Hartman --- fs/cifs/smb2misc.c | 17 ++++++++++++++--- fs/cifs/smb2ops.c | 15 ++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) --- a/fs/cifs/smb2misc.c +++ b/fs/cifs/smb2misc.c @@ -479,7 +479,6 @@ smb2_tcon_has_lease(struct cifs_tcon *tc __u8 lease_state; struct list_head *tmp; struct cifsFileInfo *cfile; - struct TCP_Server_Info *server = tcon->ses->server; struct cifs_pending_open *open; struct cifsInodeInfo *cinode; int ack_req = le32_to_cpu(rsp->Flags & @@ -499,13 +498,25 @@ smb2_tcon_has_lease(struct cifs_tcon *tc cifs_dbg(FYI, "lease key match, lease break 0x%x\n", le32_to_cpu(rsp->NewLeaseState)); - server->ops->set_oplock_level(cinode, lease_state, 0, NULL); - if (ack_req) cfile->oplock_break_cancelled = false; else cfile->oplock_break_cancelled = true; + set_bit(CIFS_INODE_PENDING_OPLOCK_BREAK, &cinode->flags); + + /* + * Set or clear flags depending on the lease state being READ. + * HANDLE caching flag should be added when the client starts + * to defer closing remote file handles with HANDLE leases. + */ + if (lease_state & SMB2_LEASE_READ_CACHING_HE) + set_bit(CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2, + &cinode->flags); + else + clear_bit(CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2, + &cinode->flags); + queue_work(cifsoplockd_wq, &cfile->oplock_break); kfree(lw); return true; --- a/fs/cifs/smb2ops.c +++ b/fs/cifs/smb2ops.c @@ -1933,6 +1933,15 @@ smb2_downgrade_oplock(struct TCP_Server_ } static void +smb21_downgrade_oplock(struct TCP_Server_Info *server, + struct cifsInodeInfo *cinode, bool set_level2) +{ + server->ops->set_oplock_level(cinode, + set_level2 ? SMB2_LEASE_READ_CACHING_HE : + 0, 0, NULL); +} + +static void smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock, unsigned int epoch, bool *purge_cache) { @@ -2917,7 +2926,7 @@ struct smb_version_operations smb21_oper .print_stats = smb2_print_stats, .is_oplock_break = smb2_is_valid_oplock_break, .handle_cancelled_mid = smb2_handle_cancelled_mid, - .downgrade_oplock = smb2_downgrade_oplock, + .downgrade_oplock = smb21_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize, @@ -3012,7 +3021,7 @@ struct smb_version_operations smb30_oper .dump_share_caps = smb2_dump_share_caps, .is_oplock_break = smb2_is_valid_oplock_break, .handle_cancelled_mid = smb2_handle_cancelled_mid, - .downgrade_oplock = smb2_downgrade_oplock, + .downgrade_oplock = smb21_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize, @@ -3117,7 +3126,7 @@ struct smb_version_operations smb311_ope .dump_share_caps = smb2_dump_share_caps, .is_oplock_break = smb2_is_valid_oplock_break, .handle_cancelled_mid = smb2_handle_cancelled_mid, - .downgrade_oplock = smb2_downgrade_oplock, + .downgrade_oplock = smb21_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,