From nobody Wed Jun 22 12:36:02 2022 X-Original-To: dev-commits-src-all@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 551FE85CC45; Wed, 22 Jun 2022 12:36:03 +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 4LSjXz1Y5Nz3M3B; Wed, 22 Jun 2022 12:36:03 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655901363; 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=irfuuR1Uk/B2mzUPsmOaik8/b/V4GElZ4+EZAR+B8OA=; b=CIkM+GCmi5cbfSHUqWkFXja3DOJbXUVO22dMAEOVY7JH/j90GzfiNvDPhycmZlAyO4Xs4N C0zfWotAxeMZUL5B5aFUitOglIYKDahoPp14hXIe/brZUsB0IB6gRt/zhfC8vC9EzAE3pG FByC9HSQjnRqaw242NbENESJgIL4SUuwDNYR0splLgldQ6bSmmbukMgmd+VGyWbsKAAfwQ RWiqQ2tOGcTMmjkSqMq5OLXLZIB2oElqcQd4+3nfDCfM+SFxmnkWivR0jwwct1zUtrwTG/ nEWKPagOSuexpjiJmJ7ylUsVuSj8XoTK6/wxDV+jxf5p5hyJB63LXoNlayHQLw== 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 0A694260E7; Wed, 22 Jun 2022 12:36:03 +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 25MCa2eW093173; Wed, 22 Jun 2022 12:36:02 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25MCa2ZP093172; Wed, 22 Jun 2022 12:36:02 GMT (envelope-from git) Date: Wed, 22 Jun 2022 12:36:02 GMT Message-Id: <202206221236.25MCa2ZP093172@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 8db679af66b0 - main - UFS: make mkdir() and link() reliable when using SU and reaching nlink limit List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@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/main X-Git-Reftype: branch X-Git-Commit: 8db679af66b023802139d41e275e41a77da1c515 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655901363; 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=irfuuR1Uk/B2mzUPsmOaik8/b/V4GElZ4+EZAR+B8OA=; b=Qr5goCOS2P8KoPdhULdh+VRIz79gKTJ411V0gTuSfdBU8LM6pG7GhxNAQXY+IvWkH7DCor 7MQ+CngM0AJP9fI9JuHRHypuupCEsPmrnsCTh/mUv/55pWoCn0Ow5vWh79pnLCnGNZZ7JJ m8TzRGzaFuhxUWlxW5dszdHOItYIE5nFXtpr2hYWHNSRAXhos926ErPXCyud+BLUZwLIzH OEK/jLEETWbTbB74cJMINoX5k4V224nwJkwRzI/IJq3FFgOpney0sXuqkdbURICuoQZvwE f5Zc44vMdOVXUg3Sl7xZ4KSxJOhJq4nAtIuv1w8tPGUunoFiIPfMMcpumTFosg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1655901363; a=rsa-sha256; cv=none; b=eRL6XsrpABdpg6HWQ1RGbet4KKQ6KbBBDQW/F7svUvBVuOVUZ6NbVc7AIKszT2VRUweUW8 nRb3AX3FYjZVwCF3Qs24Ysa7ryGAUgmDqBh3F+00jH2LhwqBCcm72ZbfB5vDwg+ZT/pwW9 MEsSJYc2OihzEx4oWg+wSppD4rn+XLutP1/O82e2DyhnAX+JDX0TbOiLnB6v2CATQ/QdKW GRJjPqlSHgiMumRHgaQtzwOVlnF4bHxeqd21vVG7nr2cCLFeJWM1T/GwY9eXEsuafBmFuZ 7WV3Ol3HsIu2q7Q3g0ehnGE7tYhRvGRfZLffk+Cn3PksOk8kD2NHMPUssoX+qQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=8db679af66b023802139d41e275e41a77da1c515 commit 8db679af66b023802139d41e275e41a77da1c515 Author: Konstantin Belousov AuthorDate: 2022-06-18 10:59:31 +0000 Commit: Konstantin Belousov CommitDate: 2022-06-22 12:35:47 +0000 UFS: make mkdir() and link() reliable when using SU and reaching nlink limit i_nlink overflow might be transient, i_effnlink indicates the final value of the link count after all dependencies would be resolved. So if i_nlink reached the maximum but i_efflink did not, we should be able to make the link by syncing. We must sync the whole filesystem to resolve dependencies, which requires unlocking vnodes locked for VOPs. Use existing ERELOOKUP/VOP_UNLOCK_PAIR() mechanism to restart the VOP if sync with unlock was done. PR: 165392 Reported by: Vsevolod Volkov Reviewed by: mckusick Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D35514 --- 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 13116e8224f3..2def837c157a 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;