mirror of
https://git.proxmox.com/git/proxmox-backup
synced 2025-08-11 16:32:31 +00:00
Merge branch '3.2.6'
branched off to avoid a breaking change on master
This commit is contained in:
commit
1d36b502f5
@ -1,5 +1,5 @@
|
||||
[workspace.package]
|
||||
version = "3.2.5"
|
||||
version = "3.2.6"
|
||||
authors = [
|
||||
"Dietmar Maurer <dietmar@proxmox.com>",
|
||||
"Dominik Csapak <d.csapak@proxmox.com>",
|
||||
@ -86,7 +86,7 @@ proxmox-uuid = "1"
|
||||
# other proxmox crates
|
||||
pathpatterns = "0.3"
|
||||
proxmox-acme = "0.5"
|
||||
pxar = "0.11.1"
|
||||
pxar = "0.12"
|
||||
|
||||
# PBS workspace
|
||||
pbs-api-types = { path = "pbs-api-types" }
|
||||
|
12
debian/changelog
vendored
12
debian/changelog
vendored
@ -1,3 +1,15 @@
|
||||
rust-proxmox-backup (3.2.6-1) bookworm; urgency=medium
|
||||
|
||||
* tape: disable Programmable Early Warning Zone (PEWZ)
|
||||
|
||||
* tape: handle PEWZ like regular early warning
|
||||
|
||||
* docs: add note for not using remote storages
|
||||
|
||||
* client: pxar: fix fuse mount performance for split archives
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Mon, 17 Jun 2024 10:18:13 +0200
|
||||
|
||||
rust-proxmox-backup (3.2.5-1) bookworm; urgency=medium
|
||||
|
||||
* pxar: add support for split archives
|
||||
|
2
debian/control
vendored
2
debian/control
vendored
@ -103,7 +103,7 @@ Build-Depends: bash-completion,
|
||||
librust-proxmox-time-1+default-dev (>= 1.1.6-~~),
|
||||
librust-proxmox-uuid-1+default-dev,
|
||||
librust-proxmox-uuid-1+serde-dev,
|
||||
librust-pxar-0.11+default-dev (>= 0.11.1-~~),
|
||||
librust-pxar-0.12+default-dev,
|
||||
librust-regex-1+default-dev (>= 1.5.5-~~),
|
||||
librust-rustyline-9+default-dev,
|
||||
librust-serde-1+default-dev,
|
||||
|
@ -373,26 +373,22 @@ where
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
(true, EntryKind::File { size, .. }) => {
|
||||
let contents = self.decoder.contents();
|
||||
|
||||
if let Some(mut contents) = contents {
|
||||
self.extractor.extract_file(
|
||||
&file_name,
|
||||
metadata,
|
||||
*size,
|
||||
&mut contents,
|
||||
self.extractor
|
||||
.overwrite_flags
|
||||
.contains(OverwriteFlags::FILE),
|
||||
)
|
||||
} else {
|
||||
Err(format_err!(
|
||||
"found regular file entry without contents in archive"
|
||||
))
|
||||
}
|
||||
.context(PxarExtractContext::ExtractFile)
|
||||
(true, EntryKind::File { size, .. }) => match self.decoder.contents() {
|
||||
Ok(Some(mut contents)) => self.extractor.extract_file(
|
||||
&file_name,
|
||||
metadata,
|
||||
*size,
|
||||
&mut contents,
|
||||
self.extractor
|
||||
.overwrite_flags
|
||||
.contains(OverwriteFlags::FILE),
|
||||
),
|
||||
Ok(None) => Err(format_err!(
|
||||
"found regular file entry without contents in archive"
|
||||
)),
|
||||
Err(err) => Err(err.into()),
|
||||
}
|
||||
.context(PxarExtractContext::ExtractFile),
|
||||
(false, _) => Ok(()), // skip this
|
||||
};
|
||||
|
||||
@ -872,7 +868,8 @@ where
|
||||
match entry.kind() {
|
||||
EntryKind::File { .. } => {
|
||||
let size = decoder.content_size().unwrap_or(0);
|
||||
tar_add_file(&mut tarencoder, decoder.contents(), size, metadata, path).await?
|
||||
let contents = decoder.contents().await?;
|
||||
tar_add_file(&mut tarencoder, contents, size, metadata, path).await?
|
||||
}
|
||||
EntryKind::Hardlink(link) => {
|
||||
if !link.data.is_empty() {
|
||||
@ -894,14 +891,9 @@ where
|
||||
path
|
||||
} else {
|
||||
let size = decoder.content_size().unwrap_or(0);
|
||||
tar_add_file(
|
||||
&mut tarencoder,
|
||||
decoder.contents(),
|
||||
size,
|
||||
metadata,
|
||||
path,
|
||||
)
|
||||
.await?;
|
||||
let contents = decoder.contents().await?;
|
||||
tar_add_file(&mut tarencoder, contents, size, metadata, path)
|
||||
.await?;
|
||||
hardlinks.insert(realpath.to_owned(), path.to_owned());
|
||||
continue;
|
||||
}
|
||||
@ -1038,7 +1030,8 @@ where
|
||||
metadata.stat.mode as u16,
|
||||
true,
|
||||
);
|
||||
zip.add_entry(entry, decoder.contents())
|
||||
let contents = decoder.contents().await?;
|
||||
zip.add_entry(entry, contents)
|
||||
.await
|
||||
.context("could not send file entry")?;
|
||||
}
|
||||
@ -1056,7 +1049,8 @@ where
|
||||
metadata.stat.mode as u16,
|
||||
true,
|
||||
);
|
||||
zip.add_entry(entry, decoder.contents())
|
||||
let contents = decoder.contents().await?;
|
||||
zip.add_entry(entry, contents)
|
||||
.await
|
||||
.context("could not send file entry")?;
|
||||
}
|
||||
@ -1279,14 +1273,16 @@ where
|
||||
.with_context(|| format!("error at entry {file_name_os:?}"))?;
|
||||
}
|
||||
EntryKind::File { size, .. } => {
|
||||
let mut contents = decoder
|
||||
.contents()
|
||||
.await?
|
||||
.context("found regular file entry without contents in archive")?;
|
||||
extractor
|
||||
.async_extract_file(
|
||||
&file_name,
|
||||
metadata,
|
||||
*size,
|
||||
&mut decoder
|
||||
.contents()
|
||||
.context("found regular file entry without contents in archive")?,
|
||||
&mut contents,
|
||||
extractor.overwrite_flags.contains(OverwriteFlags::FILE),
|
||||
)
|
||||
.await?
|
||||
|
@ -5,7 +5,6 @@ use std::ffi::{OsStr, OsString};
|
||||
use std::future::Future;
|
||||
use std::io;
|
||||
use std::mem;
|
||||
use std::ops::Range;
|
||||
use std::os::unix::ffi::OsStrExt;
|
||||
use std::path::Path;
|
||||
use std::pin::Pin;
|
||||
@ -20,7 +19,7 @@ use futures::sink::SinkExt;
|
||||
use futures::stream::{StreamExt, TryStreamExt};
|
||||
|
||||
use proxmox_io::vec;
|
||||
use pxar::accessor::{self, EntryRangeInfo, ReadAt};
|
||||
use pxar::accessor::{self, ContentRange, EntryRangeInfo, ReadAt};
|
||||
|
||||
use proxmox_fuse::requests::{self, FuseRequest};
|
||||
use proxmox_fuse::{EntryParam, Fuse, ReplyBufState, Request, ROOT_ID};
|
||||
@ -130,7 +129,7 @@ struct Lookup {
|
||||
inode: u64,
|
||||
parent: u64,
|
||||
entry_range_info: EntryRangeInfo,
|
||||
content_range: Option<Range<u64>>,
|
||||
content_range: Option<ContentRange>,
|
||||
}
|
||||
|
||||
impl Lookup {
|
||||
@ -138,7 +137,7 @@ impl Lookup {
|
||||
inode: u64,
|
||||
parent: u64,
|
||||
entry_range_info: EntryRangeInfo,
|
||||
content_range: Option<Range<u64>>,
|
||||
content_range: Option<ContentRange>,
|
||||
) -> Box<Lookup> {
|
||||
Box::new(Self {
|
||||
refs: AtomicUsize::new(1),
|
||||
@ -433,13 +432,17 @@ impl SessionImpl {
|
||||
}
|
||||
}
|
||||
|
||||
fn open_content(&self, lookup: &LookupRef) -> Result<FileContents, Error> {
|
||||
async fn open_content<'a>(&'a self, lookup: &'a LookupRef<'a>) -> Result<FileContents, Error> {
|
||||
if is_dir_inode(lookup.inode) {
|
||||
io_return!(libc::EISDIR);
|
||||
}
|
||||
|
||||
match lookup.content_range.clone() {
|
||||
Some(range) => Ok(unsafe { self.accessor.open_contents_at_range(range) }),
|
||||
match &lookup.content_range {
|
||||
Some(range) => self
|
||||
.accessor
|
||||
.open_contents_at_range(range)
|
||||
.await
|
||||
.map_err(|err| err.into()),
|
||||
None => io_return!(libc::EBADF),
|
||||
}
|
||||
}
|
||||
@ -581,7 +584,7 @@ impl SessionImpl {
|
||||
|
||||
async fn read(&self, inode: u64, len: usize, offset: u64) -> Result<Vec<u8>, Error> {
|
||||
let file = self.get_lookup(inode)?;
|
||||
let content = self.open_content(&file)?;
|
||||
let content = self.open_content(&file).await?;
|
||||
let mut buf = vec::undefined(len);
|
||||
let mut pos = 0;
|
||||
// fuse' read is different from normal read - no short reads allowed except for EOF!
|
||||
|
@ -1748,7 +1748,7 @@ fn try_restore_snapshot_archive<R: pxar::decoder::SeqRead>(
|
||||
}
|
||||
|
||||
let filename = entry.file_name();
|
||||
let mut contents = match decoder.contents() {
|
||||
let mut contents = match decoder.contents()? {
|
||||
None => bail!("missing file content"),
|
||||
Some(contents) => contents,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user