From nobody Wed Jun 29 09:39:29 2022 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 ACDEA873DBF; Wed, 29 Jun 2022 09:39:29 +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 4LXxJ14QFTz3PWq; Wed, 29 Jun 2022 09:39:29 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1656495569; 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=IaX/j5kF7+T/LMTg/RQc5Lq7lY/5hzjnGThmYc2boSQ=; b=cn3c6UzMX42JyOgpne9xmAhOFyoRh+MPVqBzrHFIXK2aFT3QUlxK+apE5zAvvnkKOpgjcm wlz2DwRYIdEyjI31NJ6+Bb8T96JhRcHQW84rgEyZ15EX9TFX6c1LB296JNFnsDWAIPYPZY wCNZBm1e0qW1nYAb8XZm5N+r0WNvHbQCGBSbo+OSuN6l9Gh5v+BGd8dkeWAPP/D073wjR5 d8kDMmDHxEOvOoNYVmJjI/vkn0m6zKUnTQbqtrIrIsOw3N8t3hB9Jo7vUUYTMI1YXln/cc LV8xUKcLHCyB1C1XRnc388bp+NXt8TUJZOrzygThCyTv2PiwGL0BCtdA2KNwbg== 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 77DCC70F1; Wed, 29 Jun 2022 09:39:29 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 25T9dTME015214; Wed, 29 Jun 2022 09:39:29 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25T9dTRK015213; Wed, 29 Jun 2022 09:39:29 GMT (envelope-from git) Date: Wed, 29 Jun 2022 09:39:29 GMT Message-Id: <202206290939.25T9dTRK015213@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: 65d8e97c4c23 - stable/13 - UFS: make mkdir() and link() reliable when using SU and reaching nlink limit 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: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 65d8e97c4c23a0b27d9e0bc73e4150ebbb00b844 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1656495569; 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=IaX/j5kF7+T/LMTg/RQc5Lq7lY/5hzjnGThmYc2boSQ=; b=YOD8TLHWLzYu2LKugrSrx9T4mS83ilD9SV97rboFVzP+4nbXcQmS83N2qtudkMhvmlpnXr Pw0mDEdVM60zcRBSK94cmdpXU4IKppT0OkPFCalxYciKv4mMcePPcRPDpE+pgxK5fmzaUw HKJX1ixH1bu/hOINatE8z5NxewmaqBIW7FDyZIsSf9Yc3EyRSh2SgW31w3pyLB0DJ9i5Wb T1SVnpPQpnQAW7f3UzmyUZCDGtPo1wReU7LSCPAklyG9a121LZ6pPcMdMEoQLgxgh7iQJB dlojBu7oBY+Oq/Or9rEzPYGP+2J5n3SzCsYxCqY4M/kRxkUhA0hn6jPz7ONloQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1656495569; a=rsa-sha256; cv=none; b=gXcqdX1piGJnTvnrrQ46BSXXnTGdIMjba9YKrx7OKEkIrJp9CxUJAC9FPqm7OAsHAxlVEo jmMIQNgwi6CpewrhP5dSY4W+Qs+0NIZ1PfVQm/sPgQSDLGSfiotddQrzUAcV+zvm8gcpb5 bRwn+KKrWDZqnRXnaJobHIKHgUPmBWk/8GljksqEdCl4nYwXvK1XqG/tLsG3kNOOUvNkK4 fJlpdzNSTIbQHm1rGp6SHFnsX35eBmG3gBX3FGHbwGjREXh9RJAqklHHerOQ7oc5tmIIaV WzIFL2CdYg1/YKiIQuR0jFDDJdWkRMdMuAJIRrVXtDiv0w/+2L1nWzuuh/Dstg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=65d8e97c4c23a0b27d9e0bc73e4150ebbb00b844 commit 65d8e97c4c23a0b27d9e0bc73e4150ebbb00b844 Author: Konstantin Belousov AuthorDate: 2022-06-18 10:59:31 +0000 Commit: Konstantin Belousov CommitDate: 2022-06-29 09:38:26 +0000 UFS: make mkdir() and link() reliable when using SU and reaching nlink limit PR: 165392 (cherry picked from commit 8db679af66b023802139d41e275e41a77da1c515) --- sys/ufs/ufs/ufs_vnops.c | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index b4d23545fb0b..4353c51afcbe 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -196,6 +196,35 @@ ufs_itimes(struct vnode *vp) VI_UNLOCK(vp); } +static int +ufs_sync_nlink(struct vnode *vp, struct vnode *vp1) +{ + struct inode *ip; + struct mount *mp; + int error; + + ip = VTOI(vp); + if (ip->i_nlink < UFS_LINK_MAX) + return (0); + if (!DOINGSOFTDEP(vp) || ip->i_effnlink >= UFS_LINK_MAX) + return (EMLINK); + + mp = vp->v_mount; + vfs_ref(mp); + VOP_UNLOCK(vp); + if (vp1 != NULL) + VOP_UNLOCK(vp1); + error = vfs_busy(mp, 0); + if (error == 0) { + VFS_SYNC(mp, MNT_WAIT); + vfs_unbusy(mp); + error = ERELOOKUP; + } + vfs_rel(mp); + vn_lock_pair(vp, false, vp1, false); + return (error); +} + /* * Create a regular file */ @@ -1086,11 +1115,11 @@ ufs_link(ap) error = EINVAL; goto out; } - ip = VTOI(vp); - if (ip->i_nlink >= UFS_LINK_MAX) { - error = EMLINK; + error = ufs_sync_nlink(vp, tdvp); + if (error != 0) goto out; - } + ip = VTOI(vp); + /* * The file may have been removed after namei dropped the original * lock. @@ -1950,10 +1979,9 @@ ufs_mkdir(ap) panic("ufs_mkdir: no name"); #endif dp = VTOI(dvp); - if (dp->i_nlink >= UFS_LINK_MAX) { - error = EMLINK; + error = ufs_sync_nlink(dvp, NULL); + if (error != 0) goto out; - } dmode = vap->va_mode & 0777; dmode |= IFDIR;