From nobody Sat Oct 03 17:34:54 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 4hxt7z06ZJz6vmPP for ; Sat, 03 Oct 2026 17:34:55 +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 4hxt7y47Bnz4l5d for ; Sat, 03 Oct 2026 17:34:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791048894; 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=I/wlDni/AUwwOR7HJJgObZMU1yTKAu/U1xzqof7HFWY=; b=qL1YsMzIQAPgpYbJTnmq0tQ7KVTaeyT/mwe9VHkoh+IR+Hrq21Xk6Eh+4FMB8iaWES3Wip TrpqCzA2SPKRJF94PJXifg6dkOgb/03wZvQNsUleydnq98iBRIOBr3dFBFTORsk13SAFl3 0v32rTgfoc+24bI93cBjV8CUA9p9wz1mvmWFPlN4bFx3RiDRgTBGxQM4zE8Vj5X0UZyxT0 /CNsuI/L8u8q90RdcCUOyPcTxzFbWXnXk2trQpiZ7vcd40LEz407gVnfW8AOLza91TOzvC +6K1v+Piz7XouzmrKzOJF07ll2ah4zQKJkfMQRTK7EjZwDFepmiRA1okUUhMcw== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791048894; b=WRThZVZ/D3WzJDAZnXNyOnuJfOsDBN/sl6PHlvMCEFmx3RUoj90PJV76sKkVl6QMoPInvU XUqYZTKoT0GF7pA3K7ybZCBJl0YuDPpVu8mxp2HwewJyzTEk/1oiSqFIn6GdAPBXbQeQAR Lw5ndmHH9yFmOrP95V8f6OV8NLA6Q65XYQU6PbmAWuFBm+xXZ5YcpB4+ghUrX3HVICFRHD 5fjGNeTfNBuUvDMLHlmcVe69JgWTf6wlfiVLq08ayWu01U1k2VLIva8nvE63wNugFnlEZE 3Cs/IssWsBHWhc5l9VPLGyve8HotNtfkw+BdrODgAbcl9iTY6i4+edpxsWZC0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791048894; 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=I/wlDni/AUwwOR7HJJgObZMU1yTKAu/U1xzqof7HFWY=; b=C7907890Rvd4z2sxHTRxC0nSv7VO10PmmDuOd8/7/x+bCv7CHI6SkJA6UI9zxy07FfRwT1 4qaa+Kt9dN6OHsZR4fYcRZclRiOzQQfHAu9D/R5rYBejw//wSKpG7TromMpqeCPxVfVn+r p0RX0WZEYnl3c17LXShuvRwNGQkZGNMOQfYplN/QZGE1lx8VF0/gt/AT4zOU6e1jKxuzua Ox6enJVDdZSmPFP/8oQlhPaypg70PEPYAou62ZLT6l81oRu5mvbb2r0mPEj8N603n0xvcp XZ8dWqc2Lh7Q2qH4hjVFYhHlv87yW6FjD77dpCvZlwrwFNngSFTX9uUetYVSdA== 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 4hxt7y3BVMz1Bg0 for ; Sat, 03 Oct 2026 17:34:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1cc51 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 03 Oct 2026 17:34:54 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 32fcc66dd311 - main - stand: Load dynamic system attribute offsets 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: 32fcc66dd311207451cd4916f9ed837ee19f9e07 Auto-Submitted: auto-generated Date: Sat, 03 Oct 2026 17:34:54 +0000 Message-Id: <6ac13cbe.1cc51.5483b5b2@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=32fcc66dd311207451cd4916f9ed837ee19f9e07 commit 32fcc66dd311207451cd4916f9ed837ee19f9e07 Author: Warner Losh AuthorDate: 2026-10-03 14:42:38 +0000 Commit: Warner Losh CommitDate: 2026-10-03 17:32:08 +0000 stand: Load dynamic system attribute offsets zfs_sa_load looks up all the system attribute offsets and stores them in the mountpoint. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D60264 --- stand/libsa/zfs/zfsimpl.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/stand/libsa/zfs/zfsimpl.c b/stand/libsa/zfs/zfsimpl.c index 41b81e587a85..b9b5b227deec 100644 --- a/stand/libsa/zfs/zfsimpl.c +++ b/stand/libsa/zfs/zfsimpl.c @@ -43,12 +43,50 @@ extern int zstd_init(void); #endif +/* + * We have to map a series of strings to an index number that's varies + * filesystem by filesystem. We need all of these attributes, even though the + * loader only uses a few since the layout of the system attributes bundles + * varies file by file and to get to the one we want, we have to understand + * all the different element types. + */ +enum zfs_sa_attr_id { + ZFS_SA_ATIME, + ZFS_SA_MTIME, + ZFS_SA_CTIME, + ZFS_SA_CRTIME, + ZFS_SA_GEN, + ZFS_SA_MODE, + ZFS_SA_SIZE, + ZFS_SA_PARENT, + ZFS_SA_LINKS, + ZFS_SA_XATTR, + ZFS_SA_RDEV, + ZFS_SA_FLAGS, + ZFS_SA_UID, + ZFS_SA_GID, + ZFS_SA_PAD, + ZFS_SA_ZNODE_ACL, + ZFS_SA_DACL_COUNT, + ZFS_SA_SYMLINK, + ZFS_SA_SCANSTAMP, + ZFS_SA_DACL_ACES, + ZFS_SA_DXATTR, + ZFS_SA_PROJID, + ZFS_SA_SEQ, + ZFS_SA_COUNT +}; + struct zfsmount { char *path; const spa_t *spa; objset_phys_t objset; uint64_t rootobj; uint64_t fsid_guid; /* mount's ds_fsid_guid */ + dnode_phys_t sa_registry; + dnode_phys_t sa_layouts; + uint64_t sa_attrs[ZFS_SA_COUNT]; + bool sa_loaded; STAILQ_ENTRY(zfsmount) next; }; @@ -3518,6 +3556,7 @@ zfs_mount_impl(const spa_t *spa, uint64_t rootobj, struct zfsmount *mount) { mount->spa = spa; + mount->sa_loaded = false; /* * Find the root object set if not explicitly provided @@ -3712,6 +3751,89 @@ zfs_spa_init(spa_t *spa) return (rc); } +static const char *zfs_sa_attrs[ZFS_SA_COUNT] = { + [ZFS_SA_ATIME] = "ZPL_ATIME", + [ZFS_SA_MTIME] = "ZPL_MTIME", + [ZFS_SA_CTIME] = "ZPL_CTIME", + [ZFS_SA_CRTIME] = "ZPL_CRTIME", + [ZFS_SA_GEN] = "ZPL_GEN", + [ZFS_SA_MODE] = "ZPL_MODE", + [ZFS_SA_SIZE] = "ZPL_SIZE", + [ZFS_SA_PARENT] = "ZPL_PARENT", + [ZFS_SA_LINKS] = "ZPL_LINKS", + [ZFS_SA_XATTR] = "ZPL_XATTR", + [ZFS_SA_RDEV] = "ZPL_RDEV", + [ZFS_SA_FLAGS] = "ZPL_FLAGS", + [ZFS_SA_UID] = "ZPL_UID", + [ZFS_SA_GID] = "ZPL_GID", + [ZFS_SA_PAD] = "ZPL_PAD", + [ZFS_SA_ZNODE_ACL] = "ZPL_ZNODE_ACL", + [ZFS_SA_DACL_COUNT] = "ZPL_DACL_COUNT", + [ZFS_SA_SYMLINK] = "ZPL_SYMLINK", + [ZFS_SA_SCANSTAMP] = "ZPL_SCANSTAMP", + [ZFS_SA_DACL_ACES] = "ZPL_DACL_ACES", + [ZFS_SA_DXATTR] = "ZPL_DXATTR", + [ZFS_SA_PROJID] = "ZPL_PROJID", + [ZFS_SA_SEQ] = "ZPL_SEQ", +}; + +#define ZFS_SA_MAX_ATTRS 256 + +/* + * Populate the sa_attrs array with the per-filesystem index + * numbers used to decode the system attribute bundles. + */ +static int +zfs_sa_load(struct zfsmount *mount) +{ + dnode_phys_t master, sa_master; + uint64_t sa_object, registry, layouts; + int error; + + if (mount->sa_loaded) + return (0); + + error = objset_get_dnode(mount->spa, &mount->objset, MASTER_NODE_OBJ, + &master); + if (error != 0) + return (error); + error = zap_lookup(mount->spa, &master, ZFS_SA_ATTRS, + sizeof(sa_object), 1, &sa_object); + if (error != 0) + return (error); + error = objset_get_dnode(mount->spa, &mount->objset, sa_object, + &sa_master); + if (error != 0) + return (error); + error = zap_lookup(mount->spa, &sa_master, SA_REGISTRY, + sizeof(registry), 1, ®istry); + if (error != 0) + return (error); + error = zap_lookup(mount->spa, &sa_master, SA_LAYOUTS, + sizeof(layouts), 1, &layouts); + if (error != 0) + return (error); + error = objset_get_dnode(mount->spa, &mount->objset, registry, + &mount->sa_registry); + if (error != 0) + return (error); + error = objset_get_dnode(mount->spa, &mount->objset, layouts, + &mount->sa_layouts); + if (error != 0) + return (error); + + for (unsigned int i = 0; i < nitems(zfs_sa_attrs); i++) { + error = zap_lookup(mount->spa, &mount->sa_registry, + zfs_sa_attrs[i], sizeof(mount->sa_attrs[i]), 1, + &mount->sa_attrs[i]); + if (error != 0) + mount->sa_attrs[i] = UINT64_MAX; + } + + mount->sa_loaded = true; + return (0); +} + static int zfs_dnode_stat(struct zfsmount *mount, dnode_phys_t *dn, struct stat *sb, uint64_t fsid_guid, uint64_t objnum)