Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp670568ybv; Thu, 13 Feb 2020 07:30:43 -0800 (PST) X-Google-Smtp-Source: APXvYqxJE8GqP9STVoEBiZ/XcitbafU62ihBr6sfHssgTpwg6ZBcpZSWNJPkublSaaQ5v8rEczFH X-Received: by 2002:a9d:2264:: with SMTP id o91mr13794908ota.328.1581607843496; Thu, 13 Feb 2020 07:30:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581607843; cv=none; d=google.com; s=arc-20160816; b=XoozkHICo9a5eewJ9s9kvcnrezFZ/Q4Rpm2+h8tpfhJ7XxKesGbrqli/8DsFA8jsrB yn9FgT7Z+xSpmB1zLYrny2mvjjXyPDlGNQ8r+FRDjURkVB5fAfRV14xnMeQwzTCEGiz/ entbkYm7pFbF0oWV6kKxmwSAtApHqJlPPynd5U1uE1g7Udy9UgsXlpWnEuPlkNopwqMg flbXXkpWlGvlRPGmOXejRBgkwPrw3DEzULREarR2GAKsrQ6lCgvZbPL+6f/UR/VS2n+H LHgIkT8d6Zw1EkBPaRRqMkhk35tAYP3k1+v0OKfamy95dvNuZ/oVejGnCRqOiaNvKO1H +ebQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=vx6cW6yJWTwotywu6pUQO7o2Q6Br+z0FXOGPdZzdt5o=; b=Q/2dJGkq2ag3nDvuXXdnJ/9tDW0pO0Wlo0tXaBY23ROl2fl0FD52M9DTWS5vqinc0R aJacWgcNk/CnniCue2kYT2m4DukP1RMI0eRGoGy4hQZGfSo/uHCO8vLt9P7aeBNRv78Y IEO+CBrL1w49/X0s6fBPJis4cb0T3nNPmENAvGA9P6emWNCoEcEoB7Fbe062wWSUOp30 8ujWzAp/Bz6qpwZjdsdo2En9ZTyZQJEXwpmy7hywlYqkjYA48KEhL+F2cl/ocPxEFP+Z 5eL/UcGUDh0nC23Ng4eCxWrO7O8OcBIElz0c12MSZYymB4bH5y0hA/aw4R2dQzlj5hhn Dlfg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=gjAdfSbK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t192si1201132oif.75.2020.02.13.07.30.30; Thu, 13 Feb 2020 07:30:43 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=gjAdfSbK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387849AbgBMP3Z (ORCPT + 99 others); Thu, 13 Feb 2020 10:29:25 -0500 Received: from mail.kernel.org ([198.145.29.99]:46334 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728844AbgBMP0i (ORCPT ); Thu, 13 Feb 2020 10:26:38 -0500 Received: from localhost (unknown [104.132.1.104]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 155762467C; Thu, 13 Feb 2020 15:26:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1581607597; bh=IJpjRiOLbSqEhtq0ENmlYXhXJ9LGqGQS8O/WZpPfKdU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gjAdfSbKjTzFXIvB91i3tRmrBdF6GEByRIjJ51KObT8ENZ0ZOU9QUwFE5dDXX06No 1AcIxA1WTZdNEnCCVI1z18iohT+uHGmhV3HLLu4lneXrKN18AV1m02sM71Q/A0cAHb o5q1rmRHL4mM0B1IJFgNSwFRImdf1UwQF8zgceOI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Trond Myklebust , Anna Schumaker Subject: [PATCH 4.19 14/52] NFS/pnfs: Fix pnfs_generic_prepare_to_resend_writes() Date: Thu, 13 Feb 2020 07:20:55 -0800 Message-Id: <20200213151816.832087433@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200213151810.331796857@linuxfoundation.org> References: <20200213151810.331796857@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Trond Myklebust commit 221203ce6406273cf00e5c6397257d986c003ee6 upstream. Instead of making assumptions about the commit verifier contents, change the commit code to ensure we always check that the verifier was set by the XDR code. Fixes: f54bcf2ecee9 ("pnfs: Prepare for flexfiles by pulling out common code") Signed-off-by: Trond Myklebust Signed-off-by: Anna Schumaker Signed-off-by: Greg Kroah-Hartman --- fs/nfs/direct.c | 4 ++-- fs/nfs/nfs3xdr.c | 5 ++++- fs/nfs/nfs4xdr.c | 5 ++++- fs/nfs/pnfs_nfs.c | 7 +++---- fs/nfs/write.c | 4 +++- 5 files changed, 16 insertions(+), 9 deletions(-) --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -261,10 +261,10 @@ static int nfs_direct_cmp_commit_data_ve data->ds_commit_index); /* verifier not set so always fail */ - if (verfp->committed < 0) + if (verfp->committed < 0 || data->res.verf->committed <= NFS_UNSTABLE) return 1; - return nfs_direct_cmp_verf(verfp, &data->verf); + return nfs_direct_cmp_verf(verfp, data->res.verf); } /** --- a/fs/nfs/nfs3xdr.c +++ b/fs/nfs/nfs3xdr.c @@ -2380,6 +2380,7 @@ static int nfs3_xdr_dec_commit3res(struc void *data) { struct nfs_commitres *result = data; + struct nfs_writeverf *verf = result->verf; enum nfs_stat status; int error; @@ -2392,7 +2393,9 @@ static int nfs3_xdr_dec_commit3res(struc result->op_status = status; if (status != NFS3_OK) goto out_status; - error = decode_writeverf3(xdr, &result->verf->verifier); + error = decode_writeverf3(xdr, &verf->verifier); + if (!error) + verf->committed = NFS_FILE_SYNC; out: return error; out_status: --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -4439,11 +4439,14 @@ static int decode_write_verifier(struct static int decode_commit(struct xdr_stream *xdr, struct nfs_commitres *res) { + struct nfs_writeverf *verf = res->verf; int status; status = decode_op_hdr(xdr, OP_COMMIT); if (!status) - status = decode_write_verifier(xdr, &res->verf->verifier); + status = decode_write_verifier(xdr, &verf->verifier); + if (!status) + verf->committed = NFS_FILE_SYNC; return status; } --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -30,12 +30,11 @@ EXPORT_SYMBOL_GPL(pnfs_generic_rw_releas /* Fake up some data that will cause nfs_commit_release to retry the writes. */ void pnfs_generic_prepare_to_resend_writes(struct nfs_commit_data *data) { - struct nfs_page *first = nfs_list_entry(data->pages.next); + struct nfs_writeverf *verf = data->res.verf; data->task.tk_status = 0; - memcpy(&data->verf.verifier, &first->wb_verf, - sizeof(data->verf.verifier)); - data->verf.verifier.data[0]++; /* ensure verifier mismatch */ + memset(&verf->verifier, 0, sizeof(verf->verifier)); + verf->committed = NFS_UNSTABLE; } EXPORT_SYMBOL_GPL(pnfs_generic_prepare_to_resend_writes); --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -1814,6 +1814,7 @@ static void nfs_commit_done(struct rpc_t static void nfs_commit_release_pages(struct nfs_commit_data *data) { + const struct nfs_writeverf *verf = data->res.verf; struct nfs_page *req; int status = data->task.tk_status; struct nfs_commit_info cinfo; @@ -1840,7 +1841,8 @@ static void nfs_commit_release_pages(str /* Okay, COMMIT succeeded, apparently. Check the verifier * returned by the server against all stored verfs. */ - if (!nfs_write_verifier_cmp(&req->wb_verf, &data->verf.verifier)) { + if (verf->committed > NFS_UNSTABLE && + !nfs_write_verifier_cmp(&req->wb_verf, &verf->verifier)) { /* We have a match */ if (req->wb_page) nfs_inode_remove_request(req);