From patchwork Sat Aug 13 01:00:12 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Tao X-Patchwork-Id: 1071472 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p7GDiErL010208 for ; Tue, 16 Aug 2011 13:44:44 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752719Ab1HPNon (ORCPT ); Tue, 16 Aug 2011 09:44:43 -0400 Received: from mail-pz0-f42.google.com ([209.85.210.42]:39636 "EHLO mail-pz0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752619Ab1HPNon (ORCPT ); Tue, 16 Aug 2011 09:44:43 -0400 Received: by mail-pz0-f42.google.com with SMTP id 37so4658643pzk.1 for ; Tue, 16 Aug 2011 06:44:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=+klOREzQ8UppZ0Gzzcp7MVi4PcgHf6k8TyRtGI761ng=; b=GHM/vX/2JNpMXAxHjY+ZeAY1l3sIRJqrooQcmGS9LT1Cu5oERzd08D4fdZsSsJAgB1 SiFLpJp0/cgMwyKkC3Ma+c3zw8p/c2QrqB553E8aaGPGz7lkvDrw7R1yLXLqtHJtPVMk UINHbPnX6tFrry30EYuAkWd/9fNerc7UOptFA= Received: by 10.142.149.18 with SMTP id w18mr1868303wfd.285.1313502282779; Tue, 16 Aug 2011 06:44:42 -0700 (PDT) Received: from debian-sid.localdomain ([123.121.61.53]) by mx.google.com with ESMTPS id l7sm51165pbh.26.2011.08.16.06.44.39 (version=SSLv3 cipher=OTHER); Tue, 16 Aug 2011 06:44:41 -0700 (PDT) From: Peng Tao To: benny@tonian.com Cc: bharrosh@panasas.com, linux-nfs@vger.kernel.org, Peng Tao Subject: [PATCH v2 2/3] pNFS: recoalesce when ld read pagelist fails Date: Fri, 12 Aug 2011 18:00:12 -0700 Message-Id: <1313197213-1651-3-git-send-email-bergwolf@gmail.com> X-Mailer: git-send-email 1.7.1.262.g5ef3d In-Reply-To: <1313197213-1651-1-git-send-email-bergwolf@gmail.com> References: <1313197213-1651-1-git-send-email-bergwolf@gmail.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Tue, 16 Aug 2011 13:44:44 +0000 (UTC) For pnfs pagelist read failure, we need to pg_recoalesce and resend IO to mds. Signed-off-by: Peng Tao --- fs/nfs/pnfs.c | 20 +++++++------------- fs/nfs/pnfs.h | 2 +- fs/nfs/read.c | 13 ++++++++++++- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index ad0579a..84ecd41 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -1262,23 +1262,17 @@ EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages); /* * Called by non rpc-based layout drivers */ -int -pnfs_ld_read_done(struct nfs_read_data *data) +void pnfs_ld_read_done(struct nfs_read_data *data) { - int status; - - if (!data->pnfs_error) { + if (likely(!data->pnfs_error)) { __nfs4_read_done_cb(data); data->mds_ops->rpc_call_done(&data->task, data); - data->mds_ops->rpc_release(data); - return 0; + } else { + put_lseg(data->lseg); + data->lseg = NULL; + dprintk("pnfs write error = %d\n", data->pnfs_error); } - - dprintk("%s: pnfs_error=%d, retry via MDS\n", __func__, - data->pnfs_error); - status = nfs_initiate_read(data, NFS_CLIENT(data->inode), - data->mds_ops); - return status ? : -EAGAIN; + data->mds_ops->rpc_release(data); } EXPORT_SYMBOL_GPL(pnfs_ld_read_done); diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 0fb0a41..506f67c 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -201,7 +201,7 @@ void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data); int pnfs_layoutcommit_inode(struct inode *inode, bool sync); int _pnfs_return_layout(struct inode *); void pnfs_ld_write_done(struct nfs_write_data *); -int pnfs_ld_read_done(struct nfs_read_data *); +void pnfs_ld_read_done(struct nfs_read_data *); struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx, loff_t pos, diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 2171c04..2a46aaa 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c @@ -541,13 +541,24 @@ static void nfs_readpage_result_full(struct rpc_task *task, void *calldata) static void nfs_readpage_release_full(void *calldata) { struct nfs_read_data *data = calldata; + struct nfs_pageio_descriptor pgio; + if (data->pnfs_error) { + nfs_pageio_init_read_mds(&pgio, data->inode); + pgio.pg_recoalesce = 1; + } while (!list_empty(&data->pages)) { struct nfs_page *req = nfs_list_entry(data->pages.next); nfs_list_remove_request(req); - nfs_readpage_release(req); + if (!data->pnfs_error) { + nfs_readpage_release(req); + } else { + nfs_pageio_add_request(&pgio, req); + } } + if (data->pnfs_error) + nfs_pageio_complete(&pgio); nfs_readdata_release(calldata); }