Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp992892pxb; Wed, 3 Mar 2021 23:50:10 -0800 (PST) X-Google-Smtp-Source: ABdhPJwOY3vKZpMhh7cKohktlvHBkZdoqGFXzzA0kUL75HJXG/0tRC5Bk+nzbGG6No8JSre3Yh5m X-Received: by 2002:a17:906:558:: with SMTP id k24mr2848362eja.387.1614844210115; Wed, 03 Mar 2021 23:50:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614844210; cv=none; d=google.com; s=arc-20160816; b=jPOGOAajnDAZfyVLK3EDgW4W/BdZtl3g2Duk9pYsvLQ1nxvTM0SxXWPg5AZJgAEhFU x9n+p7Y7W90QBI5MczDucamPGvQfqFvq9ZkfpaThTTIXU7CGYuBmh8O4g8oQJRDXBVCf 9j7CpWcrXQBEh+5+6MEa70OVYXJhTDQ1oPYIEFUEdMNqpn3vf9WocBd1CWGbYc+b/vdD ZmkiOiFvw7CBIqsXMPcYRIQ2flLZV4EeS+NOya8Leyj5duagMu1sXsRcjpRvK1bbTgvI dU75teEaOmKF5HGXMrNePxxIrIC9gsgEI1t7MgVSguMySwQn092wCEfI/GRkQVkVk2jH DDfw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:from:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:date :dkim-signature:dkim-filter; bh=zhdvxoHmaTycKDht8GvGbvKV9sBC6veJjiiJx44KJEY=; b=SUVzLSzxNbDyOxndNtj3t3DK0UoyzZLq8frZyzz1ZZBDX2q493G/pZjlvPzDUHNDAz /N6aLHGPQymMb0S5B5BZxGuFs14ZIw+PAFv1H8h2WEPCpy2Jb0pXFntA0cbMlWBBDCOd J5mz6ZWAjwqw44MYJI9y0OxT2vDvCIjW7ZO3CPYHR0ylnBzKweBiNDiqVggwcMkXlrI/ 6WxpnDE/9M3UQP29nhFFA8weo8ClxqAfJdk0Nns4QRywjcN1LN1lzV/iMFTrahbAZXnZ gUviZIZKnu9T0ScNoxjyKZ1IC+sZDgjerfeRbT7vfIPaq4NJxYkTR7RgudFsFdm0/Eey pA9w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@fieldses.org header.s=default header.b=jxWDB2gw; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a20si16200096ejg.257.2021.03.03.23.49.47; Wed, 03 Mar 2021 23:50:10 -0800 (PST) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@fieldses.org header.s=default header.b=jxWDB2gw; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241441AbhCCKyd (ORCPT + 99 others); Wed, 3 Mar 2021 05:54:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34518 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376371AbhCBUqK (ORCPT ); Tue, 2 Mar 2021 15:46:10 -0500 Received: from fieldses.org (fieldses.org [IPv6:2600:3c00:e000:2f7::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0049DC061788 for ; Tue, 2 Mar 2021 12:45:21 -0800 (PST) Received: by fieldses.org (Postfix, from userid 2815) id 120D41E3B; Tue, 2 Mar 2021 15:45:20 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.11.0 fieldses.org 120D41E3B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fieldses.org; s=default; t=1614717920; bh=zhdvxoHmaTycKDht8GvGbvKV9sBC6veJjiiJx44KJEY=; h=Date:To:Cc:Subject:References:In-Reply-To:From:From; b=jxWDB2gwCN1+g6qiAkMXW5w31rquzHmdH99dPszHITo14d2lJqp36lEtq5fqnP6gl b6tg6KOhIBfrMxf2qBAKIjpbYx80fVgtzJrfaTAvjnMnt9yu6p49g4D3xi4a7yZJ75 mdSu2uQlm3He3NDREHxt4tylkTiFsZn4L2gutpZE= Date: Tue, 2 Mar 2021 15:45:20 -0500 To: Chuck Lever Cc: linux-nfs@vger.kernel.org Subject: Re: [PATCH v1 12/42] NFSD: Update the NFSv3 FSSTAT3res encoder to use struct xdr_stream Message-ID: <20210302204520.GF3400@fieldses.org> References: <161461145466.8508.13379815439337754427.stgit@klimt.1015granger.net> <161461179102.8508.11890812651210896607.stgit@klimt.1015granger.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <161461179102.8508.11890812651210896607.stgit@klimt.1015granger.net> User-Agent: Mutt/1.5.21 (2010-09-15) From: bfields@fieldses.org (J. Bruce Fields) Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org On Mon, Mar 01, 2021 at 10:16:31AM -0500, Chuck Lever wrote: > Signed-off-by: Chuck Lever > --- > fs/nfsd/nfs3xdr.c | 58 ++++++++++++++++++++++++++++++++++++++++------------- > 1 file changed, 44 insertions(+), 14 deletions(-) > > diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c > index e159e4557428..e4a569e7216d 100644 > --- a/fs/nfsd/nfs3xdr.c > +++ b/fs/nfsd/nfs3xdr.c > @@ -17,6 +17,13 @@ > #define NFSDDBG_FACILITY NFSDDBG_XDR > > > +/* > + * Force construction of an empty post-op attr > + */ > +static const struct svc_fh nfs3svc_null_fh = { > + .fh_no_wcc = true, > +}; > + > /* > * Mapping of S_IF* types to NFS file types > */ > @@ -1392,27 +1399,50 @@ nfs3svc_encode_entry_plus(void *cd, const char *name, > return encode_entry(cd, name, namlen, offset, ino, d_type, 1); > } > > +static bool > +svcxdr_encode_fsstat3resok(struct xdr_stream *xdr, > + const struct nfsd3_fsstatres *resp) > +{ > + const struct kstatfs *s = &resp->stats; > + u64 bs = s->f_bsize; > + __be32 *p; > + > + p = xdr_reserve_space(xdr, XDR_UNIT * 13); > + if (!p) > + return false; > + p = xdr_encode_hyper(p, bs * s->f_blocks); /* total bytes */ > + p = xdr_encode_hyper(p, bs * s->f_bfree); /* free bytes */ > + p = xdr_encode_hyper(p, bs * s->f_bavail); /* user available bytes */ > + p = xdr_encode_hyper(p, s->f_files); /* total inodes */ > + p = xdr_encode_hyper(p, s->f_ffree); /* free inodes */ > + p = xdr_encode_hyper(p, s->f_ffree); /* user available inodes */ > + *p = cpu_to_be32(resp->invarsec); /* mean unchanged time */ > + > + return true; > +} > + > /* FSSTAT */ > int > nfs3svc_encode_fsstatres(struct svc_rqst *rqstp, __be32 *p) > { > + struct xdr_stream *xdr = &rqstp->rq_res_stream; > struct nfsd3_fsstatres *resp = rqstp->rq_resp; > - struct kstatfs *s = &resp->stats; > - u64 bs = s->f_bsize; > > - *p++ = resp->status; > - *p++ = xdr_zero; /* no post_op_attr */ > - > - if (resp->status == 0) { > - p = xdr_encode_hyper(p, bs * s->f_blocks); /* total bytes */ > - p = xdr_encode_hyper(p, bs * s->f_bfree); /* free bytes */ > - p = xdr_encode_hyper(p, bs * s->f_bavail); /* user available bytes */ > - p = xdr_encode_hyper(p, s->f_files); /* total inodes */ > - p = xdr_encode_hyper(p, s->f_ffree); /* free inodes */ > - p = xdr_encode_hyper(p, s->f_ffree); /* user available inodes */ > - *p++ = htonl(resp->invarsec); /* mean unchanged time */ > + if (!svcxdr_encode_nfsstat3(xdr, resp->status)) > + return 0; > + switch (resp->status) { > + case nfs_ok: > + if (!svcxdr_encode_post_op_attr(rqstp, xdr, &nfs3svc_null_fh)) > + return 0; > + if (!svcxdr_encode_fsstat3resok(xdr, resp)) > + return 0; > + break; > + default: > + if (!svcxdr_encode_post_op_attr(rqstp, xdr, &nfs3svc_null_fh)) > + return 0; Dumb question: will this result in the same xdr on the wire as the above that just hard-coded xdr_zero? I feel like there's a lot of biolerplate error handling. In the v4 case I centralized some of it after a fuzzer found an oops in some of that copy-pasted boilerplate: b7571e4cd39a nfsd4: skip encoder in trivial error cases bac966d60652 nfsd4: individual encoders no longer see error cases I dunno, maybe that was overkill. --b. > } > - return xdr_ressize_check(rqstp, p); > + > + return 1; > } > > /* FSINFO */ >