From patchwork Thu Sep 28 17:28:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 9976437 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 91E3C6034B for ; Thu, 28 Sep 2017 17:28:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7A257296C1 for ; Thu, 28 Sep 2017 17:28:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6F096296CB; Thu, 28 Sep 2017 17:28:31 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 124BE296C1 for ; Thu, 28 Sep 2017 17:28:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752094AbdI1R23 (ORCPT ); Thu, 28 Sep 2017 13:28:29 -0400 Received: from mx142.netapp.com ([216.240.21.19]:63888 "EHLO mx142.netapp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752027AbdI1R2Y (ORCPT ); Thu, 28 Sep 2017 13:28:24 -0400 X-IronPort-AV: E=Sophos;i="5.42,450,1500966000"; d="scan'208";a="214025375" Received: from vmwexchts03-prd.hq.netapp.com ([10.122.105.31]) by mx142-out.netapp.com with ESMTP; 28 Sep 2017 10:01:22 -0700 Received: from smtp1.corp.netapp.com (10.122.76.128) by VMWEXCHTS03-PRD.hq.netapp.com (10.122.105.31) with Microsoft SMTP Server (TLS) id 15.0.1263.5; Thu, 28 Sep 2017 10:28:24 -0700 Received: from Olgas-MBP-107.vpn.netapp.com (olgas-mbp-107.vpn.netapp.com [10.55.75.185]) by smtp1.corp.netapp.com (8.14.9+Sun/8.13.1/NTAP-1.6) with ESMTP id v8SHSKBv002203; Thu, 28 Sep 2017 10:28:23 -0700 (PDT) From: Olga Kornievskaia To: , CC: Subject: [PATCH v4 04/12] NFS OFFLOAD_STATUS op Date: Thu, 28 Sep 2017 13:28:11 -0400 Message-ID: <20170928172819.50703-5-kolga@netapp.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20170928172819.50703-1-kolga@netapp.com> References: <20170928172819.50703-1-kolga@netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Olga Kornievskaia --- fs/nfs/nfs42.h | 5 ++++- fs/nfs/nfs42proc.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/fs/nfs/nfs42.h b/fs/nfs/nfs42.h index b6cd153..6b9decf 100644 --- a/fs/nfs/nfs42.h +++ b/fs/nfs/nfs42.h @@ -11,6 +11,7 @@ */ #define PNFS_LAYOUTSTATS_MAXDEV (4) +#if defined(CONFIG_NFS_V4_2) /* nfs4.2proc.c */ int nfs42_proc_allocate(struct file *, loff_t, loff_t); ssize_t nfs42_proc_copy(struct file *, loff_t, struct file *, loff_t, size_t); @@ -19,5 +20,7 @@ int nfs42_proc_layoutstats_generic(struct nfs_server *, struct nfs42_layoutstat_data *); int nfs42_proc_clone(struct file *, struct file *, loff_t, loff_t, loff_t); - +int nfs42_proc_offload_status(struct file *, nfs4_stateid *, + struct nfs42_offload_status_res *); +#endif /* CONFIG_NFS_V4_2) */ #endif /* __LINUX_FS_NFS_NFS4_2_H */ diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index 6c2db51..5c42e71 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c @@ -263,6 +263,48 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, return err; } +int _nfs42_proc_offload_status(struct file *dst, nfs4_stateid *stateid, + struct nfs42_offload_status_res *res) +{ + struct nfs42_offload_status_args args; + struct nfs_server *dst_server = NFS_SERVER(file_inode(dst)); + struct rpc_message msg = { + .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OFFLOAD_STATUS], + .rpc_resp = res, + .rpc_argp = &args, + }; + int status; + + args.osa_src_fh = NFS_FH(file_inode(dst)); + memcpy(&args.osa_stateid, stateid, sizeof(args.osa_stateid)); + status = nfs4_call_sync(dst_server->client, dst_server, &msg, + &args.osa_seq_args, &res->osr_seq_res, 0); + if (status == -ENOTSUPP) + dst_server->caps &= ~NFS_CAP_OFFLOAD_STATUS; + + return status; +} + +int nfs42_proc_offload_status(struct file *dst, nfs4_stateid *stateid, + struct nfs42_offload_status_res *res) +{ + struct nfs_server *dst_server = NFS_SERVER(file_inode(dst)); + struct nfs4_exception exception = { }; + int status; + + if (!(dst_server->caps & NFS_CAP_OFFLOAD_STATUS)) + return -EOPNOTSUPP; + + do { + status = _nfs42_proc_offload_status(dst, stateid, res); + if (status == -ENOTSUPP) + return -EOPNOTSUPP; + status = nfs4_handle_exception(dst_server, status, &exception); + } while (exception.retry); + + return status; +} + static loff_t _nfs42_proc_llseek(struct file *filep, struct nfs_lock_context *lock, loff_t offset, int whence) {