Date: Sun, 9 Nov 2025 03:49:04 GMT From: "Jason A. Harmening" <jah@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 8b92a6ad597e - main - rm(1): remove whiteouts when forcibly removing directories Message-ID: <202511090349.5A93n4YX055219@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch main has been updated by jah: URL: https://cgit.FreeBSD.org/src/commit/?id=8b92a6ad597e224b616a8b1d6983f3b55c85308e commit 8b92a6ad597e224b616a8b1d6983f3b55c85308e Author: Jason A. Harmening <jah@FreeBSD.org> AuthorDate: 2025-11-08 04:23:02 +0000 Commit: Jason A. Harmening <jah@FreeBSD.org> CommitDate: 2025-11-09 03:47:15 +0000 rm(1): remove whiteouts when forcibly removing directories Commit 2ed053cde5 changed UFS' VOP_RMDIR() behavior to no longer ignore whiteouts when determining whether a directory is empty, unless explicitly requested by the caller. However, this also necessitates a change to rm(1) to avoid breaking the expected behavior when forcibly removing directory hierarchies via `rm -fr`. I neglected to make this follow-on change despite discussing it in the review for the breaking commit (D45987). Finally address the breakage by making `rm -fr` imply FTS_WHITEOUT when rm(1) reads directory contents via fts_read(3). While here, also fix a logic error which produces a spurious 'No error' warning message on stdout for each deleted whiteout. Reported by: csjp Reviewed by: csjp, kib, olce MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D53640 --- bin/rm/rm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/rm/rm.c b/bin/rm/rm.c index 16bbf7403fd4..2c41d7380cea 100644 --- a/bin/rm/rm.c +++ b/bin/rm/rm.c @@ -184,7 +184,7 @@ rm_tree(char **argv) flags = FTS_PHYSICAL; if (!needstat) flags |= FTS_NOSTAT; - if (Wflag) + if (Wflag || fflag) flags |= FTS_WHITEOUT; if (xflag) flags |= FTS_XDEV; @@ -273,7 +273,7 @@ rm_tree(char **argv) case FTS_W: rval = undelete(p->fts_accpath); - if (rval == 0 && (fflag && errno == ENOENT)) { + if (rval == 0 || (fflag && errno == ENOENT)) { if (vflag) (void)printf("%s\n", p->fts_path);help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202511090349.5A93n4YX055219>
