From patchwork Wed May 11 10:21:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 9067471 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.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 254B89F6FA for ; Wed, 11 May 2016 10:21:56 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 25E1420114 for ; Wed, 11 May 2016 10:21:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3166F20145 for ; Wed, 11 May 2016 10:21:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932198AbcEKKVd (ORCPT ); Wed, 11 May 2016 06:21:33 -0400 Received: from mail-qk0-f196.google.com ([209.85.220.196]:33123 "EHLO mail-qk0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932177AbcEKKVb (ORCPT ); Wed, 11 May 2016 06:21:31 -0400 Received: by mail-qk0-f196.google.com with SMTP id q184so2745482qkf.0 for ; Wed, 11 May 2016 03:21:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=poochiereds-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2hXsTHvPNY8MImTZXqftKhSJpoHHmgPhmw9pFvuO/Oc=; b=O1zvorfmqpDujJsPdkIf6K/Pi1OPLCbHJ5cw2fvhy7uhi4U+EAWBze0lLxSSRIxiCi 0AAKr6qJXYedv7Uqtl6dU2kKp9hZEKFSlzmR/anVFCnEGKRo2y44bwfTxdqI/atyQJRU HpgrfAcAzWA9HJxcvQv0KroKLHtqcHGq/kUSOUJBMDTKb0iUMxBgVkA2YOej98+BWAur U98up2ZBXsbdPdqCZ654dVWCLRHjiyWsO9my5tCOznisU81VLXnRWt2jyR3X8j8CoXw/ pWiJjv/S7Hu2CdC2saa8T0X+v5pRY/DHU3Cl7eFqGkSUCTRn8JiA2Q5AMCo2jRWWROD0 p2iQ== 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=2hXsTHvPNY8MImTZXqftKhSJpoHHmgPhmw9pFvuO/Oc=; b=c10JlNL86oSyTcNQG1t8sP9j86c2oyGVbbleN9wDwDaSeoo4F4bXElllsEHl0Z3988 tN+8dG7gGpLwysJhznlGxX0zrRvB6xjY6RzKcfLn5bz8CLwhAyvu2FyuoPJW4rqmsthk 9BVgfself79SnBrpJWiY+du4EeBMOb+JD4vdIk3IsskJECRe20JM2LzicZ29gasDwd/X vuJe8QMYE09TC6SEhwjZoBlNubMPY79MXvf74sVEMSywfu9khXKhA+j+1kO59TK01Qcn WD8jTTCc6zA3qPA8ezQN/rQ9sXC5KnEymZRTszUyOkoeQJbZL9v7ftNo4yMZuwRAYD6F Bkzw== X-Gm-Message-State: AOPr4FX8Jp+ZhmrJrPetttFIVd4VGtVYaeidfZsstTpOURqKJROSyLWAI4c7tkWcPuVt4w== X-Received: by 10.55.164.145 with SMTP id n139mr2512422qke.190.1462962090673; Wed, 11 May 2016 03:21:30 -0700 (PDT) Received: from tlielax.poochiereds.net ([2606:a000:1125:4074:3a60:77ff:fe93:a95d]) by smtp.googlemail.com with ESMTPSA id r127sm3048446qkf.47.2016.05.11.03.21.29 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 11 May 2016 03:21:30 -0700 (PDT) From: Jeff Layton X-Google-Original-From: Jeff Layton To: Trond Myklebust , Anna Schumaker Cc: linux-nfs@vger.kernel.org Subject: [PATCH v2 8/9] pnfs: lift retry logic from send_layoutget to pnfs_update_layout Date: Wed, 11 May 2016 06:21:13 -0400 Message-Id: <1462962074-6989-9-git-send-email-jeff.layton@primarydata.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1462962074-6989-1-git-send-email-jeff.layton@primarydata.com> References: <1462962074-6989-1-git-send-email-jeff.layton@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=-8.2 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,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 If we get back something like NFS4ERR_OLD_STATEID, that will be translated into -EAGAIN, and the do/while loop in send_layoutget will drive the call again. This is not quite what we want, I think. An error like that is a sign that something has changed. That something could have been a concurrent LAYOUTGET that would give us a usable lseg. Lift the retry logic into pnfs_update_layout instead. That allows us to redo the layout search, and may spare us from having to issue an RPC. Signed-off-by: Jeff Layton --- fs/nfs/pnfs.c | 67 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 5f6ed295acb5..ed3ab3e81f38 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -839,7 +839,6 @@ send_layoutget(struct pnfs_layout_hdr *lo, struct inode *ino = lo->plh_inode; struct nfs_server *server = NFS_SERVER(ino); struct nfs4_layoutget *lgp; - struct pnfs_layout_segment *lseg; loff_t i_size; dprintk("--> %s\n", __func__); @@ -849,42 +848,30 @@ send_layoutget(struct pnfs_layout_hdr *lo, * store in lseg. If we race with a concurrent seqid morphing * op, then re-send the LAYOUTGET. */ - do { - lgp = kzalloc(sizeof(*lgp), gfp_flags); - if (lgp == NULL) - return NULL; - - i_size = i_size_read(ino); - - lgp->args.minlength = PAGE_SIZE; - if (lgp->args.minlength > range->length) - lgp->args.minlength = range->length; - if (range->iomode == IOMODE_READ) { - if (range->offset >= i_size) - lgp->args.minlength = 0; - else if (i_size - range->offset < lgp->args.minlength) - lgp->args.minlength = i_size - range->offset; - } - lgp->args.maxcount = PNFS_LAYOUT_MAXSIZE; - pnfs_copy_range(&lgp->args.range, range); - lgp->args.type = server->pnfs_curr_ld->id; - lgp->args.inode = ino; - lgp->args.ctx = get_nfs_open_context(ctx); - lgp->gfp_flags = gfp_flags; - lgp->cred = lo->plh_lc_cred; + lgp = kzalloc(sizeof(*lgp), gfp_flags); + if (lgp == NULL) + return NULL; - lseg = nfs4_proc_layoutget(lgp, gfp_flags); - } while (lseg == ERR_PTR(-EAGAIN)); + i_size = i_size_read(ino); - if (IS_ERR(lseg)) { - if (!nfs_error_is_fatal(PTR_ERR(lseg))) - lseg = NULL; - } else { - pnfs_layout_clear_fail_bit(lo, - pnfs_iomode_to_fail_bit(range->iomode)); + lgp->args.minlength = PAGE_SIZE; + if (lgp->args.minlength > range->length) + lgp->args.minlength = range->length; + if (range->iomode == IOMODE_READ) { + if (range->offset >= i_size) + lgp->args.minlength = 0; + else if (i_size - range->offset < lgp->args.minlength) + lgp->args.minlength = i_size - range->offset; } + lgp->args.maxcount = PNFS_LAYOUT_MAXSIZE; + pnfs_copy_range(&lgp->args.range, range); + lgp->args.type = server->pnfs_curr_ld->id; + lgp->args.inode = ino; + lgp->args.ctx = get_nfs_open_context(ctx); + lgp->gfp_flags = gfp_flags; + lgp->cred = lo->plh_lc_cred; - return lseg; + return nfs4_proc_layoutget(lgp, gfp_flags); } static void pnfs_clear_layoutcommit(struct inode *inode, @@ -1646,6 +1633,20 @@ lookup_again: arg.length = PAGE_ALIGN(arg.length); lseg = send_layoutget(lo, ctx, &arg, gfp_flags); + if (IS_ERR(lseg)) { + if (lseg == ERR_PTR(-EAGAIN)) { + if (first) + pnfs_clear_first_layoutget(lo); + pnfs_put_layout_hdr(lo); + goto lookup_again; + } + + if (!nfs_error_is_fatal(PTR_ERR(lseg))) + lseg = NULL; + } else { + pnfs_layout_clear_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode)); + } + atomic_dec(&lo->plh_outstanding); trace_pnfs_update_layout(ino, pos, count, iomode, lo, PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET);