@@ -1837,6 +1837,18 @@ nfsd4_decode_offload_status(struct nfsd4_compoundargs *argp,
1837
1837
return nfsd4_decode_stateid (argp , & os -> stateid );
1838
1838
}
1839
1839
1840
+ static __be32
1841
+ nfsd4_decode_copy_notify (struct nfsd4_compoundargs * argp ,
1842
+ struct nfsd4_copy_notify * cn )
1843
+ {
1844
+ int status ;
1845
+
1846
+ status = nfsd4_decode_stateid (argp , & cn -> cpn_src_stateid );
1847
+ if (status )
1848
+ return status ;
1849
+ return nfsd4_decode_nl4_server (argp , & cn -> cpn_dst );
1850
+ }
1851
+
1840
1852
static __be32
1841
1853
nfsd4_decode_seek (struct nfsd4_compoundargs * argp , struct nfsd4_seek * seek )
1842
1854
{
@@ -1938,7 +1950,7 @@ static const nfsd4_dec nfsd4_dec_ops[] = {
1938
1950
/* new operations for NFSv4.2 */
1939
1951
[OP_ALLOCATE ] = (nfsd4_dec )nfsd4_decode_fallocate ,
1940
1952
[OP_COPY ] = (nfsd4_dec )nfsd4_decode_copy ,
1941
- [OP_COPY_NOTIFY ] = (nfsd4_dec )nfsd4_decode_notsupp ,
1953
+ [OP_COPY_NOTIFY ] = (nfsd4_dec )nfsd4_decode_copy_notify ,
1942
1954
[OP_DEALLOCATE ] = (nfsd4_dec )nfsd4_decode_fallocate ,
1943
1955
[OP_IO_ADVISE ] = (nfsd4_dec )nfsd4_decode_notsupp ,
1944
1956
[OP_LAYOUTERROR ] = (nfsd4_dec )nfsd4_decode_notsupp ,
@@ -4306,6 +4318,46 @@ nfsd42_encode_write_res(struct nfsd4_compoundres *resp,
4306
4318
return nfs_ok ;
4307
4319
}
4308
4320
4321
+ static __be32
4322
+ nfsd42_encode_nl4_server (struct nfsd4_compoundres * resp , struct nl4_server * ns )
4323
+ {
4324
+ struct xdr_stream * xdr = & resp -> xdr ;
4325
+ struct nfs42_netaddr * addr ;
4326
+ __be32 * p ;
4327
+
4328
+ p = xdr_reserve_space (xdr , 4 );
4329
+ * p ++ = cpu_to_be32 (ns -> nl4_type );
4330
+
4331
+ switch (ns -> nl4_type ) {
4332
+ case NL4_NETADDR :
4333
+ addr = & ns -> u .nl4_addr ;
4334
+
4335
+ /* netid_len, netid, uaddr_len, uaddr (port included
4336
+ * in RPCBIND_MAXUADDRLEN)
4337
+ */
4338
+ p = xdr_reserve_space (xdr ,
4339
+ 4 /* netid len */ +
4340
+ (XDR_QUADLEN (addr -> netid_len ) * 4 ) +
4341
+ 4 /* uaddr len */ +
4342
+ (XDR_QUADLEN (addr -> addr_len ) * 4 ));
4343
+ if (!p )
4344
+ return nfserr_resource ;
4345
+
4346
+ * p ++ = cpu_to_be32 (addr -> netid_len );
4347
+ p = xdr_encode_opaque_fixed (p , addr -> netid ,
4348
+ addr -> netid_len );
4349
+ * p ++ = cpu_to_be32 (addr -> addr_len );
4350
+ p = xdr_encode_opaque_fixed (p , addr -> addr ,
4351
+ addr -> addr_len );
4352
+ break ;
4353
+ default :
4354
+ WARN_ON_ONCE (ns -> nl4_type != NL4_NETADDR );
4355
+ return nfserr_inval ;
4356
+ }
4357
+
4358
+ return 0 ;
4359
+ }
4360
+
4309
4361
static __be32
4310
4362
nfsd4_encode_copy (struct nfsd4_compoundres * resp , __be32 nfserr ,
4311
4363
struct nfsd4_copy * copy )
@@ -4339,6 +4391,40 @@ nfsd4_encode_offload_status(struct nfsd4_compoundres *resp, __be32 nfserr,
4339
4391
return nfserr ;
4340
4392
}
4341
4393
4394
+ static __be32
4395
+ nfsd4_encode_copy_notify (struct nfsd4_compoundres * resp , __be32 nfserr ,
4396
+ struct nfsd4_copy_notify * cn )
4397
+ {
4398
+ struct xdr_stream * xdr = & resp -> xdr ;
4399
+ __be32 * p ;
4400
+
4401
+ if (nfserr )
4402
+ return nfserr ;
4403
+
4404
+ /* 8 sec, 4 nsec */
4405
+ p = xdr_reserve_space (xdr , 12 );
4406
+ if (!p )
4407
+ return nfserr_resource ;
4408
+
4409
+ /* cnr_lease_time */
4410
+ p = xdr_encode_hyper (p , cn -> cpn_sec );
4411
+ * p ++ = cpu_to_be32 (cn -> cpn_nsec );
4412
+
4413
+ /* cnr_stateid */
4414
+ nfserr = nfsd4_encode_stateid (xdr , & cn -> cpn_cnr_stateid );
4415
+ if (nfserr )
4416
+ return nfserr ;
4417
+
4418
+ /* cnr_src.nl_nsvr */
4419
+ p = xdr_reserve_space (xdr , 4 );
4420
+ if (!p )
4421
+ return nfserr_resource ;
4422
+
4423
+ * p ++ = cpu_to_be32 (1 );
4424
+
4425
+ return nfsd42_encode_nl4_server (resp , & cn -> cpn_src );
4426
+ }
4427
+
4342
4428
static __be32
4343
4429
nfsd4_encode_seek (struct nfsd4_compoundres * resp , __be32 nfserr ,
4344
4430
struct nfsd4_seek * seek )
@@ -4436,7 +4522,7 @@ static const nfsd4_enc nfsd4_enc_ops[] = {
4436
4522
/* NFSv4.2 operations */
4437
4523
[OP_ALLOCATE ] = (nfsd4_enc )nfsd4_encode_noop ,
4438
4524
[OP_COPY ] = (nfsd4_enc )nfsd4_encode_copy ,
4439
- [OP_COPY_NOTIFY ] = (nfsd4_enc )nfsd4_encode_noop ,
4525
+ [OP_COPY_NOTIFY ] = (nfsd4_enc )nfsd4_encode_copy_notify ,
4440
4526
[OP_DEALLOCATE ] = (nfsd4_enc )nfsd4_encode_noop ,
4441
4527
[OP_IO_ADVISE ] = (nfsd4_enc )nfsd4_encode_noop ,
4442
4528
[OP_LAYOUTERROR ] = (nfsd4_enc )nfsd4_encode_noop ,
0 commit comments