From d4ffe81e2bb738a304f6d6d65edd1fa4a56929e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Sat, 7 Jan 2023 16:10:01 +0000 Subject: [PATCH] copy: copy_file_range: handle ENOENT for CIFS * src/copy.c (sparse_copy): Fallback to standard copy upon ENOENT, which was seen intermittently across CIFS file systems. * NEWS: Mention the bug fix. Fixes https://bugs.gnu.org/60455 --- NEWS | 4 ++++ src/copy.c | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/NEWS b/NEWS index 3105df3f8..5cae1197e 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,10 @@ GNU coreutils NEWS -*- outline -*- which may have resulted in data corruption. [bug introduced in coreutils-7.5 and enabled by default in coreutils-9.0] + cp, mv, and install now handle ENOENT failures across CIFS file systems, + falling back from copy_file_range to a better supported standard copy. + [bug introduced in coreutils-9.0] + 'mv --backup=simple f d/' no longer mistakenly backs up d/f to f~. [bug introduced in coreutils-9.1] diff --git a/src/copy.c b/src/copy.c index 519c43b00..98f2ba45a 100644 --- a/src/copy.c +++ b/src/copy.c @@ -290,6 +290,11 @@ sparse_copy (int src_fd, int dest_fd, char **abuf, size_t buf_size, if (errno == EPERM && *total_n_read == 0) break; + /* ENOENT was seen sometimes across CIFS shares, resulting in + no data being copied, but subsequent standard copies succeed. */ + if (errno == ENOENT && *total_n_read == 0) + break; + if (errno == EINTR) n_copied = 0; else -- 2.26.2