From patchwork Mon Jan 4 18:21:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 7949871 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id DE61CBEEE5 for ; Mon, 4 Jan 2016 18:21:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id ED5AC202B8 for ; Mon, 4 Jan 2016 18:21:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 01484202BE for ; Mon, 4 Jan 2016 18:21:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751569AbcADSVs (ORCPT ); Mon, 4 Jan 2016 13:21:48 -0500 Received: from mail-io0-f177.google.com ([209.85.223.177]:36467 "EHLO mail-io0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751989AbcADSVr (ORCPT ); Mon, 4 Jan 2016 13:21:47 -0500 Received: by mail-io0-f177.google.com with SMTP id o67so442617000iof.3 for ; Mon, 04 Jan 2016 10:21:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=primarydata-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=oaSFNEa3f1oIhyU1Q6gunIzqCqrlMBpeGLvUK/KhYps=; b=dIKANdV4gfGHMnCSmiVpPf17F/kUbNrzydzQC8GVMCYp15Z56MtXEZ62Cs8Z5d7wSj 8W3gLNG49NCwohKKMsdvLoN7MGnEneWv4kmpH8L3na9S//TQOpcbQbO9vG1bM0yZlu6/ u61/dhDMDjNeEC2ehJtWuSEajTCrjTwcbDPQxC2vm9MWzftzUuhqmUg0KUmQRg6U9HOH dN3r46/qC1B8XM4CsE9qHz7cUy9SvxwkbjDz1BxJwfXppDfgnftkqDlScP3pHmX6mcsY glf2o5i9ls/Qs9KE4D4aUL8F0h/4++z+Yb1/jBMkRraHWhG1/vbirxNbhWSfjTTwH21v Gvgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=oaSFNEa3f1oIhyU1Q6gunIzqCqrlMBpeGLvUK/KhYps=; b=G6jLjosMom/73wEi7/dLXZQZgkOyF9Ca/ag8q1h2DJQvO+fwFAD6CLcqmj+yKoYzJj dbHNZUW82YSCExK47Y4eb/dPhMpVYjAOYeE/S7JllsUKtd/C9OeeXSODNada4zn3wN4r +V+Kxqdzwuhn7hIx/b+jhGGdn6ALg2Q6Yn2KTZjhlhOhXjU5HuDAi8aQZUWpI2mRvmBd 8Ep0MPU32n5SZiQozxmN/j9v+wzm0mszMEC1dh5si+3Cu7bVzpPwxqFu1LQz36WTaLDY xXEYsmwR3ib39FJKdukHiAMfzqTRtWwzpsmyNO0Kb3/gfRQDwmAKQdmc9Rl83twFBHNA xf+g== X-Gm-Message-State: ALoCoQnC65rsx4Lb+rMvEdPL0dIF11jHtCz0Q10b3PNJhSWq1OXbncMAUQfAyWDPjzOm13IgbgRwKmGvEKnBz8I3/DuntoE1eQ== X-Received: by 10.107.8.20 with SMTP id 20mr91410297ioi.34.1451931706606; Mon, 04 Jan 2016 10:21:46 -0800 (PST) Received: from leira.trondhjem.org.localdomain (c-68-49-164-203.hsd1.mi.comcast.net. [68.49.164.203]) by smtp.gmail.com with ESMTPSA id n6sm12760568ige.12.2016.01.04.10.21.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Jan 2016 10:21:46 -0800 (PST) From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH v3 03/18] pNFS: If we have to delay the layout callback, mark the layout for return Date: Mon, 4 Jan 2016 13:21:01 -0500 Message-Id: <1451931676-68481-3-git-send-email-trond.myklebust@primarydata.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1451931676-68481-2-git-send-email-trond.myklebust@primarydata.com> References: <1451931676-68481-1-git-send-email-trond.myklebust@primarydata.com> <1451931676-68481-2-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=-6.8 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 the client needs to delay the layout callback, then speed up the recall process by marking the remaining layout segments to be actively returned by the client. Signed-off-by: Trond Myklebust --- fs/nfs/callback_proc.c | 14 ++++++++++++-- fs/nfs/pnfs.c | 4 +++- fs/nfs/pnfs.h | 3 +++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index 716cbff24450..34852ece4057 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c @@ -181,9 +181,19 @@ static u32 initiate_file_draining(struct nfs_client *clp, pnfs_layoutcommit_inode(ino, false); spin_lock(&ino->i_lock); - if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) || - pnfs_mark_matching_lsegs_invalid(lo, &free_me_list, + /* + * Enforce RFC5661 Section 12.5.5.2.1.5 (Bulk Recall and Return) + */ + if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { + rv = NFS4ERR_DELAY; + goto unlock; + } + + if (pnfs_mark_matching_lsegs_invalid(lo, &free_me_list, &args->cbl_range)) { + pnfs_mark_matching_lsegs_return(lo, + &free_me_list, + &args->cbl_range); rv = NFS4ERR_DELAY; goto unlock; } diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index b3fb6bb02275..360fe95c97b5 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -1756,7 +1756,7 @@ out_forget_reply: goto out; } -static void +void pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo, struct list_head *tmp_list, struct pnfs_layout_range *return_range) @@ -1768,6 +1768,8 @@ pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo, if (list_empty(&lo->plh_segs)) return; + assert_spin_locked(&lo->plh_inode->i_lock); + list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list) if (should_free_lseg(&lseg->pls_range, return_range)) { dprintk("%s: marking lseg %p iomode %d " diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index be24a759b655..d93c2ebc0fd3 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -266,6 +266,9 @@ int pnfs_choose_layoutget_stateid(nfs4_stateid *dst, int pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo, struct list_head *tmp_list, struct pnfs_layout_range *recall_range); +void pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo, + struct list_head *tmp_list, + struct pnfs_layout_range *recall_range); bool pnfs_roc(struct inode *ino); void pnfs_roc_release(struct inode *ino); void pnfs_roc_set_barrier(struct inode *ino, u32 barrier);