Loading fs/nfsd/nfs4proc.c +28 −0 Original line number Diff line number Diff line Loading @@ -1339,6 +1339,13 @@ nfsd4_offload_cancel(struct svc_rqst *rqstp, return status; } static __be32 nfsd4_copy_notify(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, union nfsd4_op_u *u) { return nfserr_notsupp; } static __be32 nfsd4_fallocate(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_fallocate *fallocate, int flags) Loading Loading @@ -2292,6 +2299,21 @@ static inline u32 nfsd4_offload_status_rsize(struct svc_rqst *rqstp, 1 /* osr_complete<1> optional 0 for now */) * sizeof(__be32); } static inline u32 nfsd4_copy_notify_rsize(struct svc_rqst *rqstp, struct nfsd4_op *op) { return (op_encode_hdr_size + 3 /* cnr_lease_time */ + 1 /* We support one cnr_source_server */ + 1 /* cnr_stateid seq */ + op_encode_stateid_maxsz /* cnr_stateid */ + 1 /* num cnr_source_server*/ + 1 /* nl4_type */ + 1 /* nl4 size */ + XDR_QUADLEN(NFS4_OPAQUE_LIMIT) /*nl4_loc + nl4_loc_sz */) * sizeof(__be32); } #ifdef CONFIG_NFSD_PNFS static inline u32 nfsd4_getdeviceinfo_rsize(struct svc_rqst *rqstp, struct nfsd4_op *op) { Loading Loading @@ -2716,6 +2738,12 @@ static const struct nfsd4_operation nfsd4_ops[] = { .op_name = "OP_OFFLOAD_CANCEL", .op_rsize_bop = nfsd4_only_status_rsize, }, [OP_COPY_NOTIFY] = { .op_func = nfsd4_copy_notify, .op_flags = OP_MODIFIES_SOMETHING, .op_name = "OP_COPY_NOTIFY", .op_rsize_bop = nfsd4_copy_notify_rsize, }, }; /** Loading fs/nfsd/nfs4xdr.c +88 −2 Original line number Diff line number Diff line Loading @@ -1837,6 +1837,18 @@ nfsd4_decode_offload_status(struct nfsd4_compoundargs *argp, return nfsd4_decode_stateid(argp, &os->stateid); } static __be32 nfsd4_decode_copy_notify(struct nfsd4_compoundargs *argp, struct nfsd4_copy_notify *cn) { int status; status = nfsd4_decode_stateid(argp, &cn->cpn_src_stateid); if (status) return status; return nfsd4_decode_nl4_server(argp, &cn->cpn_dst); } static __be32 nfsd4_decode_seek(struct nfsd4_compoundargs *argp, struct nfsd4_seek *seek) { Loading Loading @@ -1938,7 +1950,7 @@ static const nfsd4_dec nfsd4_dec_ops[] = { /* new operations for NFSv4.2 */ [OP_ALLOCATE] = (nfsd4_dec)nfsd4_decode_fallocate, [OP_COPY] = (nfsd4_dec)nfsd4_decode_copy, [OP_COPY_NOTIFY] = (nfsd4_dec)nfsd4_decode_notsupp, [OP_COPY_NOTIFY] = (nfsd4_dec)nfsd4_decode_copy_notify, [OP_DEALLOCATE] = (nfsd4_dec)nfsd4_decode_fallocate, [OP_IO_ADVISE] = (nfsd4_dec)nfsd4_decode_notsupp, [OP_LAYOUTERROR] = (nfsd4_dec)nfsd4_decode_notsupp, Loading Loading @@ -4306,6 +4318,46 @@ nfsd42_encode_write_res(struct nfsd4_compoundres *resp, return nfs_ok; } static __be32 nfsd42_encode_nl4_server(struct nfsd4_compoundres *resp, struct nl4_server *ns) { struct xdr_stream *xdr = &resp->xdr; struct nfs42_netaddr *addr; __be32 *p; p = xdr_reserve_space(xdr, 4); *p++ = cpu_to_be32(ns->nl4_type); switch (ns->nl4_type) { case NL4_NETADDR: addr = &ns->u.nl4_addr; /* netid_len, netid, uaddr_len, uaddr (port included * in RPCBIND_MAXUADDRLEN) */ p = xdr_reserve_space(xdr, 4 /* netid len */ + (XDR_QUADLEN(addr->netid_len) * 4) + 4 /* uaddr len */ + (XDR_QUADLEN(addr->addr_len) * 4)); if (!p) return nfserr_resource; *p++ = cpu_to_be32(addr->netid_len); p = xdr_encode_opaque_fixed(p, addr->netid, addr->netid_len); *p++ = cpu_to_be32(addr->addr_len); p = xdr_encode_opaque_fixed(p, addr->addr, addr->addr_len); break; default: WARN_ON_ONCE(ns->nl4_type != NL4_NETADDR); return nfserr_inval; } return 0; } static __be32 nfsd4_encode_copy(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_copy *copy) Loading Loading @@ -4339,6 +4391,40 @@ nfsd4_encode_offload_status(struct nfsd4_compoundres *resp, __be32 nfserr, return nfserr; } static __be32 nfsd4_encode_copy_notify(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_copy_notify *cn) { struct xdr_stream *xdr = &resp->xdr; __be32 *p; if (nfserr) return nfserr; /* 8 sec, 4 nsec */ p = xdr_reserve_space(xdr, 12); if (!p) return nfserr_resource; /* cnr_lease_time */ p = xdr_encode_hyper(p, cn->cpn_sec); *p++ = cpu_to_be32(cn->cpn_nsec); /* cnr_stateid */ nfserr = nfsd4_encode_stateid(xdr, &cn->cpn_cnr_stateid); if (nfserr) return nfserr; /* cnr_src.nl_nsvr */ p = xdr_reserve_space(xdr, 4); if (!p) return nfserr_resource; *p++ = cpu_to_be32(1); return nfsd42_encode_nl4_server(resp, &cn->cpn_src); } static __be32 nfsd4_encode_seek(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_seek *seek) Loading Loading @@ -4436,7 +4522,7 @@ static const nfsd4_enc nfsd4_enc_ops[] = { /* NFSv4.2 operations */ [OP_ALLOCATE] = (nfsd4_enc)nfsd4_encode_noop, [OP_COPY] = (nfsd4_enc)nfsd4_encode_copy, [OP_COPY_NOTIFY] = (nfsd4_enc)nfsd4_encode_noop, [OP_COPY_NOTIFY] = (nfsd4_enc)nfsd4_encode_copy_notify, [OP_DEALLOCATE] = (nfsd4_enc)nfsd4_encode_noop, [OP_IO_ADVISE] = (nfsd4_enc)nfsd4_encode_noop, [OP_LAYOUTERROR] = (nfsd4_enc)nfsd4_encode_noop, Loading fs/nfsd/xdr4.h +13 −0 Original line number Diff line number Diff line Loading @@ -570,6 +570,18 @@ struct nfsd4_offload_status { u32 status; }; struct nfsd4_copy_notify { /* request */ stateid_t cpn_src_stateid; struct nl4_server cpn_dst; /* response */ stateid_t cpn_cnr_stateid; u64 cpn_sec; u32 cpn_nsec; struct nl4_server cpn_src; }; struct nfsd4_op { int opnum; const struct nfsd4_operation * opdesc; Loading Loading @@ -629,6 +641,7 @@ struct nfsd4_op { struct nfsd4_clone clone; struct nfsd4_copy copy; struct nfsd4_offload_status offload_status; struct nfsd4_copy_notify copy_notify; struct nfsd4_seek seek; } u; struct nfs4_replay * replay; Loading Loading
fs/nfsd/nfs4proc.c +28 −0 Original line number Diff line number Diff line Loading @@ -1339,6 +1339,13 @@ nfsd4_offload_cancel(struct svc_rqst *rqstp, return status; } static __be32 nfsd4_copy_notify(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, union nfsd4_op_u *u) { return nfserr_notsupp; } static __be32 nfsd4_fallocate(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_fallocate *fallocate, int flags) Loading Loading @@ -2292,6 +2299,21 @@ static inline u32 nfsd4_offload_status_rsize(struct svc_rqst *rqstp, 1 /* osr_complete<1> optional 0 for now */) * sizeof(__be32); } static inline u32 nfsd4_copy_notify_rsize(struct svc_rqst *rqstp, struct nfsd4_op *op) { return (op_encode_hdr_size + 3 /* cnr_lease_time */ + 1 /* We support one cnr_source_server */ + 1 /* cnr_stateid seq */ + op_encode_stateid_maxsz /* cnr_stateid */ + 1 /* num cnr_source_server*/ + 1 /* nl4_type */ + 1 /* nl4 size */ + XDR_QUADLEN(NFS4_OPAQUE_LIMIT) /*nl4_loc + nl4_loc_sz */) * sizeof(__be32); } #ifdef CONFIG_NFSD_PNFS static inline u32 nfsd4_getdeviceinfo_rsize(struct svc_rqst *rqstp, struct nfsd4_op *op) { Loading Loading @@ -2716,6 +2738,12 @@ static const struct nfsd4_operation nfsd4_ops[] = { .op_name = "OP_OFFLOAD_CANCEL", .op_rsize_bop = nfsd4_only_status_rsize, }, [OP_COPY_NOTIFY] = { .op_func = nfsd4_copy_notify, .op_flags = OP_MODIFIES_SOMETHING, .op_name = "OP_COPY_NOTIFY", .op_rsize_bop = nfsd4_copy_notify_rsize, }, }; /** Loading
fs/nfsd/nfs4xdr.c +88 −2 Original line number Diff line number Diff line Loading @@ -1837,6 +1837,18 @@ nfsd4_decode_offload_status(struct nfsd4_compoundargs *argp, return nfsd4_decode_stateid(argp, &os->stateid); } static __be32 nfsd4_decode_copy_notify(struct nfsd4_compoundargs *argp, struct nfsd4_copy_notify *cn) { int status; status = nfsd4_decode_stateid(argp, &cn->cpn_src_stateid); if (status) return status; return nfsd4_decode_nl4_server(argp, &cn->cpn_dst); } static __be32 nfsd4_decode_seek(struct nfsd4_compoundargs *argp, struct nfsd4_seek *seek) { Loading Loading @@ -1938,7 +1950,7 @@ static const nfsd4_dec nfsd4_dec_ops[] = { /* new operations for NFSv4.2 */ [OP_ALLOCATE] = (nfsd4_dec)nfsd4_decode_fallocate, [OP_COPY] = (nfsd4_dec)nfsd4_decode_copy, [OP_COPY_NOTIFY] = (nfsd4_dec)nfsd4_decode_notsupp, [OP_COPY_NOTIFY] = (nfsd4_dec)nfsd4_decode_copy_notify, [OP_DEALLOCATE] = (nfsd4_dec)nfsd4_decode_fallocate, [OP_IO_ADVISE] = (nfsd4_dec)nfsd4_decode_notsupp, [OP_LAYOUTERROR] = (nfsd4_dec)nfsd4_decode_notsupp, Loading Loading @@ -4306,6 +4318,46 @@ nfsd42_encode_write_res(struct nfsd4_compoundres *resp, return nfs_ok; } static __be32 nfsd42_encode_nl4_server(struct nfsd4_compoundres *resp, struct nl4_server *ns) { struct xdr_stream *xdr = &resp->xdr; struct nfs42_netaddr *addr; __be32 *p; p = xdr_reserve_space(xdr, 4); *p++ = cpu_to_be32(ns->nl4_type); switch (ns->nl4_type) { case NL4_NETADDR: addr = &ns->u.nl4_addr; /* netid_len, netid, uaddr_len, uaddr (port included * in RPCBIND_MAXUADDRLEN) */ p = xdr_reserve_space(xdr, 4 /* netid len */ + (XDR_QUADLEN(addr->netid_len) * 4) + 4 /* uaddr len */ + (XDR_QUADLEN(addr->addr_len) * 4)); if (!p) return nfserr_resource; *p++ = cpu_to_be32(addr->netid_len); p = xdr_encode_opaque_fixed(p, addr->netid, addr->netid_len); *p++ = cpu_to_be32(addr->addr_len); p = xdr_encode_opaque_fixed(p, addr->addr, addr->addr_len); break; default: WARN_ON_ONCE(ns->nl4_type != NL4_NETADDR); return nfserr_inval; } return 0; } static __be32 nfsd4_encode_copy(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_copy *copy) Loading Loading @@ -4339,6 +4391,40 @@ nfsd4_encode_offload_status(struct nfsd4_compoundres *resp, __be32 nfserr, return nfserr; } static __be32 nfsd4_encode_copy_notify(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_copy_notify *cn) { struct xdr_stream *xdr = &resp->xdr; __be32 *p; if (nfserr) return nfserr; /* 8 sec, 4 nsec */ p = xdr_reserve_space(xdr, 12); if (!p) return nfserr_resource; /* cnr_lease_time */ p = xdr_encode_hyper(p, cn->cpn_sec); *p++ = cpu_to_be32(cn->cpn_nsec); /* cnr_stateid */ nfserr = nfsd4_encode_stateid(xdr, &cn->cpn_cnr_stateid); if (nfserr) return nfserr; /* cnr_src.nl_nsvr */ p = xdr_reserve_space(xdr, 4); if (!p) return nfserr_resource; *p++ = cpu_to_be32(1); return nfsd42_encode_nl4_server(resp, &cn->cpn_src); } static __be32 nfsd4_encode_seek(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_seek *seek) Loading Loading @@ -4436,7 +4522,7 @@ static const nfsd4_enc nfsd4_enc_ops[] = { /* NFSv4.2 operations */ [OP_ALLOCATE] = (nfsd4_enc)nfsd4_encode_noop, [OP_COPY] = (nfsd4_enc)nfsd4_encode_copy, [OP_COPY_NOTIFY] = (nfsd4_enc)nfsd4_encode_noop, [OP_COPY_NOTIFY] = (nfsd4_enc)nfsd4_encode_copy_notify, [OP_DEALLOCATE] = (nfsd4_enc)nfsd4_encode_noop, [OP_IO_ADVISE] = (nfsd4_enc)nfsd4_encode_noop, [OP_LAYOUTERROR] = (nfsd4_enc)nfsd4_encode_noop, Loading
fs/nfsd/xdr4.h +13 −0 Original line number Diff line number Diff line Loading @@ -570,6 +570,18 @@ struct nfsd4_offload_status { u32 status; }; struct nfsd4_copy_notify { /* request */ stateid_t cpn_src_stateid; struct nl4_server cpn_dst; /* response */ stateid_t cpn_cnr_stateid; u64 cpn_sec; u32 cpn_nsec; struct nl4_server cpn_src; }; struct nfsd4_op { int opnum; const struct nfsd4_operation * opdesc; Loading Loading @@ -629,6 +641,7 @@ struct nfsd4_op { struct nfsd4_clone clone; struct nfsd4_copy copy; struct nfsd4_offload_status offload_status; struct nfsd4_copy_notify copy_notify; struct nfsd4_seek seek; } u; struct nfs4_replay * replay; Loading