@@ -1837,6 +1837,18 @@ nfsd4_decode_offload_status(struct nfsd4_compoundargs *argp,
18371837 return nfsd4_decode_stateid (argp , & os -> stateid );
18381838}
18391839
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+
18401852static __be32
18411853nfsd4_decode_seek (struct nfsd4_compoundargs * argp , struct nfsd4_seek * seek )
18421854{
@@ -1938,7 +1950,7 @@ static const nfsd4_dec nfsd4_dec_ops[] = {
19381950 /* new operations for NFSv4.2 */
19391951 [OP_ALLOCATE ] = (nfsd4_dec )nfsd4_decode_fallocate ,
19401952 [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 ,
19421954 [OP_DEALLOCATE ] = (nfsd4_dec )nfsd4_decode_fallocate ,
19431955 [OP_IO_ADVISE ] = (nfsd4_dec )nfsd4_decode_notsupp ,
19441956 [OP_LAYOUTERROR ] = (nfsd4_dec )nfsd4_decode_notsupp ,
@@ -4306,6 +4318,46 @@ nfsd42_encode_write_res(struct nfsd4_compoundres *resp,
43064318 return nfs_ok ;
43074319}
43084320
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+
43094361static __be32
43104362nfsd4_encode_copy (struct nfsd4_compoundres * resp , __be32 nfserr ,
43114363 struct nfsd4_copy * copy )
@@ -4339,6 +4391,40 @@ nfsd4_encode_offload_status(struct nfsd4_compoundres *resp, __be32 nfserr,
43394391 return nfserr ;
43404392}
43414393
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+
43424428static __be32
43434429nfsd4_encode_seek (struct nfsd4_compoundres * resp , __be32 nfserr ,
43444430 struct nfsd4_seek * seek )
@@ -4436,7 +4522,7 @@ static const nfsd4_enc nfsd4_enc_ops[] = {
44364522 /* NFSv4.2 operations */
44374523 [OP_ALLOCATE ] = (nfsd4_enc )nfsd4_encode_noop ,
44384524 [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 ,
44404526 [OP_DEALLOCATE ] = (nfsd4_enc )nfsd4_encode_noop ,
44414527 [OP_IO_ADVISE ] = (nfsd4_enc )nfsd4_encode_noop ,
44424528 [OP_LAYOUTERROR ] = (nfsd4_enc )nfsd4_encode_noop ,
0 commit comments