mirror of
https://git.yoctoproject.org/poky
synced 2026-01-29 21:08:42 +01:00
findutils: make -delete honour the -ignore_readdir_race option
the '-delete' action no longer complains about disappeared files when the '-ignore_readdir_race' option is given, too. That action will also returns true in such a case now. (From OE-Core rev: f0808ee03a244be1fb485e0046983a05193b23b6) Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
4623554463
commit
ac6f587692
@@ -0,0 +1,145 @@
|
||||
From 0afb2efada7e435ae18ef7d3db0758464189f44f Mon Sep 17 00:00:00 2001
|
||||
From: Bernhard Voelker <mail@bernhard-voelker.de>
|
||||
Date: Tue, 30 Jan 2018 23:30:09 +0100
|
||||
Subject: find: make -delete honour the -ignore_readdir_race option
|
||||
|
||||
* find/pred.c (pred_delete): Return true when the -ignore_readdir_race
|
||||
option is active and unlinkat() came back with ENOENT.
|
||||
* doc/find.texi (Option -ignore_readdir_race): Document the change.
|
||||
(Action -delete): Likewise.
|
||||
* find/find.1: Likewise.
|
||||
* NEWS (Bug Fixes): Mention the fix.
|
||||
|
||||
For now, it seems a bit hard to add a proper test for this,
|
||||
so the following shell snippet demonstrates the race:
|
||||
|
||||
$ seq 10 | xargs touch
|
||||
$ env time -f 'find exit status: %x\nfind time: %e' \
|
||||
find -ignore_readdir_race -type f \
|
||||
-delete \
|
||||
-exec sh -c 'sleep $(basename {})' \; \
|
||||
-printf 'find deleted: %p\n' \
|
||||
& \
|
||||
sleep 20; \
|
||||
seq 10 | xargs rm -fv; \
|
||||
wait $!
|
||||
|
||||
Reported by Alexander Golubev in
|
||||
https://savannah.gnu.org/bugs/?52981
|
||||
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com>
|
||||
---
|
||||
NEWS | 4 ++++
|
||||
doc/find.texi | 15 ++++++++++++++-
|
||||
find/find.1 | 22 ++++++++++++++++++++++
|
||||
find/pred.c | 6 ++++++
|
||||
4 files changed, 46 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index 88cf17d..9809bf4 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -42,6 +42,10 @@
|
||||
|
||||
** Bug Fixes
|
||||
|
||||
+#52981: find: the '-delete' action no longer complains about disappeared files
|
||||
+ when the '-ignore_readdir_race' option is given, too. That action will
|
||||
+ also returns true in such a case now.
|
||||
+
|
||||
Applied patch #8688: Spelling fixes.
|
||||
|
||||
* Major changes in release 4.5.18, 2015-12-27
|
||||
diff --git a/doc/find.texi b/doc/find.texi
|
||||
index 3580be7..0089193 100644
|
||||
--- a/doc/find.texi
|
||||
+++ b/doc/find.texi
|
||||
@@ -1418,7 +1418,15 @@ gives a significant increase in search speed.
|
||||
If a file disappears after its name has been read from a directory but
|
||||
before @code{find} gets around to examining the file with @code{stat},
|
||||
don't issue an error message. If you don't specify this option, an
|
||||
-error message will be issued. This option can be useful in system
|
||||
+error message will be issued.
|
||||
+
|
||||
+Furthermore, @code{find} with the @samp{-ignore_readdir_race} option
|
||||
+will ignore errors of the @samp{-delete} action in the case the file
|
||||
+has disappeared since the parent directory was read: it will not output
|
||||
+an error diagnostic, and the return code of the @samp{-delete} action
|
||||
+will be true.
|
||||
+
|
||||
+This option can be useful in system
|
||||
scripts (cron scripts, for example) that examine areas of the
|
||||
filesystem that change frequently (mail queues, temporary directories,
|
||||
and so forth), because this scenario is common for those sorts of
|
||||
@@ -2779,6 +2787,11 @@ explicitly.
|
||||
|
||||
If @samp{-delete} fails, @code{find}'s exit status will be nonzero
|
||||
(when it eventually exits).
|
||||
+
|
||||
+Together with the @samp{-ignore_readdir_race} option, @code{find} will
|
||||
+ignore errors of the @samp{-delete} action in the case the file has disappeared
|
||||
+since the parent directory was read: it will not output an error diagnostic, and
|
||||
+the return code of the @samp{-delete} action will be true.
|
||||
@end deffn
|
||||
|
||||
@node Adding Tests
|
||||
diff --git a/find/find.1 b/find/find.1
|
||||
index 0437cd8..0d44c37 100644
|
||||
--- a/find/find.1
|
||||
+++ b/find/find.1
|
||||
@@ -479,6 +479,17 @@ this option on and part of it with this option off
|
||||
(if you need to do that, you will need to issue two \fBfind\fR commands
|
||||
instead, one with the option and one without it).
|
||||
|
||||
+Furthermore,
|
||||
+.B find
|
||||
+with the
|
||||
+.B \-ignore_readdir_race
|
||||
+option will ignore errors of the
|
||||
+.B \-delete
|
||||
+action in the case the file has disappeared since the parent directory was read:
|
||||
+it will not output an error diagnostic, and the return code of the
|
||||
+.B \-delete
|
||||
+action will be true.
|
||||
+
|
||||
.IP "\-maxdepth \fIlevels\fR"
|
||||
Descend at most \fIlevels\fR (a non-negative integer) levels of
|
||||
directories below the starting-points.
|
||||
@@ -1030,6 +1041,17 @@ and
|
||||
.B \-delete
|
||||
together.
|
||||
|
||||
+Together with the
|
||||
+.B \-ignore_readdir_race
|
||||
+option,
|
||||
+.B find
|
||||
+will ignore errors of the
|
||||
+.B \-delete
|
||||
+action in the case the file has disappeared since the parent directory was
|
||||
+read: it will not output an error diagnostic, and the return code of the
|
||||
+.B \-delete
|
||||
+action will be true.
|
||||
+
|
||||
.IP "\-exec \fIcommand\fR ;"
|
||||
Execute \fIcommand\fR; true if 0 status is returned. All following
|
||||
arguments to
|
||||
diff --git a/find/pred.c b/find/pred.c
|
||||
index 7e2a7bd..af3bacb 100644
|
||||
--- a/find/pred.c
|
||||
+++ b/find/pred.c
|
||||
@@ -324,6 +324,12 @@ pred_delete (const char *pathname, struct stat *stat_buf, struct predicate *pred
|
||||
}
|
||||
else
|
||||
{
|
||||
+ if (ENOENT == errno && options.ignore_readdir_race)
|
||||
+ {
|
||||
+ /* Ignore unlink() error for vanished files. */
|
||||
+ errno = 0;
|
||||
+ return true;
|
||||
+ }
|
||||
if (EISDIR == errno)
|
||||
{
|
||||
if ((flags & AT_REMOVEDIR) == 0)
|
||||
--
|
||||
cgit v1.0-41-gc330
|
||||
@@ -6,7 +6,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=f27defe1e96c2e1ecd4e0c9be8967949"
|
||||
|
||||
DEPENDS = "bison-native"
|
||||
|
||||
SRC_URI += "file://0001-Unset-need_charset_alias-when-building-for-musl.patch"
|
||||
SRC_URI += "file://0001-Unset-need_charset_alias-when-building-for-musl.patch \
|
||||
file://0001-find-make-delete-honour-the-ignore_readdir_race-opti.patch \
|
||||
"
|
||||
|
||||
SRC_URI[md5sum] = "9936aa8009438ce185bea2694a997fc1"
|
||||
SRC_URI[sha256sum] = "ded4c9f73731cd48fec3b6bdaccce896473b6d8e337e9612e16cf1431bb1169d"
|
||||
|
||||
Reference in New Issue
Block a user