From nobody Sun Dec 17 03:48:44 2023 X-Original-To: dev-commits-src-branches@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 4St87w4Yr7z53xbb; Sun, 17 Dec 2023 03:48:44 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4St87w46ldz3b9Z; Sun, 17 Dec 2023 03:48:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1702784924; 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=kPXfS9uv8NWRfGNzU0Jgl960G0msv2txfeKHri/kIC4=; b=eZwWuxYIheR1Ig6cfwRgWG3Kilc/gaa3Blo1nxWvhjFCbDsgzI6YzPqaKy1H6Dua+ERNAT OLKoP+AMjXbpdadCyvlLeFstZb+UIcVRvN75i2AzZL3u1iYg4vRylCA7Gok4sRY/u/MnRB MtNFQb8mUVU4h3VOwkZRyIUZgdGrT6+/N94CsY0IOM7GZ4QiCKnOy+XcCf1lgPhwUmiiNY UtChR6SXN4Z11mxB9V/rKmMHqOqMhlyf0zqoij7iEQmF8BxLMBQWgr1EbyhCCvVvWtM9s7 TnV86jsvQIgIewZLtfcHFCaRKaJTBofLeStA66djHUkriZpn44EvSBH7+0V/YQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1702784924; a=rsa-sha256; cv=none; b=I9Dyu4TUkxCy5XWwpT82NFQ2duJyoKJwAp4lI2rjeUtuQRSBR+TcbrulpsDTzr382KKGfs e00ghJcZjruWkBE5nAjxZJ9iRUUENQfnowFk4PRDla3LAk1qxtFzdkJxMdYImHLfc9Kkhp d6o5UrTY0NsKAbie4k0n9K9Um9KOABLCm0GbEz4oCqnJpAzqkovzvLg6JDI5hjcynrE0AR S66Vv+0yxCw9s8bj53PgSFBymspK6zFuR5xF4iP+hlpFawD4oAEcTPoqngkDEyG/fEDEvf iPMSjmlEQU8khgMDXNHcSXM6PO9+ChOr/Nohrz5+9TqYG5YGh+0S4lqH6cABLA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1702784924; 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=kPXfS9uv8NWRfGNzU0Jgl960G0msv2txfeKHri/kIC4=; b=G1FcF1sf7ZKznEkqt24JB5Pc9kyliWC1cGYwibA3JE9wZ+P2ar1DpZMZAj4xTc3zZMtSbA 0SBQ+S88dREK2Povy/a+lNMA4TqitvAF/iokCsbq4dD6Y1LAZB7t5PXN5uFh3BH6avspf/ szgiIw/fIXiWPIY55N1i1U2zfJnuyh1Yl9S9ili1ivKwcYSs+mr4TQaBwLXW6Jku5ejmQn gYZyixJrpbExRJHkJJnbeeBWfGpAI1M9LzUJ++aEVDNFYEe46sMFF5PwhUq1FXvmG4mePp efhdetFLIOmGXYMqvUCjFBllH+9WxM1G4ZNzAdLDV9E8YgMwb2RAJSy9GSNaGA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4St87w38xZz6t3; Sun, 17 Dec 2023 03:48:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3BH3miKt018436; Sun, 17 Dec 2023 03:48:44 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3BH3miAY018433; Sun, 17 Dec 2023 03:48:44 GMT (envelope-from git) Date: Sun, 17 Dec 2023 03:48:44 GMT Message-Id: <202312170348.3BH3miAY018433@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kirk McKusick Subject: git: 2e4ac696d8d4 - stable/13 - Increase UFS/FFS maximum link count from 32767 to 65530. List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mckusick X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 2e4ac696d8d46f4818ecc91a38953ba1e3a20fc5 Auto-Submitted: auto-generated The branch stable/13 has been updated by mckusick: URL: https://cgit.FreeBSD.org/src/commit/?id=2e4ac696d8d46f4818ecc91a38953ba1e3a20fc5 commit 2e4ac696d8d46f4818ecc91a38953ba1e3a20fc5 Author: Kirk McKusick AuthorDate: 2023-12-03 20:36:42 +0000 Commit: Kirk McKusick CommitDate: 2023-12-17 03:48:38 +0000 Increase UFS/FFS maximum link count from 32767 to 65530. Differential Revision: https://reviews.freebsd.org/D42767 (cherry picked from commit 35a301555bff2ac27a727c10641b7efb3f162988) --- sys/ufs/ffs/ffs_alloc.c | 2 +- sys/ufs/ffs/ffs_softdep.c | 4 ++-- sys/ufs/ufs/dinode.h | 6 +++--- sys/ufs/ufs/inode.h | 10 ++++++++-- sys/ufs/ufs/ufs_lookup.c | 8 ++++---- sys/ufs/ufs/ufs_vnops.c | 32 ++++++++++++++++---------------- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index 33ad9ffc072b..09028456435e 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -3332,7 +3332,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) break; ip = VTOI(vp); ip->i_nlink += cmd.size; - DIP_SET(ip, i_nlink, ip->i_nlink); + DIP_SET_NLINK(ip, ip->i_nlink); ip->i_effnlink += cmd.size; UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_MODIFIED); error = ffs_update(vp, 1); diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index bf411b9f4322..f2df1a8e7fc3 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -10048,7 +10048,7 @@ handle_workitem_remove(struct dirrem *dirrem, int flags) KASSERT(ip->i_nlink >= 0, ("handle_workitem_remove: file ino " "%ju negative i_nlink %d", (intmax_t)ip->i_number, ip->i_nlink)); - DIP_SET(ip, i_nlink, ip->i_nlink); + DIP_SET_NLINK(ip, ip->i_nlink); UFS_INODE_SET_FLAG(ip, IN_CHANGE); if (ip->i_nlink < ip->i_effnlink) panic("handle_workitem_remove: bad file delta"); @@ -10071,7 +10071,7 @@ handle_workitem_remove(struct dirrem *dirrem, int flags) ip->i_nlink -= 2; KASSERT(ip->i_nlink >= 0, ("handle_workitem_remove: directory ino " "%ju negative i_nlink %d", (intmax_t)ip->i_number, ip->i_nlink)); - DIP_SET(ip, i_nlink, ip->i_nlink); + DIP_SET_NLINK(ip, ip->i_nlink); UFS_INODE_SET_FLAG(ip, IN_CHANGE); if (ip->i_nlink < ip->i_effnlink) panic("handle_workitem_remove: bad dir delta"); diff --git a/sys/ufs/ufs/dinode.h b/sys/ufs/ufs/dinode.h index b429562f1159..b4117a99c262 100644 --- a/sys/ufs/ufs/dinode.h +++ b/sys/ufs/ufs/dinode.h @@ -125,7 +125,7 @@ typedef int64_t ufs_time_t; struct ufs2_dinode { uint16_t di_mode; /* 0: IFMT, permissions; see below. */ - int16_t di_nlink; /* 2: File link count. */ + uint16_t di_nlink; /* 2: File link count. */ uint32_t di_uid; /* 4: File owner. */ uint32_t di_gid; /* 8: File group. */ uint32_t di_blksize; /* 12: Inode blocksize. */ @@ -180,7 +180,7 @@ struct ufs2_dinode { */ struct ufs1_dinode { uint16_t di_mode; /* 0: IFMT, permissions; see below. */ - int16_t di_nlink; /* 2: File link count. */ + uint16_t di_nlink; /* 2: File link count. */ union { uint32_t di_freelink; /* 4: SUJ: Next unlinked inode. */ uint32_t di_dirdepth; /* 4: IFDIR: depth from root dir */ @@ -210,6 +210,6 @@ struct ufs1_dinode { uint64_t di_modrev; /* 120: i_modrev for NFSv4 */ }; -#define UFS_LINK_MAX 32767 +#define UFS_LINK_MAX 65500 /* leave a few spare for special values */ #endif /* _UFS_UFS_DINODE_H_ */ diff --git a/sys/ufs/ufs/inode.h b/sys/ufs/ufs/inode.h index 898f30204b00..afe49bdba882 100644 --- a/sys/ufs/ufs/inode.h +++ b/sys/ufs/ufs/inode.h @@ -96,7 +96,7 @@ struct inode { ino_t i_number; /* The identity of the inode. */ uint32_t i_flag; /* flags, see below */ - int i_effnlink; /* i_nlink when I/O completes */ + int32_t i_effnlink; /* i_nlink when I/O completes */ /* * Side effects; used during directory lookup. @@ -130,7 +130,7 @@ struct inode { uint32_t i_flags; /* Status flags (chflags). */ uint32_t i_uid; /* File owner. */ uint32_t i_gid; /* File group. */ - int16_t i_nlink; /* File link count. */ + int32_t i_nlink; /* File link count. */ uint16_t i_mode; /* IFMT, permissions; see below. */ }; /* @@ -240,6 +240,12 @@ I_IS_UFS2(const struct inode *ip) else \ (ip)->i_din2->d##field = (val); \ } while (0) +#define DIP_SET_NLINK(ip, val) do { \ + KASSERT(ip->i_nlink >= 0, ("%s:%d %s(): setting negative " \ + "nlink value %d for inode %jd\n", __FILE__, __LINE__, \ + __FUNCTION__, (ip)->i_nlink, (ip)->i_number)); \ + DIP_SET(ip, i_nlink, val); \ + } while (0) #define IS_SNAPSHOT(ip) ((ip)->i_flags & SF_SNAPSHOT) #define IS_UFS(vp) ((vp)->v_data != NULL) diff --git a/sys/ufs/ufs/ufs_lookup.c b/sys/ufs/ufs/ufs_lookup.c index 0fb3a186b960..0c4b0d04367d 100644 --- a/sys/ufs/ufs/ufs_lookup.c +++ b/sys/ufs/ufs/ufs_lookup.c @@ -1137,7 +1137,7 @@ ufs_dirremove(struct vnode *dvp, struct inode *ip, int flags, int isrmdir) softdep_setup_unlink(dp, ip); } else { ip->i_nlink--; - DIP_SET(ip, i_nlink, ip->i_nlink); + DIP_SET_NLINK(ip, ip->i_nlink); UFS_INODE_SET_FLAG(ip, IN_CHANGE); } } @@ -1153,7 +1153,7 @@ ufs_dirremove(struct vnode *dvp, struct inode *ip, int flags, int isrmdir) softdep_change_linkcnt(ip); } else { ip->i_nlink++; - DIP_SET(ip, i_nlink, ip->i_nlink); + DIP_SET_NLINK(ip, ip->i_nlink); UFS_INODE_SET_FLAG(ip, IN_CHANGE); } } @@ -1257,7 +1257,7 @@ ufs_dirrewrite(struct inode *dp, struct inode *oip, ino_t newinum, int newtype, softdep_setup_unlink(dp, oip); } else { oip->i_nlink--; - DIP_SET(oip, i_nlink, oip->i_nlink); + DIP_SET_NLINK(oip, oip->i_nlink); UFS_INODE_SET_FLAG(oip, IN_CHANGE); } @@ -1274,7 +1274,7 @@ ufs_dirrewrite(struct inode *dp, struct inode *oip, ino_t newinum, int newtype, softdep_change_linkcnt(oip); } else { oip->i_nlink++; - DIP_SET(oip, i_nlink, oip->i_nlink); + DIP_SET_NLINK(oip, oip->i_nlink); UFS_INODE_SET_FLAG(oip, IN_CHANGE); } return (error); diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index a6ca523ae87c..949e7bcc1bec 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -1137,7 +1137,7 @@ ufs_link( ip->i_effnlink++; ip->i_nlink++; - DIP_SET(ip, i_nlink, ip->i_nlink); + DIP_SET_NLINK(ip, ip->i_nlink); UFS_INODE_SET_FLAG(ip, IN_CHANGE); if (DOINGSOFTDEP(vp)) softdep_setup_link(VTOI(tdvp), ip); @@ -1150,7 +1150,7 @@ ufs_link( if (error) { ip->i_effnlink--; ip->i_nlink--; - DIP_SET(ip, i_nlink, ip->i_nlink); + DIP_SET_NLINK(ip, ip->i_nlink); UFS_INODE_SET_FLAG(ip, IN_CHANGE); if (DOINGSOFTDEP(vp)) softdep_revert_link(VTOI(tdvp), ip); @@ -1541,7 +1541,7 @@ relock: */ fip->i_effnlink++; fip->i_nlink++; - DIP_SET(fip, i_nlink, fip->i_nlink); + DIP_SET_NLINK(fip, fip->i_nlink); UFS_INODE_SET_FLAG(fip, IN_CHANGE); if (DOINGSOFTDEP(fvp)) softdep_setup_link(tdp, fip); @@ -1570,7 +1570,7 @@ relock: if (tdp->i_nlink >= UFS_LINK_MAX) { fip->i_effnlink--; fip->i_nlink--; - DIP_SET(fip, i_nlink, fip->i_nlink); + DIP_SET_NLINK(fip, fip->i_nlink); UFS_INODE_SET_FLAG(fip, IN_CHANGE); if (DOINGSOFTDEP(fvp)) softdep_revert_link(tdp, fip); @@ -1693,11 +1693,11 @@ relock: */ if (!newparent) { tdp->i_nlink--; - DIP_SET(tdp, i_nlink, tdp->i_nlink); + DIP_SET_NLINK(tdp, tdp->i_nlink); UFS_INODE_SET_FLAG(tdp, IN_CHANGE); } tip->i_nlink--; - DIP_SET(tip, i_nlink, tip->i_nlink); + DIP_SET_NLINK(tip, tip->i_nlink); UFS_INODE_SET_FLAG(tip, IN_CHANGE); } } @@ -1732,7 +1732,7 @@ relock: if (tip == NULL) { tdp->i_effnlink++; tdp->i_nlink++; - DIP_SET(tdp, i_nlink, tdp->i_nlink); + DIP_SET_NLINK(tdp, tdp->i_nlink); UFS_INODE_SET_FLAG(tdp, IN_CHANGE); if (DOINGSOFTDEP(tdvp)) softdep_setup_dotdot_link(tdp, fip); @@ -1793,7 +1793,7 @@ unlockout: bad: fip->i_effnlink--; fip->i_nlink--; - DIP_SET(fip, i_nlink, fip->i_nlink); + DIP_SET_NLINK(fip, fip->i_nlink); UFS_INODE_SET_FLAG(fip, IN_CHANGE); if (DOINGSOFTDEP(fvp)) softdep_revert_link(tdp, fip); @@ -2137,7 +2137,7 @@ ufs_mkdir( tvp->v_type = VDIR; /* Rest init'd in getnewvnode(). */ ip->i_effnlink = 2; ip->i_nlink = 2; - DIP_SET(ip, i_nlink, 2); + DIP_SET_NLINK(ip, 2); DIP_SET(ip, i_dirdepth, DIP(dp,i_dirdepth) + 1); if (cnp->cn_flags & ISWHITEOUT) { @@ -2152,7 +2152,7 @@ ufs_mkdir( */ dp->i_effnlink++; dp->i_nlink++; - DIP_SET(dp, i_nlink, dp->i_nlink); + DIP_SET_NLINK(dp, dp->i_nlink); UFS_INODE_SET_FLAG(dp, IN_CHANGE); if (DOINGSOFTDEP(dvp)) softdep_setup_mkdir(dp, ip); @@ -2243,7 +2243,7 @@ bad: } else { dp->i_effnlink--; dp->i_nlink--; - DIP_SET(dp, i_nlink, dp->i_nlink); + DIP_SET_NLINK(dp, dp->i_nlink); UFS_INODE_SET_FLAG(dp, IN_CHANGE); /* * No need to do an explicit VOP_TRUNCATE here, vrele will @@ -2251,7 +2251,7 @@ bad: */ ip->i_effnlink = 0; ip->i_nlink = 0; - DIP_SET(ip, i_nlink, 0); + DIP_SET_NLINK(ip, 0); UFS_INODE_SET_FLAG(ip, IN_CHANGE); if (DOINGSOFTDEP(tvp)) softdep_revert_mkdir(dp, ip); @@ -2348,11 +2348,11 @@ ufs_rmdir( */ if (!DOINGSOFTDEP(vp)) { dp->i_nlink--; - DIP_SET(dp, i_nlink, dp->i_nlink); + DIP_SET_NLINK(dp, dp->i_nlink); UFS_INODE_SET_FLAG(dp, IN_CHANGE); error = UFS_UPDATE(dvp, 0); ip->i_nlink--; - DIP_SET(ip, i_nlink, ip->i_nlink); + DIP_SET_NLINK(ip, ip->i_nlink); UFS_INODE_SET_FLAG(ip, IN_CHANGE); } cache_vop_rmdir(dvp, vp); @@ -2893,7 +2893,7 @@ ufs_makeinode(int mode, struct vnode *dvp, struct vnode **vpp, tvp->v_type = IFTOVT(mode); /* Rest init'd in getnewvnode(). */ ip->i_effnlink = 1; ip->i_nlink = 1; - DIP_SET(ip, i_nlink, 1); + DIP_SET_NLINK(ip, 1); if (DOINGSOFTDEP(tvp)) softdep_setup_create(VTOI(dvp), ip); if ((ip->i_mode & ISGID) && !groupmember(ip->i_gid, cnp->cn_cred) && @@ -2949,7 +2949,7 @@ bad: */ ip->i_effnlink = 0; ip->i_nlink = 0; - DIP_SET(ip, i_nlink, 0); + DIP_SET_NLINK(ip, 0); UFS_INODE_SET_FLAG(ip, IN_CHANGE); if (DOINGSOFTDEP(tvp)) softdep_revert_create(VTOI(dvp), ip);