From nobody Sat Oct 03 17:34:55 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hxt8024Lwz6vmYy for ; Sat, 03 Oct 2026 17:34:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hxt7z4xdXz4l3P for ; Sat, 03 Oct 2026 17:34:55 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791048895; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Sn4BCxEgjytWH3DAh8N1DE3xfB3tU4UAJ0SQDPYXjjk=; b=JCrKl+2QSB3OnCow+iF5/s79F85K60bbbYLsdTf8qVThABrmRKAvXNDYeSdGWfKZpnkZul /N1AKkHdPrAlGt4vu2eDM9PRA9fPueBZnew6alj+0TP6n55RJc/cSTvoPx45vPMIN06XDG 6AwaC3rYQKFx3t2/BCPO21SdPJRj/n5p797FsvJnp9GKVVAASA0m+/v+wS3bU2O48HtFLS Vbzc//XaSpDEZdeBbp4y9bY4mAZFlA0MhJNNL6rm7Rj74dvW1C9jLlS2I5oJWmgGCMci8/ cmreGNVt55HYEzaBcsXQKDSuyMoZBLamTn5X4eSze9kIurGTwIbnN5nMO1qCog== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791048895; b=F8Uanl2Q6dBTg7yyPkVipA6bGjQTWSOpW8OHPcczBec7m5SLBAdfeR4fm9hBrN/eJnP2AE Y3s3Wn1jPsj5k8B1VlrZUphW2726dxu8jsmf7ydh5OoAE3OFxhOB1FdOJTXSzps8CEwu+k 7pUNj0oLTkMu3X9R9RWASYe6vim3l9EXGKLumMkExn3zxmd/Wncq2uqD374NBp3FqkjvlH jkQdd+jFSWK+JNMQ/xig7xYReBmj1ut6v6ww9iI46mtxe02IsYqgbsGn+UdqJ0HjjphjXd f/d6tj8hhe+q6XBmO2iEUdWUDdto3eAzgPmerErJQxxdWijAsFwPkU8b2LX2Pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791048895; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Sn4BCxEgjytWH3DAh8N1DE3xfB3tU4UAJ0SQDPYXjjk=; b=yTcHizWCOWAlSR6pBHZkVTQA7hAHOPibjLMj4o/dP1CIav67g9piAe9yB9VHqKUYWZ1cpl Iipy8pQKgUO+ER+1HZrjjT2OS3zzUrmcZ/AMVsZCEWAe3hLBOOk5eED1zo+A8f0HvrJgYC syCQAjetgZhQVm1YXSyshgikzdKMpc9r80ATcgeXAWt7EISdkNw4m6AKU0m9+cxyN1E+js pnlaVce/m7KTksDGdCOQU/GGjQpx3ox2Y5ymOiTbI1rjH2cjc3v+aAAH7Vg9L9ADcd9bra 8KkSFg8nNIVDva9J9rTtwA2K/qHOyRReov92XhWTsjJj0yWmXYH2qCNlVbK+hw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hxt7z3sWFz1C42 for ; Sat, 03 Oct 2026 17:34:55 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1e2c0 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 03 Oct 2026 17:34:55 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 4175fa107f77 - main - stand: Lookup the offsets for this SA bundle List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 4175fa107f77e93c7e5c7d0dbd3662b0a6ae620b Auto-Submitted: auto-generated Date: Sat, 03 Oct 2026 17:34:55 +0000 Message-Id: <6ac13cbf.1e2c0.7abc050b@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=4175fa107f77e93c7e5c7d0dbd3662b0a6ae620b commit 4175fa107f77e93c7e5c7d0dbd3662b0a6ae620b Author: Warner Losh AuthorDate: 2026-10-03 14:42:43 +0000 Commit: Warner Losh CommitDate: 2026-10-03 17:32:08 +0000 stand: Lookup the offsets for this SA bundle Compute the offset for the data for this bundle and the requested data type. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D60265 --- stand/libsa/zfs/zfsimpl.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/stand/libsa/zfs/zfsimpl.c b/stand/libsa/zfs/zfsimpl.c index b9b5b227deec..e06c9b01328b 100644 --- a/stand/libsa/zfs/zfsimpl.c +++ b/stand/libsa/zfs/zfsimpl.c @@ -3834,6 +3834,73 @@ zfs_sa_load(struct zfsmount *mount) return (0); } +/* + * Walk through the system attribute bundle looking for the attribute that's + * requested. Return it's value and size. + */ +static int +zfs_sa_lookup(struct zfsmount *mount, const void *buf, size_t buflen, + enum zfs_sa_attr_id attr, void *value, size_t *size) +{ + const sa_hdr_phys_t *hdr; + uint16_t layout[ZFS_SA_MAX_ATTRS]; + char layout_name[16]; + size_t hdrsize, length, offset; + unsigned int i, j, length_idx; + int error; + + hdr = buf; + if (buflen < sizeof(*hdr) || hdr->sa_magic != SA_MAGIC) + return (EIO); + error = zfs_sa_load(mount); + if (error != 0) + return (error); + + memset(layout, 0xff, sizeof(layout)); + i = SA_HDR_LAYOUT_NUM(hdr); + if (i == 0) + i = 1; + snprintf(layout_name, sizeof(layout_name), "%u", i); + error = zap_lookup(mount->spa, &mount->sa_layouts, layout_name, + sizeof(layout[0]), nitems(layout), layout); + if (error != 0) + return (error); + + hdrsize = SA_HDR_SIZE(hdr); + if (hdrsize < sizeof(*hdr) || hdrsize > buflen) + return (EIO); + offset = hdrsize; + length_idx = 0; + for (i = 0; i < nitems(layout) && layout[i] != UINT16_MAX; i++) { + for (j = 0; j < nitems(zfs_sa_attrs); j++) { + if (mount->sa_attrs[j] != UINT64_MAX && + SA_ATTR_NUM(mount->sa_attrs[j]) == layout[i]) + break; + } + if (j == nitems(zfs_sa_attrs)) + return (EIO); + length = SA_ATTR_LENGTH(mount->sa_attrs[j]); + if (length == 0) { + if (offsetof(sa_hdr_phys_t, sa_lengths) + + (length_idx + 1) * sizeof(hdr->sa_lengths[0]) > + hdrsize) + return (EIO); + length = hdr->sa_lengths[length_idx++]; + } + if (offset > buflen || length > buflen - offset) + return (EIO); + if (j == attr) { + if (*size < length) + return (EOVERFLOW); + memcpy(value, (const char *)buf + offset, length); + *size = length; + return (0); + } + offset = roundup2(offset + length, 8); + } + return (ENOENT); +} + static int zfs_dnode_stat(struct zfsmount *mount, dnode_phys_t *dn, struct stat *sb, uint64_t fsid_guid, uint64_t objnum)