From patchwork Fri Apr 18 18:44:22 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 4017811 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 0B15BBFF02 for ; Fri, 18 Apr 2014 18:46:27 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 33746203AC for ; Fri, 18 Apr 2014 18:46:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 63B6C203B5 for ; Fri, 18 Apr 2014 18:46:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754506AbaDRSqX (ORCPT ); Fri, 18 Apr 2014 14:46:23 -0400 Received: from mail-ig0-f179.google.com ([209.85.213.179]:41443 "EHLO mail-ig0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752956AbaDRSpt (ORCPT ); Fri, 18 Apr 2014 14:45:49 -0400 Received: by mail-ig0-f179.google.com with SMTP id hl10so943362igb.0 for ; Fri, 18 Apr 2014 11:45:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=8k5//7txvrPHqGxcTc2PLdDJywGsyePYVDsR0s1a+7I=; b=iAm2wC1vjZ8WqNCZO49nO6qYn3PDwRUAn7/aYoLVLrwKMDQtbNg8W6x30IEjFIy1kt jrfObe+kqOFIk66UwMlwO+M+thEJT0laj9xzjjs8Q6M9tlm8gC37d7lsq7+Jqg15ALgB jwOD5JcoSn4RCzRKOu0qZd/Xy9db9JSjIBC+sCP5SsBZwCCW00DjyNuCdR7k1Hl0e0BG CXE6uoC4HUrmpBYDww+hHToiHPfYjCvn1rI2lKBAGL6zleIhtAB5FzDFwV5qT2FyyHn4 u3Jfuq1iBn9kN77IAqDD+TlbK1++YvTMU4labtibcJZnDaFHHgFDBBI+7TBROfmHrWfh ZQ/A== X-Gm-Message-State: ALoCoQnTf54z8Guj3w8JRvcQ11LpfqJDYMMzqTOgPDkRFxa6OJysEymH9v+A/iEjXQG6CCX8aKG5 X-Received: by 10.43.151.7 with SMTP id kq7mr3751621icc.78.1397846748578; Fri, 18 Apr 2014 11:45:48 -0700 (PDT) Received: from leira.trondhjem.org.localdomain (50-124-5-70.drr02.mskg.mi.frontiernet.net. [50.124.5.70]) by mx.google.com with ESMTPSA id j9sm6018922igu.10.2014.04.18.11.45.47 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 18 Apr 2014 11:45:47 -0700 (PDT) From: Trond Myklebust To: Bruce Fields Cc: linux-nfs@vger.kernel.org Subject: [PATCH 28/70] NFSd: Add reference counting to the lock and open stateids Date: Fri, 18 Apr 2014 14:44:22 -0400 Message-Id: <1397846704-14567-29-git-send-email-trond.myklebust@primarydata.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397846704-14567-28-git-send-email-trond.myklebust@primarydata.com> References: <1397846704-14567-1-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-2-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-3-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-4-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-5-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-6-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-7-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-8-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-9-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-10-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-11-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-12-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-13-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-14-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-15-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-16-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-17-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-18-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-19-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-20-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-21-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-22-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-23-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-24-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-25-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-26-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-27-git-send-email-trond.myklebust@primarydata.com> <1397846704-14567-28-git-send-email-trond.myklebust@primarydata.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Trond Myklebust --- fs/nfsd/nfs4state.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 41314e493110..32ab3f1c83f8 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -710,8 +710,10 @@ static void close_generic_stateid(struct nfs4_ol_stateid *stp) release_all_access(stp); } -static void free_generic_stateid(struct nfs4_ol_stateid *stp) +static void put_generic_stateid(struct nfs4_ol_stateid *stp) { + if (!atomic_dec_and_test(&stp->st_stid.sc_count)) + return; remove_stid(&stp->st_stid); if (stp->st_file) put_nfs4_file(stp->st_file); @@ -730,7 +732,7 @@ static void __release_lock_stateid(struct nfs4_lockowner *lo, if (file) filp_close(file, (fl_owner_t)lo); close_generic_stateid(stp); - free_generic_stateid(stp); + put_generic_stateid(stp); } static void unhash_lockowner(struct nfs4_lockowner *lo) @@ -793,7 +795,7 @@ static void unhash_open_stateid(struct nfs4_ol_stateid *stp) static void release_open_stateid(struct nfs4_ol_stateid *stp) { unhash_open_stateid(stp); - free_generic_stateid(stp); + put_generic_stateid(stp); } static void unhash_openowner(struct nfs4_openowner *oo) @@ -814,7 +816,7 @@ static void release_last_closed_stateid(struct nfs4_openowner *oo) struct nfs4_ol_stateid *s = oo->oo_last_closed_stid; if (s) { - free_generic_stateid(s); + put_generic_stateid(s); oo->oo_last_closed_stid = NULL; } } @@ -3512,7 +3514,7 @@ void nfsd4_cleanup_open_state(struct nfsd4_open *open, __be32 status) if (open->op_file) nfsd4_free_file(open->op_file); if (open->op_stp) - free_generic_stateid(open->op_stp); + put_generic_stateid(open->op_stp); } static __be32 lookup_clientid(clientid_t *clid, bool session, struct nfsd_net *nn, struct nfs4_client **clp) @@ -4214,7 +4216,7 @@ nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, nfsd4_close_open_stateid(stp); if (cstate->minorversion) - free_generic_stateid(stp); + put_generic_stateid(stp); else oo->oo_last_closed_stid = stp;