From patchwork Mon Jul 7 14:12:21 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kinglong Mee X-Patchwork-Id: 4494951 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 883199F1C4 for ; Mon, 7 Jul 2014 14:13:07 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 93F8520212 for ; Mon, 7 Jul 2014 14:13:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9F482201EC for ; Mon, 7 Jul 2014 14:13:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753285AbaGGONE (ORCPT ); Mon, 7 Jul 2014 10:13:04 -0400 Received: from mail-pd0-f177.google.com ([209.85.192.177]:53185 "EHLO mail-pd0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753219AbaGGOND (ORCPT ); Mon, 7 Jul 2014 10:13:03 -0400 Received: by mail-pd0-f177.google.com with SMTP id y10so5420498pdj.36 for ; Mon, 07 Jul 2014 07:13:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :content-type:content-transfer-encoding; bh=ketDCMGbwL4FLIoBVHt2bpTvf4Okya4te87k5yj3sec=; b=0ADzcCDb3Mn2jUYnZJ2xkFt44TbaAJnV9SyNP1Ec6ooVdYtNx3AEKLTolijk0Qwtwk d3YOAJqYS1FsaUeZ0VgkyoBSShURRdQoQOX6aKOoCASulMNOgkoqo324RzI57XCDel2J VoK8ZUFl5jIW3LHiExOdI6wq9uRVegdkj8h0GgFlUoyXsm03al1cGiLPScc7p+RU+FlU GKNm/nzHIELMEMzY5MXzLZWT0I6ZqZqJeBq1S/e5UU582ayO4pZW8tHmVcMCvDorF+Ks xx1ZmNpVIqjMJ4K8KB+qR0cCJGLB/P01551IP3H+yDz0VklyAg3m3Df42HV+O1fHs58T 8tTQ== X-Received: by 10.70.55.229 with SMTP id v5mr1941143pdp.145.1404742382132; Mon, 07 Jul 2014 07:13:02 -0700 (PDT) Received: from [192.168.0.100] ([118.117.112.198]) by mx.google.com with ESMTPSA id op6sm20474526pdb.71.2014.07.07.07.12.55 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 07 Jul 2014 07:13:00 -0700 (PDT) Message-ID: <53BAAAC5.9000106@gmail.com> Date: Mon, 07 Jul 2014 22:12:21 +0800 From: Kinglong Mee User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: "J. Bruce Fields" CC: Linux NFS Mailing List , kinglongmee@gmail.com, NeilBrown , jlayton@redhat.com Subject: [PATCH 2/4] NFSD: Rervert "knfsd: locks: flag NFSv4-owned locks" 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.4 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, 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 Commit d5b9026a67 ([PATCH] knfsd: locks: flag NFSv4-owned locks) using fl_lmops field in file_lock for checking nfsd4 lockowner. But, commit 1a747ee0cc (locks: don't call ->copy_lock methods on return of conflicting locks) causes the fl_lmops of conflock for nfsd4_lock always be NULL. Also, commit 0996905f93 (lockd: posix_test_lock() should not call locks_copy_lock()) caused the fl_lmops of conflock for nfsd4_lockt always be NULL too. So that, using fl_lmops cannot checking nfsd4 lockowner for it always be NULL. This patch save the strhashval in nfs4_lockowner for searching lockownerlike before. Signed-off-by: Kinglong Mee Acked-by: Jeff Layton --- fs/nfsd/nfs4state.c | 35 +++++++++++++++++++++++------------ fs/nfsd/state.h | 1 + 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 9b9474c..1b5afc1 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -4282,18 +4282,30 @@ nfs4_transform_lock_offset(struct file_lock *lock) lock->fl_end = OFFSET_MAX; } -/* Hack!: For now, we're defining this just so we can use a pointer to it - * as a unique cookie to identify our (NFSv4's) posix locks. */ -static const struct lock_manager_operations nfsd_posix_mng_ops = { -}; +static bool +nfs4_verify_lock_stateowner(struct nfs4_lockowner *lo, struct nfsd_net *nn) +{ + struct nfs4_stateowner *local = NULL; + unsigned hashval = lo->lo_hashval; + + if (hashval >= OWNER_HASH_SIZE) + return false; + + list_for_each_entry(local, &nn->ownerstr_hashtbl[hashval], so_strhash) { + if (local == &lo->lo_owner) + return true; + } + + return false; +} static inline void -nfs4_set_lock_denied(struct file_lock *fl, struct nfsd4_lock_denied *deny) +nfs4_set_lock_denied(struct file_lock *fl, struct nfsd4_lock_denied *deny, + struct nfsd_net *nn) { - struct nfs4_lockowner *lo; + struct nfs4_lockowner *lo = (struct nfs4_lockowner *) fl->fl_owner; - if (fl->fl_lmops == &nfsd_posix_mng_ops) { - lo = (struct nfs4_lockowner *) fl->fl_owner; + if (nfs4_verify_lock_stateowner(lo, nn)) { deny->ld_owner.data = kmemdup(lo->lo_owner.so_owner.data, lo->lo_owner.so_owner.len, GFP_KERNEL); if (!deny->ld_owner.data) @@ -4350,6 +4362,7 @@ alloc_init_lock_stateowner(unsigned int strhashval, struct nfs4_client *clp, str if (!lo) return NULL; INIT_LIST_HEAD(&lo->lo_owner.so_stateids); + lo->lo_hashval = strhashval; lo->lo_owner.so_is_open_owner = 0; /* It is the openowner seqid that will be incremented in encode in the * case of new lockowners; so increment the lock seqid manually: */ @@ -4564,7 +4577,6 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, file_lock->fl_pid = current->tgid; file_lock->fl_file = filp; file_lock->fl_flags = FL_POSIX; - file_lock->fl_lmops = &nfsd_posix_mng_ops; file_lock->fl_start = lock->lk_offset; file_lock->fl_end = last_byte_offset(lock->lk_offset, lock->lk_length); nfs4_transform_lock_offset(file_lock); @@ -4587,7 +4599,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, case (EAGAIN): /* conflock holds conflicting lock */ status = nfserr_denied; dprintk("NFSD: nfsd4_lock: conflicting lock found!\n"); - nfs4_set_lock_denied(conflock, &lock->lk_denied); + nfs4_set_lock_denied(conflock, &lock->lk_denied, nn); break; case (EDEADLK): status = nfserr_deadlock; @@ -4695,7 +4707,7 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, if (file_lock->fl_type != F_UNLCK) { status = nfserr_denied; - nfs4_set_lock_denied(file_lock, &lockt->lt_denied); + nfs4_set_lock_denied(file_lock, &lockt->lt_denied, nn); } out: nfs4_unlock_state(); @@ -4746,7 +4758,6 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, file_lock->fl_pid = current->tgid; file_lock->fl_file = filp; file_lock->fl_flags = FL_POSIX; - file_lock->fl_lmops = &nfsd_posix_mng_ops; file_lock->fl_start = locku->lu_offset; file_lock->fl_end = last_byte_offset(locku->lu_offset, diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index 1848fed..9ecae58 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h @@ -362,6 +362,7 @@ struct nfs4_openowner { struct nfs4_lockowner { struct nfs4_stateowner lo_owner; /* must be first element */ + unsigned int lo_hashval; }; static inline struct nfs4_openowner * openowner(struct nfs4_stateowner *so)