diff options
author | Zhixiong Chi <zhixiong.chi@windriver.com> | 2018-06-19 03:24:18 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-06-21 09:34:40 +0100 |
commit | ac6f587692968956d069d2a1a508e659d8560d16 (patch) | |
tree | 700e9e6379c72ac4be41ed7a2c35bdc4abcbdf78 | |
parent | 4623554463685000907eb3e17b4b23136f3759a2 (diff) | |
download | poky-ac6f587692968956d069d2a1a508e659d8560d16.tar.gz |
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>
-rw-r--r-- | meta/recipes-extended/findutils/findutils/0001-find-make-delete-honour-the-ignore_readdir_race-opti.patch | 145 | ||||
-rw-r--r-- | meta/recipes-extended/findutils/findutils_4.6.0.bb | 4 |
2 files changed, 148 insertions, 1 deletions
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 @@ | |||
1 | From 0afb2efada7e435ae18ef7d3db0758464189f44f Mon Sep 17 00:00:00 2001 | ||
2 | From: Bernhard Voelker <mail@bernhard-voelker.de> | ||
3 | Date: Tue, 30 Jan 2018 23:30:09 +0100 | ||
4 | Subject: find: make -delete honour the -ignore_readdir_race option | ||
5 | |||
6 | * find/pred.c (pred_delete): Return true when the -ignore_readdir_race | ||
7 | option is active and unlinkat() came back with ENOENT. | ||
8 | * doc/find.texi (Option -ignore_readdir_race): Document the change. | ||
9 | (Action -delete): Likewise. | ||
10 | * find/find.1: Likewise. | ||
11 | * NEWS (Bug Fixes): Mention the fix. | ||
12 | |||
13 | For now, it seems a bit hard to add a proper test for this, | ||
14 | so the following shell snippet demonstrates the race: | ||
15 | |||
16 | $ seq 10 | xargs touch | ||
17 | $ env time -f 'find exit status: %x\nfind time: %e' \ | ||
18 | find -ignore_readdir_race -type f \ | ||
19 | -delete \ | ||
20 | -exec sh -c 'sleep $(basename {})' \; \ | ||
21 | -printf 'find deleted: %p\n' \ | ||
22 | & \ | ||
23 | sleep 20; \ | ||
24 | seq 10 | xargs rm -fv; \ | ||
25 | wait $! | ||
26 | |||
27 | Reported by Alexander Golubev in | ||
28 | https://savannah.gnu.org/bugs/?52981 | ||
29 | |||
30 | Upstream-Status: Backport | ||
31 | Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com> | ||
32 | --- | ||
33 | NEWS | 4 ++++ | ||
34 | doc/find.texi | 15 ++++++++++++++- | ||
35 | find/find.1 | 22 ++++++++++++++++++++++ | ||
36 | find/pred.c | 6 ++++++ | ||
37 | 4 files changed, 46 insertions(+), 1 deletion(-) | ||
38 | |||
39 | diff --git a/NEWS b/NEWS | ||
40 | index 88cf17d..9809bf4 100644 | ||
41 | --- a/NEWS | ||
42 | +++ b/NEWS | ||
43 | @@ -42,6 +42,10 @@ | ||
44 | |||
45 | ** Bug Fixes | ||
46 | |||
47 | +#52981: find: the '-delete' action no longer complains about disappeared files | ||
48 | + when the '-ignore_readdir_race' option is given, too. That action will | ||
49 | + also returns true in such a case now. | ||
50 | + | ||
51 | Applied patch #8688: Spelling fixes. | ||
52 | |||
53 | * Major changes in release 4.5.18, 2015-12-27 | ||
54 | diff --git a/doc/find.texi b/doc/find.texi | ||
55 | index 3580be7..0089193 100644 | ||
56 | --- a/doc/find.texi | ||
57 | +++ b/doc/find.texi | ||
58 | @@ -1418,7 +1418,15 @@ gives a significant increase in search speed. | ||
59 | If a file disappears after its name has been read from a directory but | ||
60 | before @code{find} gets around to examining the file with @code{stat}, | ||
61 | don't issue an error message. If you don't specify this option, an | ||
62 | -error message will be issued. This option can be useful in system | ||
63 | +error message will be issued. | ||
64 | + | ||
65 | +Furthermore, @code{find} with the @samp{-ignore_readdir_race} option | ||
66 | +will ignore errors of the @samp{-delete} action in the case the file | ||
67 | +has disappeared since the parent directory was read: it will not output | ||
68 | +an error diagnostic, and the return code of the @samp{-delete} action | ||
69 | +will be true. | ||
70 | + | ||
71 | +This option can be useful in system | ||
72 | scripts (cron scripts, for example) that examine areas of the | ||
73 | filesystem that change frequently (mail queues, temporary directories, | ||
74 | and so forth), because this scenario is common for those sorts of | ||
75 | @@ -2779,6 +2787,11 @@ explicitly. | ||
76 | |||
77 | If @samp{-delete} fails, @code{find}'s exit status will be nonzero | ||
78 | (when it eventually exits). | ||
79 | + | ||
80 | +Together with the @samp{-ignore_readdir_race} option, @code{find} will | ||
81 | +ignore errors of the @samp{-delete} action in the case the file has disappeared | ||
82 | +since the parent directory was read: it will not output an error diagnostic, and | ||
83 | +the return code of the @samp{-delete} action will be true. | ||
84 | @end deffn | ||
85 | |||
86 | @node Adding Tests | ||
87 | diff --git a/find/find.1 b/find/find.1 | ||
88 | index 0437cd8..0d44c37 100644 | ||
89 | --- a/find/find.1 | ||
90 | +++ b/find/find.1 | ||
91 | @@ -479,6 +479,17 @@ this option on and part of it with this option off | ||
92 | (if you need to do that, you will need to issue two \fBfind\fR commands | ||
93 | instead, one with the option and one without it). | ||
94 | |||
95 | +Furthermore, | ||
96 | +.B find | ||
97 | +with the | ||
98 | +.B \-ignore_readdir_race | ||
99 | +option will ignore errors of the | ||
100 | +.B \-delete | ||
101 | +action in the case the file has disappeared since the parent directory was read: | ||
102 | +it will not output an error diagnostic, and the return code of the | ||
103 | +.B \-delete | ||
104 | +action will be true. | ||
105 | + | ||
106 | .IP "\-maxdepth \fIlevels\fR" | ||
107 | Descend at most \fIlevels\fR (a non-negative integer) levels of | ||
108 | directories below the starting-points. | ||
109 | @@ -1030,6 +1041,17 @@ and | ||
110 | .B \-delete | ||
111 | together. | ||
112 | |||
113 | +Together with the | ||
114 | +.B \-ignore_readdir_race | ||
115 | +option, | ||
116 | +.B find | ||
117 | +will ignore errors of the | ||
118 | +.B \-delete | ||
119 | +action in the case the file has disappeared since the parent directory was | ||
120 | +read: it will not output an error diagnostic, and the return code of the | ||
121 | +.B \-delete | ||
122 | +action will be true. | ||
123 | + | ||
124 | .IP "\-exec \fIcommand\fR ;" | ||
125 | Execute \fIcommand\fR; true if 0 status is returned. All following | ||
126 | arguments to | ||
127 | diff --git a/find/pred.c b/find/pred.c | ||
128 | index 7e2a7bd..af3bacb 100644 | ||
129 | --- a/find/pred.c | ||
130 | +++ b/find/pred.c | ||
131 | @@ -324,6 +324,12 @@ pred_delete (const char *pathname, struct stat *stat_buf, struct predicate *pred | ||
132 | } | ||
133 | else | ||
134 | { | ||
135 | + if (ENOENT == errno && options.ignore_readdir_race) | ||
136 | + { | ||
137 | + /* Ignore unlink() error for vanished files. */ | ||
138 | + errno = 0; | ||
139 | + return true; | ||
140 | + } | ||
141 | if (EISDIR == errno) | ||
142 | { | ||
143 | if ((flags & AT_REMOVEDIR) == 0) | ||
144 | -- | ||
145 | 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" | |||
6 | 6 | ||
7 | DEPENDS = "bison-native" | 7 | DEPENDS = "bison-native" |
8 | 8 | ||
9 | SRC_URI += "file://0001-Unset-need_charset_alias-when-building-for-musl.patch" | 9 | SRC_URI += "file://0001-Unset-need_charset_alias-when-building-for-musl.patch \ |
10 | file://0001-find-make-delete-honour-the-ignore_readdir_race-opti.patch \ | ||
11 | " | ||
10 | 12 | ||
11 | SRC_URI[md5sum] = "9936aa8009438ce185bea2694a997fc1" | 13 | SRC_URI[md5sum] = "9936aa8009438ce185bea2694a997fc1" |
12 | SRC_URI[sha256sum] = "ded4c9f73731cd48fec3b6bdaccce896473b6d8e337e9612e16cf1431bb1169d" | 14 | SRC_URI[sha256sum] = "ded4c9f73731cd48fec3b6bdaccce896473b6d8e337e9612e16cf1431bb1169d" |