diff --git a/Cargo.lock b/Cargo.lock index 5f4234760faeebc86a1fff18f38a22ca527b6272..568e2b6db97d88ca7a6126e49cdd49fd4d03cdce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,25 +1,25 @@ [[package]] name = "bitflags" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fuchsia-zircon" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fuchsia-zircon-sys" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -27,25 +27,16 @@ name = "fuse" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libc" -version = "0.2.34" +version = "0.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -53,34 +44,45 @@ name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.4.0" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pkg-config" -version = "0.3.9" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rand" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "rand" -version = "0.3.19" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fuchsia-zircon 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "redox_syscall" -version = "0.1.33" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -88,16 +90,16 @@ name = "redoxfs" version = "0.3.2" dependencies = [ "fuse 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)", - "spin 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "spin" -version = "0.4.6" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -107,13 +109,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "time" -version = "0.1.38" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -121,35 +122,45 @@ name = "uuid" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "winapi" -version = "0.2.8" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "winapi-build" -version = "0.1.1" +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" -"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" -"checksum fuchsia-zircon 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bd510087c325af53ba24f3be8f1c081b0982319adcb8b03cad764512923ccc19" -"checksum fuchsia-zircon-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "08b3a6f13ad6b96572b53ce7af74543132f1a7055ccceb6d073dd36c54481859" +"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" +"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" +"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum fuse 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80e57070510966bfef93662a81cb8aa2b1c7db0964354fa9921434f04b9e8660" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbc8a8929c632868295d0178dd8f63fc423fd7537ad0738372bd010b3ac9b0" +"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3a89a0c46ba789b8a247d4c567aed4d7c68e624672d238b45cc3ec20dc9f940" -"checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903" -"checksum rand 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7944d95d25ace8f377da3ac7068ce517e4c646754c43a1b1849177bbf72e59" -"checksum redox_syscall 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "07b8f011e3254d5a9b318fde596d409a0001c9ae4c6e7907520c2eaa4d988c99" -"checksum spin 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7e4deb3c2455c73779e6d3eebceae9599fc70957e54c69fe88f93aa48e62f432" +"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" +"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" +"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" +"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" +"checksum redox_syscall 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cf8fb82a4d1c9b28f1c26c574a5b541f5ffb4315f6c9a791fa47b6a04438fe93" +"checksum spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ceac490aa12c567115b40b7b7fceca03a6c9d53d5defea066123debc83c5dc1f" "checksum thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcbb6aa301e5d3b0b5ef639c9a9c7e2f1c944f177b460c04dc24c69b1fa2bd99" -"checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520" +"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" "checksum uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc7e3b898aa6f6c08e5295b6c89258d1331e9ac578cc992fb818759951bdc22" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" +"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/src/bin/mkfs.rs b/src/bin/mkfs.rs index b32a4e6cea9df787efd67d26b409f1ccf8890931..df612b4857f7471cbe1648d58ce7bc0205690f60 100644 --- a/src/bin/mkfs.rs +++ b/src/bin/mkfs.rs @@ -10,6 +10,7 @@ use redoxfs::{FileSystem, DiskFile}; use uuid::Uuid; fn main() { + println!("HI"); let mut args = env::args().skip(1); let disk_path = if let Some(path) = args.next() { diff --git a/src/bin/mount.rs b/src/bin/mount.rs index 88d160f14f8a9172716b09b57c7207dc79427f7d..0cffb01cf99ee609dc45bf80fadbd397ae9528ae 100644 --- a/src/bin/mount.rs +++ b/src/bin/mount.rs @@ -1,4 +1,4 @@ -#![deny(warnings)] +//#![deny(warnings)] #![cfg_attr(unix, feature(libc))] #[cfg(unix)] @@ -15,10 +15,28 @@ use std::fs::File; use std::io::{Read, Write}; use std::os::unix::io::FromRawFd; use std::process; +use redoxfs::FileSystem; -use redoxfs::{DiskCache, DiskFile, mount}; +use std::sync::atomic::{AtomicUsize, Ordering}; +use redoxfs::{DiskCache, DiskFile, mount,Disk}; use uuid::Uuid; +#[cfg(target_os = "redox")] +use syscall::{sigaction,sigreturn,SigAction,SIGKILL}; +use redoxfs::IS_UMT; + +#[cfg(target_os = "redox")] +//set up a signal handler on redox, this implements unmounting. I have no idea what sa_flags is +//for, so I put 2. I don't think 0,0 is a valid sa_mask. I don't know what i'm doing here. When u +//send it a sigkill, it shuts off the filesystem +fn setsig() { + sigaction(SIGKILL,Some(&SigAction{sa_handler:hi,sa_mask:[0,0],sa_flags:2}),None).unwrap(); +} +#[cfg(unix)] +// on linux, this is implemented properly, so no need for this unscrupulous nonsense! +fn setsig() { + () +} #[cfg(unix)] fn fork() -> isize { unsafe { libc::fork() as isize } @@ -124,6 +142,7 @@ fn daemon(disk_id: &DiskId, mountpoint: &str, mut write: File) -> ! { true }; + setsig(); if matches { match mount(filesystem, &mountpoint, || { println!("redoxfs: mounted filesystem on {} to {}", path, mountpoint); @@ -158,6 +177,7 @@ fn daemon(disk_id: &DiskId, mountpoint: &str, mut write: File) -> ! { } fn main() { + println!("It just works"); let mut args = env::args().skip(1); let disk_id = match args.next() { @@ -206,7 +226,6 @@ fn main() { let pid = fork(); if pid == 0 { drop(read); - daemon(&disk_id, &mountpoint, write); } else if pid > 0 { drop(write); @@ -222,3 +241,9 @@ fn main() { panic!("redoxfs: failed to create pipe"); } } +#[cfg(target_os = "redox")] +extern "C" fn hi(s:usize) { + println!("{}",s); + IS_UMT.store(1, Ordering::Relaxed); + sigreturn().unwrap(); +} diff --git a/src/filesystem.rs b/src/filesystem.rs index 1e7996631a838a596289e8273d6f66afce45da45..5bc979f468f0181280ca5e1ee9aa5652774d1398 100644 --- a/src/filesystem.rs +++ b/src/filesystem.rs @@ -19,6 +19,8 @@ impl<D: Disk> FileSystem<D> { disk.read_at(block + header.0, &mut header.1)?; if header.1.valid() { + header.1.dirty=true; + disk.write_at(header.0, &header.1)?; let mut root = (header.1.root, Node::default()); disk.read_at(block + root.0, &mut root.1)?; @@ -35,6 +37,11 @@ impl<D: Disk> FileSystem<D> { Err(Error::new(ENOENT)) } + pub fn close(&mut self) -> Result<()> { + self.header.1.dirty=false; + self.disk.write_at(self.header.0, &self.header.1)?; + Ok(()) + } /// Create a file system on a disk pub fn create(disk: D, ctime: u64, ctime_nsec: u32) -> Result<Self> { diff --git a/src/header.rs b/src/header.rs index ee11337483cc22efe18f19bd0e7363d1e7f91502..2a8167e772e9933b8b8099771bdfd47c73ff6856 100644 --- a/src/header.rs +++ b/src/header.rs @@ -20,8 +20,9 @@ pub struct Header { pub root: u64, /// Block of free space node pub free: u64, + pub dirty: bool, /// Padding - pub padding: [u8; BLOCK_SIZE as usize - 56] + pub padding: [u8; BLOCK_SIZE as usize - 57] } impl Header { @@ -33,7 +34,8 @@ impl Header { size: 0, root: 0, free: 0, - padding: [0; BLOCK_SIZE as usize - 56] + dirty:false, + padding: [0; BLOCK_SIZE as usize - 57] } } @@ -46,7 +48,8 @@ impl Header { size: size, root: root, free: free, - padding: [0; BLOCK_SIZE as usize - 56] + dirty:false, + padding: [0; BLOCK_SIZE as usize - 57] } } diff --git a/src/lib.rs b/src/lib.rs index 20c6c98294c184bc8547850f18dcfa23cf1c5a41..b23a2836b75bb377d72593e1aa9f0d129f2a2698 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,7 @@ extern crate uuid; pub const BLOCK_SIZE: u64 = 4096; pub const SIGNATURE: &'static [u8; 8] = b"RedoxFS\0"; pub const VERSION: u64 = 3; +pub static IS_UMT: AtomicUsize = AtomicUsize::new(0); pub use self::disk::{Disk, DiskCache, DiskFile}; pub use self::ex_node::ExNode; @@ -17,7 +18,7 @@ pub use self::filesystem::FileSystem; pub use self::header::Header; pub use self::mount::mount; pub use self::node::Node; - +use std::sync::atomic::AtomicUsize; mod disk; mod ex_node; mod extent; diff --git a/src/mount/fuse.rs b/src/mount/fuse.rs index 4b03fed0a611b9f55bac985c98daa77091b1f631..f6af702d2ed0fe664e306e273085bbe8f89adf76 100644 --- a/src/mount/fuse.rs +++ b/src/mount/fuse.rs @@ -7,6 +7,7 @@ use std::io; use std::os::unix::ffi::OsStrExt; use std::path::Path; use std::time::{SystemTime, UNIX_EPOCH}; +use std::io::{ErrorKind,Error}; use BLOCK_SIZE; use disk::Disk; @@ -27,7 +28,9 @@ pub fn mount<D: Disk, P: AsRef<Path>, F: FnMut()>(filesystem: filesystem::FileSy callback(); - session.run() + session.run()?; + session.filesystem.fs.close().map_err(|e| Error::new(ErrorKind::Interrupted,format!("{}",e))) + } pub struct Fuse<D: Disk> { diff --git a/src/mount/redox/scheme.rs b/src/mount/redox/scheme.rs index a5ce3be516ae36613e5c3f7249401793a2f2ca52..5aedb341add047737e91a33f408e8eadec50f1f6 100644 --- a/src/mount/redox/scheme.rs +++ b/src/mount/redox/scheme.rs @@ -2,18 +2,19 @@ use std::cell::RefCell; use std::collections::BTreeMap; use std::result::Result as StdResult; use std::str; -use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::{SystemTime, UNIX_EPOCH}; use syscall::data::{Stat, StatVfs, TimeSpec}; use syscall::error::{Error, Result, EACCES, EEXIST, EISDIR, ENOTDIR, ENOTEMPTY, EPERM, ENOENT, EBADF, ELOOP, EINVAL}; use syscall::flag::{O_APPEND, O_CREAT, O_DIRECTORY, O_STAT, O_EXCL, O_TRUNC, O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, MODE_PERM, O_SYMLINK, O_NOFOLLOW}; use syscall::scheme::Scheme; - +use std::sync::atomic::{AtomicUsize, Ordering}; +use syscall::EINTR; use BLOCK_SIZE; use disk::Disk; use filesystem::FileSystem; use node::Node; +use IS_UMT; use super::resource::{Resource, DirResource, FileResource}; use super::spin::Mutex; @@ -251,8 +252,8 @@ pub fn canonicalize(current: &[u8], path: &[u8]) -> Vec<u8> { impl<D: Disk> Scheme for FileScheme<D> { fn open(&self, url: &[u8], flags: usize, uid: u32, gid: u32) -> Result<usize> { + //WE ARE NOT GOING TO BLOCK THE OPEN CALL AT ALL let path = str::from_utf8(url).unwrap_or("").trim_matches('/'); - // println!("Open '{}' {:X}", path, flags); let mut fs = self.fs.borrow_mut(); @@ -387,6 +388,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn chmod(&self, url: &[u8], mode: u16, uid: u32, gid: u32) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } let path = str::from_utf8(url).unwrap_or("").trim_matches('/'); // println!("Chmod '{}'", path); @@ -408,6 +413,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn rmdir(&self, url: &[u8], uid: u32, gid: u32) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } let path = str::from_utf8(url).unwrap_or("").trim_matches('/'); // println!("Rmdir '{}'", path); @@ -445,6 +454,11 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn unlink(&self, url: &[u8], uid: u32, gid: u32) -> Result<usize> { + //block + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } let path = str::from_utf8(url).unwrap_or("").trim_matches('/'); // println!("Unlink '{}'", path); @@ -488,6 +502,10 @@ impl<D: Disk> Scheme for FileScheme<D> { /* Resource operations */ #[allow(unused_variables)] fn dup(&self, old_id: usize, buf: &[u8]) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } // println!("Dup {}", old_id); if ! buf.is_empty() { @@ -509,6 +527,13 @@ impl<D: Disk> Scheme for FileScheme<D> { #[allow(unused_variables)] fn read(&self, id: usize, buf: &mut [u8]) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } // println!("Read {}, {:X} {}", id, buf.as_ptr() as usize, buf.len()); let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) { @@ -519,6 +544,15 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn write(&self, id: usize, buf: &[u8]) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } + //block + // println!("Write {}, {:X} {}", id, buf.as_ptr() as usize, buf.len()); let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) { @@ -529,6 +563,13 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } // println!("Seek {}, {} {}", id, pos, whence); let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) { @@ -539,6 +580,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn fchmod(&self, id: usize, mode: u16) -> Result<usize> { + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } + //block let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) { file.fchmod(mode, &mut self.fs.borrow_mut()) @@ -548,6 +593,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn fchown(&self, id: usize, uid: u32, gid: u32) -> Result<usize> { + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } + //block let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) { file.fchown(uid, gid, &mut self.fs.borrow_mut()) @@ -557,6 +606,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn fcntl(&self, id: usize, cmd: usize, arg: usize) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) { file.fcntl(cmd, arg) @@ -566,6 +619,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } // println!("Fpath {}, {:X} {}", id, buf.as_ptr() as usize, buf.len()); let files = self.files.lock(); if let Some(file) = files.get(&id) { @@ -592,6 +649,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn frename(&self, id: usize, url: &[u8], uid: u32, gid: u32) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } let path = str::from_utf8(url).unwrap_or("").trim_matches('/'); // println!("Frename {}, {} from {}, {}", id, path, uid, gid); @@ -720,6 +781,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn fsync(&self, id: usize) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } // println!("Fsync {}", id); let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) { @@ -730,6 +795,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn ftruncate(&self, id: usize, len: usize) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } // println!("Ftruncate {}, {}", id, len); let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) { @@ -740,6 +809,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn futimens(&self, id: usize, times: &[TimeSpec]) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } // println!("Futimens {}, {}", id, times.len()); let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) { @@ -750,6 +823,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } fn fmap(&self, id: usize, offset: usize, size: usize) -> Result<usize> { + //block + if 1 == IS_UMT.load(Ordering::Relaxed) { + return Err(Error::new(EINTR)); + } // println!("Fmap {}, {}, {}", id, offset, size); let mut files = self.files.lock(); if let Some(file) = files.get_mut(&id) {