Merge branch 'fixes' into 'master'

Fix non-append writes and cancellation.

See merge request redox-os/ramfs!6
This commit is contained in:
Jeremy Soller
2024-03-23 13:54:27 +00:00
4 changed files with 39 additions and 65 deletions
Generated
+18 -34
View File
@@ -4,40 +4,23 @@ version = 3
[[package]]
name = "bitflags"
version = "1.3.2"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
[[package]]
name = "libc"
version = "0.2.150"
version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]]
name = "libredox"
version = "0.0.1"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
"bitflags 2.4.1",
"libc",
"redox_syscall",
]
[[package]]
name = "libredox"
version = "0.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "962b650e6b934f95cec493e1464e0f5cba98dd9ba9ef2b1c42cdfdb7864cab5a"
dependencies = [
"bitflags 2.4.1",
"bitflags",
"libc",
"redox_syscall",
]
@@ -46,7 +29,7 @@ dependencies = [
name = "ramfs"
version = "0.1.0"
dependencies = [
"libredox 0.0.3",
"libredox",
"redox-daemon",
"redox-scheme",
"redox_syscall",
@@ -54,28 +37,29 @@ dependencies = [
[[package]]
name = "redox-daemon"
version = "0.1.2"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "353178b5771a301b9d2b318914ab5dfeb21dd6e65930faedde19248cfceca5a7"
checksum = "7fbdeffdb03cf2961b211a2023e683d71f2c225ea93404da5dc34b0dc94f0341"
dependencies = [
"libc",
"libredox 0.0.1",
"libredox",
]
[[package]]
name = "redox-scheme"
version = "0.1.0"
source = "git+https://gitlab.redox-os.org/redox-os/redox-scheme.git#afd3fa573f0a7c03b762ac23daaf06966afecc75"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a4d4161697395d7cc9b182a14a753b2ba0243dcf622e278e644c6e7f74904c1"
dependencies = [
"libredox 0.0.3",
"libredox",
"redox_syscall",
]
[[package]]
name = "redox_syscall"
version = "0.4.1"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
dependencies = [
"bitflags 1.3.2",
"bitflags",
]
+4 -4
View File
@@ -9,7 +9,7 @@ description = "In-memory filesystem for Redox, which is useful for early logging
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
redox-daemon = "0.1.1"
redox_syscall = "0.4.1"
redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" }
libredox = "0.0.3"
redox-daemon = "0.1.2"
redox_syscall = "0.5.1"
redox-scheme = "0.2"
libredox = "0.1.3"
+8 -3
View File
@@ -3,7 +3,7 @@ use std::{env, process};
mod filesystem;
mod scheme;
use redox_scheme::SignalBehavior;
use redox_scheme::{RequestKind, SignalBehavior};
use self::scheme::Scheme;
@@ -23,10 +23,15 @@ fn main() {
let Some(request) = socket.next_request(SignalBehavior::Restart).expect("ramfs: failed to get next scheme request") else {
break;
};
match request.kind() {
RequestKind::Call(call) => {
let response = call.handle_scheme_mut(&mut scheme);
let response = request.handle_scheme_mut(&mut scheme);
socket.write_responses(&[response], SignalBehavior::Restart).expect("ramfs: failed to write next scheme response");
}
_ => (),
}
socket.write_responses(&[response], SignalBehavior::Restart).expect("ramfs: failed to write next scheme response");
}
process::exit(0);
+9 -24
View File
@@ -279,25 +279,6 @@ impl SchemeMut for Scheme {
Ok(fd)
}
fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result<usize> {
let inode_num = self.filesystem.resolve(path.as_bytes(), uid, gid)?;
let inode = self
.filesystem
.files
.get_mut(&inode_num)
.ok_or(Error::new(EIO))?;
let cur_mode = inode.mode & MODE_TYPE;
if inode.uid != uid && uid != 0 {
return Err(Error::new(EACCES));
}
if mode & MODE_TYPE != 0 {
return Err(Error::new(EINVAL));
}
inode.mode = mode | cur_mode;
Ok(0)
}
fn rmdir(&mut self, path: &str, uid: u32, gid: u32) -> Result<usize> {
self.remove_dentry(path.as_bytes(), uid, gid, true)
}
@@ -400,12 +381,15 @@ impl SchemeMut for Scheme {
}
// if there's a seek hole, fill it with 0 and continue writing.
if handle.offset > bytes.len() {
let additional = handle.offset - bytes.len();
let end_off = handle.offset.checked_add(buf.len()).ok_or(Error::new(EOVERFLOW))?;
if end_off > bytes.len() {
let additional = end_off - bytes.len();
bytes.try_reserve(additional).or(Err(Error::new(ENOMEM)))?;
bytes.resize(handle.offset, 0u8);
bytes.resize(end_off, 0u8);
}
bytes.extend(buf);
bytes[handle.offset..][..buf.len()].copy_from_slice(buf);
handle.offset = end_off;
Ok(buf.len())
} else {
Err(Error::new(EISDIR))
@@ -419,7 +403,6 @@ impl SchemeMut for Scheme {
.get_mut(&handle.inode)
.ok_or(Error::new(EBADFD))?;
let old = handle.offset;
handle.offset = match whence {
SEEK_SET => cmp::max(0, pos),
SEEK_CUR => cmp::max(
@@ -444,9 +427,11 @@ impl SchemeMut for Scheme {
let cur_type = file.mode & MODE_TYPE;
/*
if mode & MODE_TYPE != 0 {
return Err(Error::new(EINVAL));
}
*/
file.mode = mode | cur_type;