@@ -209,7 +209,8 @@ static inline void __set_close_on_exec(int fd, struct fdtable *fdt)
static inline void __clear_close_on_exec(int fd, struct fdtable *fdt)
{
- __clear_bit(fd, fdt->close_on_exec);
+ if (test_bit(fd, fdt->close_on_exec))
+ __clear_bit(fd, fdt->close_on_exec);
}
static inline void __set_open_fd(int fd, struct fdtable *fdt)
@@ -309,7 +310,7 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
struct file *f = *old_fds++;
if (f) {
get_file(f);
- } else {
+ } else if (test_bit(open_files - i, new_fdt)) {
/*
* The fd may be claimed in the fd bitmap but not yet
* instantiated in the files array if a sibling thread
add test_bit() before clear close_on_exec and open_fds, by trace __clear_bit(), these 2 place are false in most times, we test it so that we don't need dirty cacheline, and we can win in most time. Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com> --- fs/file.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)