Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp2238512ybv; Fri, 14 Feb 2020 14:22:12 -0800 (PST) X-Google-Smtp-Source: APXvYqzFJIkGITbIwN8COkGOvLQ7W7OXx+8EUtm7zB5dnyCtbZ4pZy+JiD+bIPO7iOD8PX6kGjI0 X-Received: by 2002:aca:1a06:: with SMTP id a6mr3246926oia.148.1581718932078; Fri, 14 Feb 2020 14:22:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581718932; cv=none; d=google.com; s=arc-20160816; b=iCdTXgQ00Cf4anQlf7Dd5X1LYRAUyOx0Jm3A1RuT+6x1HMO6ZrAyeH6N/ShezXIWWP 6xdIjD0DY9YwKA7rm+ULlI/D+gnZ7NTZb67gGiw8EltTcPodJAUbIVEwNAgk6z0wDQ80 R7Z/7t4NV3XElfXcBCyOo0clYeEDHJDuu0YHr6B1b9RTkD5I4Cc7r+Eetneu5UM7bHUq NSXRFo9r70yL1X7Ho3859sY6BCW4CdJzVwtmSZALeCJFQnMPlUqKZ6NHu/aG/zbwPVI8 snurTu0au1HnvwswssO4oBK02smCSHCsq9rfNJgfU90Wx13L58ILLx3I92U4AitwvCIf qJKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:references:message-id :content-transfer-encoding:cc:date:in-reply-to:from:subject :mime-version:dkim-signature; bh=yYFo76qFz3KMj5aDdTrP1abf6VEjSGdEcr5JzwGt02k=; b=tfJBPG/AgNGcqbCLCntbEjAlRPzJSJB9BeXWwrvTZxAI2ycgsSuNjpBHXImky280Ad AHDEGw8naaTqaiiN6ywawU87/legT8Wv+E3D0Xt7XHhbMxBMEFUz/OM2fsd0fdMUw4YD gU3bixumnVs+MSr4ssz/21sh/HEpT0Z/cPG0MRQee6cw8AtrMaPKBRh7UGVSWjsyeMyt yPgjVJKBoDSmsPw8a+R2eQwFzW/5HH90nqC1NYLvcGkkNiM7lxyhsqQP7ckgo94O8rKi EhurB+bCkkYmZuq5VPVGQhxPxZnRbNhh2aAn+7IFoleoNRTnXjgSTCOaf9D86fJxvJNg eDvg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2020-01-29 header.b=dLDm9aTU; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 200si3301110oii.156.2020.02.14.14.21.52; Fri, 14 Feb 2020 14:22:12 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2020-01-29 header.b=dLDm9aTU; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727755AbgBNWUp (ORCPT + 99 others); Fri, 14 Feb 2020 17:20:45 -0500 Received: from aserp2120.oracle.com ([141.146.126.78]:44176 "EHLO aserp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727747AbgBNWUp (ORCPT ); Fri, 14 Feb 2020 17:20:45 -0500 Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 01EMDJne146658; Fri, 14 Feb 2020 22:20:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=content-type : mime-version : subject : from : in-reply-to : date : cc : content-transfer-encoding : message-id : references : to; s=corp-2020-01-29; bh=yYFo76qFz3KMj5aDdTrP1abf6VEjSGdEcr5JzwGt02k=; b=dLDm9aTUwG2ZBgdh4VXkuWQWyNucxICc7IONs8QoEFegRWDXu5M/Y64H/hiSy1ck/Rs+ osanqAmLoy+3Q8SDMh3/NxbS52KS5YA0dlOeigzUhfiT9pgJVTCgkhp76BcGdFuanmqT 98mInUsZF2tJUla1PAsPFDNpWQ7oKwpTLIm99o/v9jjLWsOn9Hukjv3WrWQOasGiYdCW TpZ9vUpWh39hBRe5ma52EoFGNdfRF7Xv42YJkCGs7lSol7FvJKNMi4bso82AquWPtVBT kf/FqWX4N0ams/9Lgq7rAicWwG14Uv+6KOiOiRqx1MF8W7C6S1H4My30NZrQ6Q5PTLrJ mA== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by aserp2120.oracle.com with ESMTP id 2y2jx6v6px-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 14 Feb 2020 22:20:41 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 01EMBwBk165754; Fri, 14 Feb 2020 22:20:41 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserp3030.oracle.com with ESMTP id 2y4k82x7qr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 14 Feb 2020 22:20:41 +0000 Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 01EMKdnH030381; Fri, 14 Feb 2020 22:20:39 GMT Received: from anon-dhcp-153.1015granger.net (/68.61.232.219) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Feb 2020 14:20:39 -0800 Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\)) Subject: Re: [PATCH v2 1/4] NFSD: Return eof and maxcount to nfsd4_encode_read() From: Chuck Lever In-Reply-To: <20200214211206.407725-2-Anna.Schumaker@Netapp.com> Date: Fri, 14 Feb 2020 17:20:37 -0500 Cc: Linux NFS Mailing List , Anna Schumaker Content-Transfer-Encoding: quoted-printable Message-Id: <8293E6BD-F063-4872-848F-93196C87DA02@oracle.com> References: <20200214211206.407725-1-Anna.Schumaker@Netapp.com> <20200214211206.407725-2-Anna.Schumaker@Netapp.com> To: Anna Schumaker , Bruce Fields X-Mailer: Apple Mail (2.3445.104.11) X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9531 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 adultscore=0 suspectscore=0 mlxscore=0 bulkscore=0 malwarescore=0 phishscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2001150001 definitions=main-2002140163 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9531 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 malwarescore=0 priorityscore=1501 adultscore=0 phishscore=0 impostorscore=0 spamscore=0 bulkscore=0 lowpriorityscore=0 mlxscore=0 suspectscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2001150001 definitions=main-2002140163 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org > On Feb 14, 2020, at 4:12 PM, schumaker.anna@gmail.com wrote: >=20 > From: Anna Schumaker >=20 > I want to reuse nfsd4_encode_readv() and nfsd4_encode_splice_read() in > READ_PLUS rather than reimplementing them. READ_PLUS returns a single > eof flag for the entire call and a separate maxcount for each data > segment, so we need to have the READ call encode these values in a > different place. This probably collides pretty nastily with the fix I posted today for https://bugzilla.kernel.org/show_bug.cgi?id=3D198053 . Can my fix go in first so that there is still opportunity to backport = it? > Signed-off-by: Anna Schumaker > --- > fs/nfsd/nfs4xdr.c | 60 ++++++++++++++++++++--------------------------- > 1 file changed, 26 insertions(+), 34 deletions(-) >=20 > diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c > index 9761512674a0..45f0623f6488 100644 > --- a/fs/nfsd/nfs4xdr.c > +++ b/fs/nfsd/nfs4xdr.c > @@ -3521,23 +3521,22 @@ nfsd4_encode_open_downgrade(struct = nfsd4_compoundres *resp, __be32 nfserr, struc >=20 > static __be32 nfsd4_encode_splice_read( > struct nfsd4_compoundres *resp, > - struct nfsd4_read *read, > - struct file *file, unsigned long = maxcount) > + struct nfsd4_read *read, struct file = *file, > + unsigned long *maxcount, u32 *eof) > { > struct xdr_stream *xdr =3D &resp->xdr; > struct xdr_buf *buf =3D xdr->buf; > - u32 eof; > + long len; > int space_left; > __be32 nfserr; > - __be32 *p =3D xdr->p - 2; >=20 > /* Make sure there will be room for padding if needed */ > if (xdr->end - xdr->p < 1) > return nfserr_resource; >=20 > + len =3D *maxcount; > nfserr =3D nfsd_splice_read(read->rd_rqstp, read->rd_fhp, > - file, read->rd_offset, &maxcount, = &eof); > - read->rd_length =3D maxcount; > + file, read->rd_offset, maxcount, eof); > if (nfserr) { > /* > * nfsd_splice_actor may have already messed with the > @@ -3548,24 +3547,21 @@ static __be32 nfsd4_encode_splice_read( > return nfserr; > } >=20 > - *(p++) =3D htonl(eof); > - *(p++) =3D htonl(maxcount); > - > - buf->page_len =3D maxcount; > - buf->len +=3D maxcount; > - xdr->page_ptr +=3D (buf->page_base + maxcount + PAGE_SIZE - 1) > + buf->page_len =3D *maxcount; > + buf->len +=3D *maxcount; > + xdr->page_ptr +=3D (buf->page_base + *maxcount + PAGE_SIZE - 1) > / PAGE_SIZE; >=20 > /* Use rest of head for padding and remaining ops: */ > buf->tail[0].iov_base =3D xdr->p; > buf->tail[0].iov_len =3D 0; > xdr->iov =3D buf->tail; > - if (maxcount&3) { > - int pad =3D 4 - (maxcount&3); > + if (*maxcount&3) { > + int pad =3D 4 - (*maxcount&3); >=20 > *(xdr->p++) =3D 0; >=20 > - buf->tail[0].iov_base +=3D maxcount&3; > + buf->tail[0].iov_base +=3D *maxcount&3; > buf->tail[0].iov_len =3D pad; > buf->len +=3D pad; > } > @@ -3579,22 +3575,20 @@ static __be32 nfsd4_encode_splice_read( > } >=20 > static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp, > - struct nfsd4_read *read, > - struct file *file, unsigned long = maxcount) > + struct nfsd4_read *read, struct file = *file, > + unsigned long *maxcount, u32 *eof) > { > struct xdr_stream *xdr =3D &resp->xdr; > - u32 eof; > int v; > int starting_len =3D xdr->buf->len - 8; > long len; > int thislen; > __be32 nfserr; > - __be32 tmp; > __be32 *p; > u32 zzz =3D 0; > int pad; >=20 > - len =3D maxcount; > + len =3D *maxcount; > v =3D 0; >=20 > thislen =3D min_t(long, len, ((void *)xdr->end - (void = *)xdr->p)); > @@ -3616,22 +3610,15 @@ static __be32 nfsd4_encode_readv(struct = nfsd4_compoundres *resp, > } > read->rd_vlen =3D v; >=20 > - len =3D maxcount; > + len =3D *maxcount; > nfserr =3D nfsd_readv(resp->rqstp, read->rd_fhp, file, = read->rd_offset, > - resp->rqstp->rq_vec, read->rd_vlen, = &maxcount, > - &eof); > - read->rd_length =3D maxcount; > + resp->rqstp->rq_vec, read->rd_vlen, = maxcount, eof); > if (nfserr) > return nfserr; > - xdr_truncate_encode(xdr, starting_len + 8 + ((maxcount+3)&~3)); > + xdr_truncate_encode(xdr, starting_len + 8 + ((*maxcount+3)&~3)); >=20 > - tmp =3D htonl(eof); > - write_bytes_to_xdr_buf(xdr->buf, starting_len , &tmp, 4); > - tmp =3D htonl(maxcount); > - write_bytes_to_xdr_buf(xdr->buf, starting_len + 4, &tmp, 4); > - > - pad =3D (maxcount&3) ? 4 - (maxcount&3) : 0; > - write_bytes_to_xdr_buf(xdr->buf, starting_len + 8 + maxcount, > + pad =3D (*maxcount&3) ? 4 - (*maxcount&3) : 0; > + write_bytes_to_xdr_buf(xdr->buf, starting_len + 8 + *maxcount, > &zzz, = pad); > return 0; >=20 > @@ -3642,6 +3629,7 @@ nfsd4_encode_read(struct nfsd4_compoundres = *resp, __be32 nfserr, > struct nfsd4_read *read) > { > unsigned long maxcount; > + u32 eof; > struct xdr_stream *xdr =3D &resp->xdr; > struct file *file; > int starting_len =3D xdr->buf->len; > @@ -3670,13 +3658,17 @@ nfsd4_encode_read(struct nfsd4_compoundres = *resp, __be32 nfserr, >=20 > if (file->f_op->splice_read && > test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)) > - nfserr =3D nfsd4_encode_splice_read(resp, read, file, = maxcount); > + nfserr =3D nfsd4_encode_splice_read(resp, read, file, = &maxcount, &eof); > else > - nfserr =3D nfsd4_encode_readv(resp, read, file, = maxcount); > + nfserr =3D nfsd4_encode_readv(resp, read, file, = &maxcount, &eof); >=20 > if (nfserr) > xdr_truncate_encode(xdr, starting_len); >=20 > + read->rd_length =3D maxcount; > + *p++ =3D htonl(eof); > + *p++ =3D htonl(maxcount); > + > return nfserr; > } >=20 > --=20 > 2.25.0 >=20 -- Chuck Lever