diff --git a/Cargo.lock b/Cargo.lock index 295de474bbd6ae11e2878cd2652244aec5c88edb..9b22742e4eb59127c29eddf5d95a317fde6899ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -232,9 +232,9 @@ checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "numtoa" @@ -326,7 +326,7 @@ checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" [[package]] name = "redoxfs" -version = "0.6.2" +version = "0.6.3" dependencies = [ "aes", "argon2", @@ -372,9 +372,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "seahash" @@ -396,9 +396,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.53" +version = "2.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "11a6ae1e52eb25aab8f3fb9fca13be982a373b8f1157ca14b897a825ba4a2d35" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index d0328bb0b3e7c3f2995f6beba9b70400cc07dcfe..ca50ce32ff8913abd9b14a4c28e2e38edb65ff8e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "redoxfs" description = "The Redox Filesystem" repository = "https://gitlab.redox-os.org/redox-os/redoxfs" -version = "0.6.2" +version = "0.6.3" license-file = "LICENSE" readme = "README.md" authors = ["Jeremy Soller <jackpot51@gmail.com>"] diff --git a/src/transaction.rs b/src/transaction.rs index 8a008e07fd80a124df1f16a5c50c87afaf63cdd4..7816c5948858fa4785a295a792d4a9210a5ff7a2 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -309,11 +309,12 @@ impl<'a, D: Disk> Transaction<'a, D> { level: BlockLevel, ) -> Result<BlockData<T>> { let record = unsafe { self.read_block_or_empty(ptr)? }; - if record.addr().level() == level { + if record.addr().level() >= level { + // Return record if it is larger than or equal to requested level return Ok(record); } - // Resize record if needed + // Expand record if larger level requested let (_old_addr, old_raw) = unsafe { record.into_parts() }; let mut raw = match T::empty(level) { Some(empty) => empty, @@ -1121,7 +1122,8 @@ impl<'a, D: Disk> Transaction<'a, D> { if buf[i..i + len] != record.data()[j..j + len] { unsafe { - let mut old_addr = record.swap_addr(self.allocate(level)?); + // CoW record using its current level + let mut old_addr = record.swap_addr(self.allocate(record.addr().level())?); // If the record was resized we need to dealloc the original ptr if old_addr.is_null() {