mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
NFSD add ca_source_server<> to COPY
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>
This commit is contained in:
parent
af76fc6c15
commit
84e1b21d5e
|
|
@ -40,6 +40,7 @@
|
||||||
#include <linux/utsname.h>
|
#include <linux/utsname.h>
|
||||||
#include <linux/pagemap.h>
|
#include <linux/pagemap.h>
|
||||||
#include <linux/sunrpc/svcauth_gss.h>
|
#include <linux/sunrpc/svcauth_gss.h>
|
||||||
|
#include <linux/sunrpc/addr.h>
|
||||||
|
|
||||||
#include "idmap.h"
|
#include "idmap.h"
|
||||||
#include "acl.h"
|
#include "acl.h"
|
||||||
|
|
@ -1744,10 +1745,47 @@ nfsd4_decode_clone(struct nfsd4_compoundargs *argp, struct nfsd4_clone *clone)
|
||||||
DECODE_TAIL;
|
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
|
static __be32
|
||||||
nfsd4_decode_copy(struct nfsd4_compoundargs *argp, struct nfsd4_copy *copy)
|
nfsd4_decode_copy(struct nfsd4_compoundargs *argp, struct nfsd4_copy *copy)
|
||||||
{
|
{
|
||||||
DECODE_HEAD;
|
DECODE_HEAD;
|
||||||
|
struct nl4_server *ns_dummy;
|
||||||
|
int i, count;
|
||||||
|
|
||||||
status = nfsd4_decode_stateid(argp, ©->cp_src_stateid);
|
status = nfsd4_decode_stateid(argp, ©->cp_src_stateid);
|
||||||
if (status)
|
if (status)
|
||||||
|
|
@ -1762,7 +1800,32 @@ nfsd4_decode_copy(struct nfsd4_compoundargs *argp, struct nfsd4_copy *copy)
|
||||||
p = xdr_decode_hyper(p, ©->cp_count);
|
p = xdr_decode_hyper(p, ©->cp_count);
|
||||||
p++; /* ca_consecutive: we always do consecutive copies */
|
p++; /* ca_consecutive: we always do consecutive copies */
|
||||||
copy->cp_synchronous = be32_to_cpup(p++);
|
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;
|
DECODE_TAIL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -518,11 +518,13 @@ struct nfsd42_write_res {
|
||||||
|
|
||||||
struct nfsd4_copy {
|
struct nfsd4_copy {
|
||||||
/* request */
|
/* request */
|
||||||
stateid_t cp_src_stateid;
|
stateid_t cp_src_stateid;
|
||||||
stateid_t cp_dst_stateid;
|
stateid_t cp_dst_stateid;
|
||||||
u64 cp_src_pos;
|
u64 cp_src_pos;
|
||||||
u64 cp_dst_pos;
|
u64 cp_dst_pos;
|
||||||
u64 cp_count;
|
u64 cp_count;
|
||||||
|
struct nl4_server cp_src;
|
||||||
|
bool cp_intra;
|
||||||
|
|
||||||
/* both */
|
/* both */
|
||||||
bool cp_synchronous;
|
bool cp_synchronous;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user