NFSD: Modify NFSv4 to use nfsd_read_splice_ok()
authorChuck Lever <chuck.lever@oracle.com>
Fri, 17 Nov 2023 22:14:40 +0000 (17:14 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Sun, 7 Jan 2024 22:54:25 +0000 (17:54 -0500)
Avoid the use of an atomic bitop, and prepare for adding a run-time
switch for using splice reads.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4xdr.c
fs/nfsd/xdr4.h

index 6f2d4aa4970d3a3d5a8f6cb4db50f7c918ba6e26..14712fa08f769ea37b78e51c3672366c4b6e8bf0 100644 (file)
@@ -970,8 +970,11 @@ nfsd4_read(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
         * To ensure proper ordering, we therefore turn off zero copy if
         * the client wants us to do more in this compound:
         */
-       if (!nfsd4_last_compound_op(rqstp))
-               clear_bit(RQ_SPLICE_OK, &rqstp->rq_flags);
+       if (!nfsd4_last_compound_op(rqstp)) {
+               struct nfsd4_compoundargs *argp = rqstp->rq_argp;
+
+               argp->splice_ok = false;
+       }
 
        /* check stateid */
        status = nfs4_preprocess_stateid_op(rqstp, cstate, &cstate->current_fh,
index b499fe9caa3209966e86db8fc919ee8567a7f8cc..c719c475a068efa4cb569720a36ffa9aabfc3c2f 100644 (file)
@@ -2524,8 +2524,9 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
        svc_reserve(argp->rqstp, max_reply + readbytes);
        argp->rqstp->rq_cachetype = cachethis ? RC_REPLBUFF : RC_NOCACHE;
 
+       argp->splice_ok = nfsd_read_splice_ok(argp->rqstp);
        if (readcount > 1 || max_reply > PAGE_SIZE - auth_slack)
-               clear_bit(RQ_SPLICE_OK, &argp->rqstp->rq_flags);
+               argp->splice_ok = false;
 
        return true;
 }
@@ -4375,12 +4376,13 @@ static __be32
 nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
                  union nfsd4_op_u *u)
 {
+       struct nfsd4_compoundargs *argp = resp->rqstp->rq_argp;
        struct nfsd4_read *read = &u->read;
-       bool splice_ok = test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags);
-       unsigned long maxcount;
        struct xdr_stream *xdr = resp->xdr;
-       struct file *file;
        int starting_len = xdr->buf->len;
+       bool splice_ok = argp->splice_ok;
+       unsigned long maxcount;
+       struct file *file;
        __be32 *p;
 
        if (nfserr)
@@ -5201,9 +5203,10 @@ static __be32
 nfsd4_encode_read_plus_data(struct nfsd4_compoundres *resp,
                            struct nfsd4_read *read)
 {
-       bool splice_ok = test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags);
+       struct nfsd4_compoundargs *argp = resp->rqstp->rq_argp;
        struct file *file = read->rd_nf->nf_file;
        struct xdr_stream *xdr = resp->xdr;
+       bool splice_ok = argp->splice_ok;
        unsigned long maxcount;
        __be32 nfserr, *p;
 
index 80e859dc84d8329c0d806b3c8fa37266d7a6ca18..415516c1b27e5d896f7f2f22bc680481b9d468ee 100644 (file)
@@ -840,6 +840,7 @@ struct nfsd4_compoundargs {
        u32                             minorversion;
        u32                             client_opcnt;
        u32                             opcnt;
+       bool                            splice_ok;
        struct nfsd4_op                 *ops;
        struct nfsd4_op                 iops[8];
 };