Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp1832507imm; Mon, 3 Sep 2018 10:35:11 -0700 (PDT) X-Google-Smtp-Source: ANB0VdakKVpSw4r1KayFPujNIj26Y3R0Zl+/0478i5zGBMJfKx7XGrkjYlUub3f0Oc9wCyGy77sm X-Received: by 2002:a63:c807:: with SMTP id z7-v6mr26668330pgg.77.1535996111000; Mon, 03 Sep 2018 10:35:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535996110; cv=none; d=google.com; s=arc-20160816; b=AYFGSZliUs4YBkOBqw/YG+hxW0fO/ARlKUnjyHwTVtB2bfISie/lpNHxOi1Er+ABJs O8yaaCOr0LmdWEK6upLRZrOFI+AFqLksfNMVpmvos2F0j9bVglyK0TBODP0D5ebwvcxv Sh87JUhC+Rt+Pq2Re7dU4uVmt53PyOVZUDeTQf3/n+l4ilC2qAXDL7RkAlIU9Y3Lu7Qc LY6lhUx1E7AXnRxWiMCKYMLbXuuewvne/RmjQHNwi3qrtFJJ11O55XXrkmkOdvVCBBQx sjaY3koBgysi3qpZ2LfQAUKvTKQoL+VzCEYjPiCJSz1SnoErgKDZE94/xBe5y+GZ0TSO 5P8g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=EO633NYCQlrzdwV3sD259F/TKaqfD0sJw4fmPVwbuBY=; b=a0FevQZMibhGRlh5MK9nH87h1A9Sh410gdpTFK6HfuWY5cmVarDo3HehdZ4I2XHSJi d544ka4+FTSfZkiyFVVOeNQqksQZjlpeYKfcmSDR/XWSoQ1cq7fVex/QhCurGCTCnBWk iUQKB8tZx31xqCG7vVqRsClOINk8ndQLhfXb4iXmkOng91Ni+Kld5ek/FGH6ZDKkY4Mo o6ZWvAAH2Ij2Z2wuQJnyOawv5QoRV1rPTwyumDqsMrusATDDB+1v/DG2Vlnb0zbopKlv jKyUXdicdZcJ5Fdr4svAiQDPv0wJhynpwoOZLHxMpRq7v64P23qqqGovGxuRNcAz/W7h knBQ== ARC-Authentication-Results: i=1; mx.google.com; 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 t16-v6si18370239pgi.457.2018.09.03.10.34.55; Mon, 03 Sep 2018 10:35:10 -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; 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 S1731350AbeICVyy (ORCPT + 99 others); Mon, 3 Sep 2018 17:54:54 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:47694 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728601AbeICVyy (ORCPT ); Mon, 3 Sep 2018 17:54:54 -0400 Received: from localhost (ip-213-127-74-90.ip.prioritytelecom.net [213.127.74.90]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 9B8BFD16; Mon, 3 Sep 2018 17:33:44 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ronnie Sahlberg , Steve French , Pavel Shilovsky Subject: [PATCH 4.18 009/123] cifs: use a refcount to protect open/closing the cached file handle Date: Mon, 3 Sep 2018 18:55:53 +0200 Message-Id: <20180903165719.880570760@linuxfoundation.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180903165719.499675257@linuxfoundation.org> References: <20180903165719.499675257@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.18-stable review patch. If anyone has any objections, please let me know. ------------------ From: Ronnie Sahlberg commit 9da6ec7775d2cd76df53fbf4f1f35f6d490204f5 upstream. Signed-off-by: Ronnie Sahlberg Signed-off-by: Steve French Reviewed-by: Pavel Shilovsky Cc: Signed-off-by: Greg Kroah-Hartman --- fs/cifs/cifsglob.h | 1 + fs/cifs/smb2inode.c | 4 +++- fs/cifs/smb2ops.c | 31 ++++++++++++++++++++++++++----- fs/cifs/smb2proto.h | 1 + 4 files changed, 31 insertions(+), 6 deletions(-) --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h @@ -913,6 +913,7 @@ cap_unix(struct cifs_ses *ses) struct cached_fid { bool is_valid:1; /* Do we have a useable root fid */ + struct kref refcount; struct cifs_fid *fid; struct mutex fid_mutex; struct cifs_tcon *tcon; --- a/fs/cifs/smb2inode.c +++ b/fs/cifs/smb2inode.c @@ -120,7 +120,9 @@ smb2_open_op_close(const unsigned int xi break; } - if (use_cached_root_handle == false) + if (use_cached_root_handle) + close_shroot(&tcon->crfid); + else rc = SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); if (tmprc) rc = tmprc; --- a/fs/cifs/smb2ops.c +++ b/fs/cifs/smb2ops.c @@ -466,21 +466,36 @@ out: return rc; } -void -smb2_cached_lease_break(struct work_struct *work) +static void +smb2_close_cached_fid(struct kref *ref) { - struct cached_fid *cfid = container_of(work, - struct cached_fid, lease_break); - mutex_lock(&cfid->fid_mutex); + struct cached_fid *cfid = container_of(ref, struct cached_fid, + refcount); + if (cfid->is_valid) { cifs_dbg(FYI, "clear cached root file handle\n"); SMB2_close(0, cfid->tcon, cfid->fid->persistent_fid, cfid->fid->volatile_fid); cfid->is_valid = false; } +} + +void close_shroot(struct cached_fid *cfid) +{ + mutex_lock(&cfid->fid_mutex); + kref_put(&cfid->refcount, smb2_close_cached_fid); mutex_unlock(&cfid->fid_mutex); } +void +smb2_cached_lease_break(struct work_struct *work) +{ + struct cached_fid *cfid = container_of(work, + struct cached_fid, lease_break); + + close_shroot(cfid); +} + /* * Open the directory at the root of a share */ @@ -495,6 +510,7 @@ int open_shroot(unsigned int xid, struct if (tcon->crfid.is_valid) { cifs_dbg(FYI, "found a cached root file handle\n"); memcpy(pfid, tcon->crfid.fid, sizeof(struct cifs_fid)); + kref_get(&tcon->crfid.refcount); mutex_unlock(&tcon->crfid.fid_mutex); return 0; } @@ -511,6 +527,8 @@ int open_shroot(unsigned int xid, struct memcpy(tcon->crfid.fid, pfid, sizeof(struct cifs_fid)); tcon->crfid.tcon = tcon; tcon->crfid.is_valid = true; + kref_init(&tcon->crfid.refcount); + kref_get(&tcon->crfid.refcount); } mutex_unlock(&tcon->crfid.fid_mutex); return rc; @@ -552,6 +570,9 @@ smb3_qfs_tcon(const unsigned int xid, st FS_SECTOR_SIZE_INFORMATION); /* SMB3 specific */ if (no_cached_open) SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); + else + close_shroot(&tcon->crfid); + return; } --- a/fs/cifs/smb2proto.h +++ b/fs/cifs/smb2proto.h @@ -68,6 +68,7 @@ extern int smb3_handle_read_data(struct extern int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid); +extern void close_shroot(struct cached_fid *cfid); extern void move_smb2_info_to_cifs(FILE_ALL_INFO *dst, struct smb2_file_all_info *src); extern int smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,