Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp3919842pxv; Mon, 28 Jun 2021 16:41:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz9KH/nPQ7WgGnF7weN/Gq+RCGKEpMPvrloYuuERfAQAwnGKfjbcqtTBpXJckh63Uq8oeIU X-Received: by 2002:a6b:720c:: with SMTP id n12mr1503683ioc.57.1624923664497; Mon, 28 Jun 2021 16:41:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624923664; cv=none; d=google.com; s=arc-20160816; b=MfZLKYppieXyrhBiLJIgYuid5SO7ggkGV/zEgHP1noK/NAXjS5Vns+gl8aMuu/q8MD BSbUNXt2v7Fg0BsoYamT2yoQVyNzBGJPmrN7LkjvbfJJvkkhe10BSim8mkuhykAi4TyV rd339McT+RTYtV5NcuUTk+7a+zvMKvIewptiE1+0Ea+wvu2TRrD9Ax9MWyiX/4Cgyx3k ZESAv+qv4774S56EvgyC8npWc5DAerBNNPGglErZaPc+iF9Rn0Axd15OjzW3DGcXpxnV i8synW3M5embVgkB78kT17VvOTd3M3TRLEEMxdXuhNBeNDGKMS4zZcN7KHXpMIgiylYq p40A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature:dkim-filter; bh=M/ZI+fR7xzOufqjz6CjIM03nGbp0CiJvlYAcVd7HdUc=; b=afWPFueK6Y39FMMpfLWZB4GUlDVrUC5AzfODF63iuFeAXO/29984L4DPdnI5+6J0i2 UuFEQBX9/0n0SsQyv4AAfP/XxIOi476wyjjJDLE+qkFxe2MobMBtfG+9mvnSmI764YdU gigwvh02MQ23hFELT0f5ySizQwoTju9HXRxzPm8OV5+SsPtZzK8YS/AciMMrgxAxd1s8 A/CN3WHtfTAZCY1PUjAJp7hwxy9yng5LVvmTO+FZ1ONysotx+ieZKiO7GngUfeCcFJib zv/0QqFqDnA7CeNj2ghzn+PB40QA2FFat4ymGAx9vR4Os4fYfjh2otxrg9qKYG3MHj4v Pk/A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@fieldses.org header.s=default header.b=cUmZ9tY3; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f12si17367585ilk.157.2021.06.28.16.40.52; Mon, 28 Jun 2021 16:41:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@fieldses.org header.s=default header.b=cUmZ9tY3; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234616AbhF1UZ7 (ORCPT + 99 others); Mon, 28 Jun 2021 16:25:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59340 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230291AbhF1UZ6 (ORCPT ); Mon, 28 Jun 2021 16:25:58 -0400 Received: from fieldses.org (fieldses.org [IPv6:2600:3c00:e000:2f7::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E462DC061574 for ; Mon, 28 Jun 2021 13:23:32 -0700 (PDT) Received: by fieldses.org (Postfix, from userid 2815) id DA1F94F7D; Mon, 28 Jun 2021 16:23:31 -0400 (EDT) DKIM-Filter: OpenDKIM Filter v2.11.0 fieldses.org DA1F94F7D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fieldses.org; s=default; t=1624911811; bh=M/ZI+fR7xzOufqjz6CjIM03nGbp0CiJvlYAcVd7HdUc=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=cUmZ9tY3UBdFMeMdlZBr/P7zrYAJ8k8qdycbynC5cMffoQQ+uyHtkgCqyDnKuIi9e hAM6diQkPDggsB4aT6p7vCAjAQGXrL4JXMspbQwmEm4kPzCWAHT4QIvRSWLbkR0G3D UgDxaoZe2driIX1n1fwS+VSyqUh30TwRhDAUgDsA= Date: Mon, 28 Jun 2021 16:23:31 -0400 From: "J. Bruce Fields" To: Dai Ngo Cc: chuck.lever@oracle.com, linux-nfs@vger.kernel.org Subject: Re: [PATCH RFC 1/1] nfsd: Initial implementation of NFSv4 Courteous Server Message-ID: <20210628202331.GC6776@fieldses.org> References: <20210603181438.109851-1-dai.ngo@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210603181438.109851-1-dai.ngo@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org On Thu, Jun 03, 2021 at 02:14:38PM -0400, Dai Ngo wrote: > @@ -6875,7 +6947,12 @@ 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); > + > + /* try again if conflict with courtesy client */ > + if (nfs4_set_lock_denied(conflock, &lock->lk_denied) == -EAGAIN && !retried) { > + retried = true; > + goto again; > + } Ugh, apologies, this was my idea, but I just noticed it only handles conflicts from other NFSv4 clients. The conflicting lock could just as well come from NLM or a local process. So we need cooperation from the common locks.c code. I'm not sure what to suggest.... Maybe something like: @@ -1159,6 +1159,7 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request, } percpu_down_read(&file_rwsem); +retry: spin_lock(&ctx->flc_lock); /* * New lock request. Walk all POSIX locks and look for conflicts. If @@ -1169,6 +1170,11 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request, list_for_each_entry(fl, &ctx->flc_posix, fl_list) { if (!posix_locks_conflict(request, fl)) continue; + if (fl->fl_lops->fl_expire_lock(fl, 1)) { + spin_unlock(&ctx->flc_lock); + fl->fl_lops->fl_expire_locks(fl, 0); + goto retry; + } if (conflock) locks_copy_conflock(conflock, fl); error = -EAGAIN; where ->fl_expire_lock is a new lock callback with second argument "check" where: check = 1 means: just check whether this lock could be freed check = 0 means: go ahead and free this lock if you can --b.