From dcba5d80188a95e708fa1af63babe3579718cf11 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Mon, 1 Apr 2024 13:30:31 -0600
Subject: [PATCH] 0.6.3: Fix CoW of records dropping data

---
 Cargo.lock         | 14 +++++++-------
 Cargo.toml         |  2 +-
 src/transaction.rs |  8 +++++---
 3 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 295de47..9b22742 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 d0328bb..ca50ce3 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 8a008e0..7816c59 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() {
-- 
GitLab