From 102ab18146bec18e7093c4029325faae3bc9f94e Mon Sep 17 00:00:00 2001 From: Christian Ebner Date: Thu, 14 Nov 2024 15:41:12 +0100 Subject: [PATCH] client: pxar: skip directory entries on stale file handle Skip over the entries when a stale file handle is encountered during generation of the entry list of a directory entry. This will lead to the directory not being backed up if the directory itself was invalidated, as then reading all child entries will fail also, or the directory is backed up without entries which have been invalidated. Signed-off-by: Christian Ebner --- pbs-client/src/pxar/create.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/pbs-client/src/pxar/create.rs b/pbs-client/src/pxar/create.rs index 8196c49d..a7521424 100644 --- a/pbs-client/src/pxar/create.rs +++ b/pbs-client/src/pxar/create.rs @@ -641,15 +641,30 @@ impl Archiver { } Ok(_) => (), Err(err) if err.not_found() => continue, + Err(Errno::ESTALE) => { + self.report_stale_file_handle(Some(&full_path)); + continue; + } Err(err) => { return Err(err).with_context(|| format!("stat failed on {full_path:?}")) } } - let stat = stat_results - .map(Ok) - .unwrap_or_else(get_file_mode) - .with_context(|| format!("stat failed on {full_path:?}"))?; + let stat = match stat_results { + Some(mode) => mode, + None => match get_file_mode() { + Ok(mode) => mode, + Err(Errno::ESTALE) => { + self.report_stale_file_handle(Some(&full_path)); + continue; + } + Err(err) => { + return Err( + Error::from(err).context(format!("stat failed on {full_path:?}")) + ) + } + }, + }; self.entry_counter += 1; if self.entry_counter > self.entry_limit {