From ac6f587692968956d069d2a1a508e659d8560d16 Mon Sep 17 00:00:00 2001 From: Zhixiong Chi Date: Tue, 19 Jun 2018 03:24:18 -0700 Subject: 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 Signed-off-by: Richard Purdie --- ...elete-honour-the-ignore_readdir_race-opti.patch | 145 +++++++++++++++++++++ meta/recipes-extended/findutils/findutils_4.6.0.bb | 4 +- 2 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 meta/recipes-extended/findutils/findutils/0001-find-make-delete-honour-the-ignore_readdir_race-opti.patch (limited to 'meta/recipes-extended/findutils') diff --git a/meta/recipes-extended/findutils/findutils/0001-find-make-delete-honour-the-ignore_readdir_race-opti.patch b/meta/recipes-extended/findutils/findutils/0001-find-make-delete-honour-the-ignore_readdir_race-opti.patch new file mode 100644 index 0000000000..420e10da02 --- /dev/null +++ b/meta/recipes-extended/findutils/findutils/0001-find-make-delete-honour-the-ignore_readdir_race-opti.patch @@ -0,0 +1,145 @@ +From 0afb2efada7e435ae18ef7d3db0758464189f44f Mon Sep 17 00:00:00 2001 +From: Bernhard Voelker +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 +--- + 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 diff --git a/meta/recipes-extended/findutils/findutils_4.6.0.bb b/meta/recipes-extended/findutils/findutils_4.6.0.bb index 072d3b3c05..db03252f54 100644 --- a/meta/recipes-extended/findutils/findutils_4.6.0.bb +++ b/meta/recipes-extended/findutils/findutils_4.6.0.bb @@ -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" -- cgit v1.2.3-54-g00ecf