From patchwork Thu Jul 3 05:07:45 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Tao X-Patchwork-Id: 4469491 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 C61EB9F26C for ; Thu, 3 Jul 2014 05:08:13 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id AF038203AA for ; Thu, 3 Jul 2014 05:08:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BE2CD20398 for ; Thu, 3 Jul 2014 05:08:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750824AbaGCFIK (ORCPT ); Thu, 3 Jul 2014 01:08:10 -0400 Received: from mail-pd0-f176.google.com ([209.85.192.176]:33238 "EHLO mail-pd0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750758AbaGCFIJ (ORCPT ); Thu, 3 Jul 2014 01:08:09 -0400 Received: by mail-pd0-f176.google.com with SMTP id ft15so13166993pdb.21 for ; Wed, 02 Jul 2014 22:08:09 -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; bh=amid1A1yWNojJ2Z0AYReI1SWN/0W/8Wv+fPjxdsPGPE=; b=BFI3lU5D9Yf94ZtiGit4F1YXMgWVuP0oopk8Xpw5w1nNSa66/DMU8HDS6BlgonA1ET LcqrCZLMlm/uDXlhrxmyJ93DTIepMh2Ghc5qpYno+clnwP/6wfmLEKQJxuDKHQ9ppNMr oElwgY2HbASIWnCH+nUojU+PFH+5vbgcG1AXOZBdk8rgzy58Efg/LfdKgA+6to1lnw9R CAgj/yV7uxFWfYdcJ83/hq7HywuJtZgDW6Kr4Wi9/x3pTe0I+s7ixpty6FIPKG0yFVkU 260+5tFUBYeLB3jcUuFBN/wrOcABhGnsBQteypKaNYIwBMLkUNRT/pQdCtjhFid2l8Pw FhbA== X-Gm-Message-State: ALoCoQlSuGFZ9Nf/o0sngNzB5I6A4jwWz2L7uVjh1xN+vdLWUTDgnClqnLT3r2EzjcKSMx3NRqQx X-Received: by 10.66.66.199 with SMTP id h7mr2460250pat.30.1404364089105; Wed, 02 Jul 2014 22:08:09 -0700 (PDT) Received: from localhost.localdomain ([222.212.119.63]) by mx.google.com with ESMTPSA id ei4sm39351298pbb.42.2014.07.02.22.08.05 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 02 Jul 2014 22:08:08 -0700 (PDT) From: Peng Tao To: Trond Myklebust Cc: linux-nfs@vger.kernel.org, Peng Tao , Tom Haynes Subject: [PATCH 1/2] pnfs/filelayout: fix race between mark_request_commit and scan_commit_lists Date: Thu, 3 Jul 2014 13:07:45 +0800 Message-Id: <1404364066-13031-1-git-send-email-tao.peng@primarydata.com> X-Mailer: git-send-email 1.9.1 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_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 We need to hold cinfo lock while setting bucket->wlseg and adding req to nwritten list at the same time. Otherwise there might be a window where nwritten list is empty yet we set bucket->wlseg, in which case ff_layout_scan_ds_commit_list() may end up clearing bucket->wlseg incorrectly, casuing client to oops later on. This was found when testing flexfile layout but filelayout has the same problem. Signed-off-by: Peng Tao Signed-off-by: Tom Haynes --- fs/nfs/filelayout/filelayout.c | 43 ++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c index 504d58a..a928f92 100644 --- a/fs/nfs/filelayout/filelayout.c +++ b/fs/nfs/filelayout/filelayout.c @@ -1035,18 +1035,22 @@ out: pnfs_put_lseg(freeme); } -static struct list_head * -filelayout_choose_commit_list(struct nfs_page *req, - struct pnfs_layout_segment *lseg, - struct nfs_commit_info *cinfo) +static void +filelayout_mark_request_commit(struct nfs_page *req, + struct pnfs_layout_segment *lseg, + struct nfs_commit_info *cinfo) + { struct nfs4_filelayout_segment *fl = FILELAYOUT_LSEG(lseg); u32 i, j; struct list_head *list; struct pnfs_commit_bucket *buckets; - if (fl->commit_through_mds) - return &cinfo->mds->list; + if (fl->commit_through_mds) { + list = &cinfo->mds->list; + spin_lock(cinfo->lock); + goto mds_commit; + } /* Note that we are calling nfs4_fl_calc_j_index on each page * that ends up being committed to a data server. An attractive @@ -1070,19 +1074,22 @@ filelayout_choose_commit_list(struct nfs_page *req, } set_bit(PG_COMMIT_TO_DS, &req->wb_flags); cinfo->ds->nwritten++; - spin_unlock(cinfo->lock); - return list; -} -static void -filelayout_mark_request_commit(struct nfs_page *req, - struct pnfs_layout_segment *lseg, - struct nfs_commit_info *cinfo) -{ - struct list_head *list; - - list = filelayout_choose_commit_list(req, lseg, cinfo); - nfs_request_add_commit_list(req, list, cinfo); +mds_commit: + /* nfs_request_add_commit_list(). We need to add req to list without + * dropping cinfo lock. + */ + set_bit(PG_CLEAN, &(req)->wb_flags); + nfs_list_add_request(req, list); + cinfo->mds->ncommit++; + spin_unlock(cinfo->lock); + if (!cinfo->dreq) { + inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS); + inc_bdi_stat(page_file_mapping(req->wb_page)->backing_dev_info, + BDI_RECLAIMABLE); + __mark_inode_dirty(req->wb_context->dentry->d_inode, + I_DIRTY_DATASYNC); + } } static u32 calc_ds_index_from_commit(struct pnfs_layout_segment *lseg, u32 i)