Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp2804760pxy; Mon, 3 May 2021 08:23:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx7hsyTU55Wb3GBtIWLMuVHHkCcQ36juJkFGR9OOdkrI9PZhky3vXRpLuEDDMR15A+mKHOx X-Received: by 2002:a05:6402:154d:: with SMTP id p13mr20788605edx.371.1620055422138; Mon, 03 May 2021 08:23:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620055422; cv=none; d=google.com; s=arc-20160816; b=ucdrXQp2ozL+qvIrL6GHB+5Fn/xtPTZYWtJ22ptLj1tbYSnIH2+dLn0JLMHnPZGZ01 XpbeFEM141Qb4w/S0PG34qNxPrOxoopkuT2dcXteuDVLc1EtBLn4TuI28Jox8LDZqhz8 nZ2swjWWiJG53crBKqIB0eT88yc8oXija2JxOWp97+fFCaDbk5nFWhFOlavfmOM/0ECF TrPq3KG34xgvS/yv48n2vBWqLO1XfrsZ1WrArKEHYNSwNfuefZlu4oxPhdKoT1mEIn9t iRSspZdY9O+aAKHSYYOr7o1vERTC6UFZOVo+PF4TB3hadHDyiuDqkk32fRzGxNuUl8Ge Y0fA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:to:from:subject; bh=FJhZeU2sUkKfL/e+IZI0GqXXR8lVUYg9/XpOU18ZQEk=; b=yrirGL9+LDyVDK3bWQA6vBO9FE2SDYj5jV0V6Fq9IX846uiSLAmhbC7CcpVLPRzvF5 TGX6YXVpUA87ZjqrPfNJ1Bu8lla0VeGX7657LPz+LhhJKGGfqYpiPucoH3zggT9McW2e WKuhFpCVt5covo6Uk1PeJZ3+bRDS1VvdIWMrey4jxwSv4i7QH80HVTplhYBMUjcTmjsW oam7aLC8/FOnDbgzLH15fiM0DABOGWTwaYcOTGEhTYAwNsNjZ5cHxFgdHRd+FVz63eIw 8ZJXt2/EiaFDgOuDdlCnZB0K7+cVyaMjY7BJcYTC0vyQ2Zi0P1T48okrJu03PolJWhlq YJvw== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a20si9242058edv.202.2021.05.03.08.23.18; Mon, 03 May 2021 08:23:42 -0700 (PDT) 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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230362AbhECPYC (ORCPT + 99 others); Mon, 3 May 2021 11:24:02 -0400 Received: from mail.kernel.org ([198.145.29.99]:38630 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230283AbhECPYA (ORCPT ); Mon, 3 May 2021 11:24:00 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id DC01A611CE for ; Mon, 3 May 2021 15:23:06 +0000 (UTC) Subject: [PATCH v1 03/29] lockd: Common NLM XDR helpers From: Chuck Lever To: linux-nfs@vger.kernel.org Date: Mon, 03 May 2021 11:23:06 -0400 Message-ID: <162005538606.23028.1457330200916718450.stgit@klimt.1015granger.net> In-Reply-To: <162005520101.23028.15766816408658851498.stgit@klimt.1015granger.net> References: <162005520101.23028.15766816408658851498.stgit@klimt.1015granger.net> User-Agent: StGit/1.1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org Add a .h file containing xdr_stream-based XDR helpers common to both NLMv3 and NLMv4. Signed-off-by: Chuck Lever --- fs/lockd/svcxdr.h | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 fs/lockd/svcxdr.h diff --git a/fs/lockd/svcxdr.h b/fs/lockd/svcxdr.h new file mode 100644 index 000000000000..c69a0bb76c94 --- /dev/null +++ b/fs/lockd/svcxdr.h @@ -0,0 +1,151 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Encode/decode NLM basic data types + * + * Basic NLMv3 XDR data types are not defined in an IETF standards + * document. X/Open has a description of these data types that + * is useful. See Chapter 10 of "Protocols for Interworking: + * XNFS, Version 3W". + * + * Basic NLMv4 XDR data types are defined in Appendix II.1.4 of + * RFC 1813: "NFS Version 3 Protocol Specification". + * + * Author: Chuck Lever + * + * Copyright (c) 2020, Oracle and/or its affiliates. + */ + +#ifndef _LOCKD_SVCXDR_H_ +#define _LOCKD_SVCXDR_H_ + +static inline bool +svcxdr_decode_stats(struct xdr_stream *xdr, __be32 *status) +{ + __be32 *p; + + p = xdr_inline_decode(xdr, XDR_UNIT); + if (!p) + return false; + *status = *p; + + return true; +} + +static inline bool +svcxdr_encode_stats(struct xdr_stream *xdr, __be32 status) +{ + __be32 *p; + + p = xdr_reserve_space(xdr, XDR_UNIT); + if (!p) + return false; + *p = status; + + return true; +} + +static inline bool +svcxdr_decode_string(struct xdr_stream *xdr, char **data, unsigned int *data_len) +{ + __be32 *p; + u32 len; + + if (xdr_stream_decode_u32(xdr, &len) < 0) + return false; + if (len > NLM_MAXSTRLEN) + return false; + p = xdr_inline_decode(xdr, len); + if (!p) + return false; + *data_len = len; + *data = (char *)p; + + return true; +} + +/* + * NLM cookies are defined by specification to be a variable-length + * XDR opaque no longer than 1024 bytes. However, this implementation + * limits their length to 32 bytes, and treats zero-length cookies + * specially. + */ +static inline bool +svcxdr_decode_cookie(struct xdr_stream *xdr, struct nlm_cookie *cookie) +{ + __be32 *p; + u32 len; + + if (xdr_stream_decode_u32(xdr, &len) < 0) + return false; + if (len > NLM_MAXCOOKIELEN) + return false; + if (!len) + goto out_hpux; + + p = xdr_inline_decode(xdr, len); + if (!p) + return false; + cookie->len = len; + memcpy(cookie->data, p, len); + + return true; + + /* apparently HPUX can return empty cookies */ +out_hpux: + cookie->len = 4; + memset(cookie->data, 0, 4); + return true; +} + +static inline bool +svcxdr_encode_cookie(struct xdr_stream *xdr, const struct nlm_cookie *cookie) +{ + __be32 *p; + + if (xdr_stream_encode_u32(xdr, cookie->len) < 0) + return false; + p = xdr_reserve_space(xdr, cookie->len); + if (!p) + return false; + memcpy(p, cookie->data, cookie->len); + + return true; +} + +static inline bool +svcxdr_decode_owner(struct xdr_stream *xdr, struct xdr_netobj *obj) +{ + __be32 *p; + u32 len; + + if (xdr_stream_decode_u32(xdr, &len) < 0) + return false; + if (len > XDR_MAX_NETOBJ) + return false; + p = xdr_inline_decode(xdr, len); + if (!p) + return false; + obj->len = len; + obj->data = (u8 *)p; + + return true; +} + +static inline bool +svcxdr_encode_owner(struct xdr_stream *xdr, const struct xdr_netobj *obj) +{ + unsigned int quadlen = XDR_QUADLEN(obj->len); + __be32 *p; + + if (xdr_stream_encode_u32(xdr, obj->len) < 0) + return false; + p = xdr_reserve_space(xdr, obj->len); + if (!p) + return false; + p[quadlen - 1] = 0; /* XDR pad */ + memcpy(p, obj->data, obj->len); + + return true; +} + +#endif /* _LOCKD_SVCXDR_H_ */