From: Olga Kornievskaia <olga.kornievskaia@gmail.com>
To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com,
bfields@redhat.com
Cc: linux-nfs@vger.kernel.org
Subject: [PATCH v6 12/19] NFSD add ca_source_server<> to COPY
Date: Fri, 6 Sep 2019 15:46:24 -0400 [thread overview]
Message-ID: <20190906194631.3216-13-olga.kornievskaia@gmail.com> (raw)
In-Reply-To: <20190906194631.3216-1-olga.kornievskaia@gmail.com>
Decode the ca_source_server list that's sent but only use the
first one. Presence of non-zero list indicates an "inter" copy.
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
---
fs/nfsd/nfs4xdr.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
fs/nfsd/xdr4.h | 12 ++++++-----
2 files changed, 69 insertions(+), 7 deletions(-)
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 4428118..4059a09 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -40,6 +40,7 @@
#include <linux/utsname.h>
#include <linux/pagemap.h>
#include <linux/sunrpc/svcauth_gss.h>
+#include <linux/sunrpc/addr.h>
#include "idmap.h"
#include "acl.h"
@@ -1732,11 +1733,47 @@ static __be32 nfsd4_decode_reclaim_complete(struct nfsd4_compoundargs *argp, str
DECODE_TAIL;
}
+static __be32 nfsd4_decode_nl4_server(struct nfsd4_compoundargs *argp,
+ struct nl4_server *ns)
+{
+ DECODE_HEAD;
+ struct nfs42_netaddr *naddr;
+
+ READ_BUF(4);
+ ns->nl4_type = be32_to_cpup(p++);
+
+ /* currently support for 1 inter-server source server */
+ switch (ns->nl4_type) {
+ case NL4_NETADDR:
+ naddr = &ns->u.nl4_addr;
+
+ READ_BUF(4);
+ naddr->netid_len = be32_to_cpup(p++);
+ if (naddr->netid_len > RPCBIND_MAXNETIDLEN)
+ goto xdr_error;
+
+ READ_BUF(naddr->netid_len + 4); /* 4 for uaddr len */
+ COPYMEM(naddr->netid, naddr->netid_len);
+
+ naddr->addr_len = be32_to_cpup(p++);
+ if (naddr->addr_len > RPCBIND_MAXUADDRLEN)
+ goto xdr_error;
+
+ READ_BUF(naddr->addr_len);
+ COPYMEM(naddr->addr, naddr->addr_len);
+ break;
+ default:
+ goto xdr_error;
+ }
+ DECODE_TAIL;
+}
+
static __be32
nfsd4_decode_copy(struct nfsd4_compoundargs *argp, struct nfsd4_copy *copy)
{
DECODE_HEAD;
- unsigned int tmp;
+ struct nl4_server *ns_dummy;
+ int i, count;
status = nfsd4_decode_stateid(argp, ©->cp_src_stateid);
if (status)
@@ -1751,8 +1788,31 @@ static __be32 nfsd4_decode_reclaim_complete(struct nfsd4_compoundargs *argp, str
p = xdr_decode_hyper(p, ©->cp_count);
p++; /* ca_consecutive: we always do consecutive copies */
copy->cp_synchronous = be32_to_cpup(p++);
- tmp = be32_to_cpup(p); /* Source server list not supported */
+ count = be32_to_cpup(p++);
+
+ copy->cp_intra = false;
+ if (count == 0) { /* intra-server copy */
+ copy->cp_intra = true;
+ goto intra;
+ }
+ /* decode all the supplied server addresses but use first */
+ status = nfsd4_decode_nl4_server(argp, ©->cp_src);
+ if (status)
+ return status;
+
+ ns_dummy = kmalloc(sizeof(struct nl4_server), GFP_KERNEL);
+ if (ns_dummy == NULL)
+ return nfserrno(-ENOMEM);
+ for (i = 0; i < count - 1; i++) {
+ status = nfsd4_decode_nl4_server(argp, ns_dummy);
+ if (status) {
+ kfree(ns_dummy);
+ return status;
+ }
+ }
+ kfree(ns_dummy);
+intra:
DECODE_TAIL;
}
diff --git a/fs/nfsd/xdr4.h b/fs/nfsd/xdr4.h
index d64c870..dedc316 100644
--- a/fs/nfsd/xdr4.h
+++ b/fs/nfsd/xdr4.h
@@ -519,11 +519,13 @@ struct nfsd42_write_res {
struct nfsd4_copy {
/* request */
- stateid_t cp_src_stateid;
- stateid_t cp_dst_stateid;
- u64 cp_src_pos;
- u64 cp_dst_pos;
- u64 cp_count;
+ stateid_t cp_src_stateid;
+ stateid_t cp_dst_stateid;
+ u64 cp_src_pos;
+ u64 cp_dst_pos;
+ u64 cp_count;
+ struct nl4_server cp_src;
+ bool cp_intra;
/* both */
bool cp_synchronous;
--
1.8.3.1
next prev parent reply other threads:[~2019-09-06 19:46 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-06 19:46 [PATCH v6 00/19] client and server support for "inter" SSC copy Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 01/19] NFS NFSD: defining nl4_servers structure needed by both Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 02/19] NFS: add COPY_NOTIFY operation Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 03/19] NFS: add ca_source_server<> to COPY Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 04/19] NFS: also send OFFLOAD_CANCEL to source server Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 05/19] NFS: inter ssc open Olga Kornievskaia
2019-09-12 20:23 ` J. Bruce Fields
2019-09-12 22:51 ` Olga Kornievskaia
2019-09-13 0:29 ` J. Bruce Fields
2019-09-06 19:46 ` [PATCH v6 06/19] NFS: skip recovery of copy open on dest server Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 07/19] NFS: for "inter" copy treat ESTALE as ENOTSUPP Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 08/19] NFS: COPY handle ERR_OFFLOAD_DENIED Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 09/19] NFS: handle source server reboot Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 10/19] NFS: replace cross device check in copy_file_range Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 11/19] NFSD fill-in netloc4 structure Olga Kornievskaia
2019-09-06 19:46 ` Olga Kornievskaia [this message]
2019-09-06 19:46 ` [PATCH v6 13/19] NFSD return nfs4_stid in nfs4_preprocess_stateid_op Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 14/19] NFSD COPY_NOTIFY xdr Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 15/19] NFSD add COPY_NOTIFY operation Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 16/19] NFSD check stateids against copy stateids Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 17/19] NFSD generalize nfsd4_compound_state flag names Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 18/19] NFSD: allow inter server COPY to have a STALE source server fh Olga Kornievskaia
2019-09-06 19:46 ` [PATCH v6 19/19] NFSD add nfs4 inter ssc to nfsd4_copy Olga Kornievskaia
2019-09-06 20:27 ` [PATCH v6 00/19] client and server support for "inter" SSC copy Olga Kornievskaia
2019-09-12 20:26 ` J. Bruce Fields
2019-09-12 22:52 ` Olga Kornievskaia
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190906194631.3216-13-olga.kornievskaia@gmail.com \
--to=olga.kornievskaia@gmail.com \
--cc=anna.schumaker@netapp.com \
--cc=bfields@redhat.com \
--cc=linux-nfs@vger.kernel.org \
--cc=trond.myklebust@hammerspace.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).