From patchwork Mon Sep 15 18:14:40 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 4907271 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 96B239F2EC for ; Mon, 15 Sep 2014 18:13:31 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6100E2010E for ; Mon, 15 Sep 2014 18:16:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 66D1220149 for ; Mon, 15 Sep 2014 18:16:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754450AbaIOSPS (ORCPT ); Mon, 15 Sep 2014 14:15:18 -0400 Received: from mail-ie0-f169.google.com ([209.85.223.169]:44850 "EHLO mail-ie0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754416AbaIOSPA (ORCPT ); Mon, 15 Sep 2014 14:15:00 -0400 Received: by mail-ie0-f169.google.com with SMTP id rl12so5181806iec.28 for ; Mon, 15 Sep 2014 11:14:59 -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=8pOSUSvZjL04dX43cEzEzpVa8pbGypVDfI3rHmumFv4=; b=kC3q3ltfjbQzwD+3sqnGMtmaOND41UKnCTCdSW1p+edZovK6jHG8AiERhWkTSH1/aj Pl226ZEGWKpmj3VHOI0755eW3t+xObdBLu/rMWfTD+Img/6ZkgAcogZpX4DiuikO/ebF loTXGtMcT8MrHcEMS4BwnG7d2kIjNM9vrvM8peJEm9JoaomFfHOl38ne2PEH9r8KSlRm ALheppsZSvCFAILyOJwvn/vKMwZ2nwWkgR9AkAufqCqEmbzqUkaTQMxC7VICyHZRcDi/ JC/dhD1FR/mYu8AKdIH9wQCY+0gl+oPFK8Yj6/Naav08WhIHef6AuAkYjAB9dO2xUS2o OW0g== X-Gm-Message-State: ALoCoQn8J2KijR5sApqGD0hTWRPtBn79/NNIXqpT6wbZg4ox3lCUgrRkGfQtUfWzIb0tMMMhMV1a X-Received: by 10.50.20.225 with SMTP id q1mr24574891ige.36.1410804899387; Mon, 15 Sep 2014 11:14:59 -0700 (PDT) Received: from leira.trondhjem.org.localdomain (50-108-114-100.adr01.mskg.mi.frontiernet.net. [50.108.114.100]) by mx.google.com with ESMTPSA id ro6sm10736835igb.3.2014.09.15.11.14.58 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Sep 2014 11:14:58 -0700 (PDT) From: Trond Myklebust To: stable@vger.kernel.org Cc: Weston Andros Adamson , linux-nfs@vger.kernel.org Subject: [PATCH 09/14] nfs: fix nonblocking calls to nfs_page_group_lock Date: Mon, 15 Sep 2014 14:14:40 -0400 Message-Id: <1410804885-17228-10-git-send-email-trond.myklebust@primarydata.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1410804885-17228-9-git-send-email-trond.myklebust@primarydata.com> References: <1410804885-17228-1-git-send-email-trond.myklebust@primarydata.com> <1410804885-17228-2-git-send-email-trond.myklebust@primarydata.com> <1410804885-17228-3-git-send-email-trond.myklebust@primarydata.com> <1410804885-17228-4-git-send-email-trond.myklebust@primarydata.com> <1410804885-17228-5-git-send-email-trond.myklebust@primarydata.com> <1410804885-17228-6-git-send-email-trond.myklebust@primarydata.com> <1410804885-17228-7-git-send-email-trond.myklebust@primarydata.com> <1410804885-17228-8-git-send-email-trond.myklebust@primarydata.com> <1410804885-17228-9-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.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable 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 From: Weston Andros Adamson commit bc8a309e88a86205fc3e17f06e42a2e56fc6f807 upstream. nfs_page_group_lock was calling wait_on_bit_lock even when told not to block. Fix by first trying test_and_set_bit, followed by wait_on_bit_lock if and only if blocking is allowed. Return -EAGAIN if nonblocking and the test_and_set of the bit was already locked. Signed-off-by: Weston Andros Adamson Reviewed-by: Peng Tao Signed-off-by: Trond Myklebust --- fs/nfs/pagelist.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c index b4ebd4d7d976..c27a05c27c11 100644 --- a/fs/nfs/pagelist.c +++ b/fs/nfs/pagelist.c @@ -149,24 +149,29 @@ static int nfs_wait_bit_uninterruptible(void *word) * * this lock must be held if modifying the page group list * - * returns result from wait_on_bit_lock: 0 on success, < 0 on error + * return 0 on success, < 0 on error: -EDELAY if nonblocking or the + * result from wait_on_bit_lock + * + * NOTE: calling with nonblock=false should always have set the + * lock bit (see fs/buffer.c and other uses of wait_on_bit_lock + * with TASK_UNINTERRUPTIBLE), so there is no need to check the result. */ int nfs_page_group_lock(struct nfs_page *req, bool nonblock) { struct nfs_page *head = req->wb_head; - int ret; WARN_ON_ONCE(head != head->wb_head); - do { - ret = wait_on_bit_lock(&head->wb_flags, PG_HEADLOCK, - nfs_wait_bit_uninterruptible, - TASK_UNINTERRUPTIBLE); - } while (!nonblock && ret != 0); + if (!test_and_set_bit(PG_HEADLOCK, &head->wb_flags)) + return 0; - WARN_ON_ONCE(ret > 0); - return ret; + if (!nonblock) + return wait_on_bit_lock(&head->wb_flags, PG_HEADLOCK, + nfs_wait_bit_uninterruptible, + TASK_UNINTERRUPTIBLE); + + return -EAGAIN; } /*