diff --git a/syscall/fs.rs b/syscall/fs.rs
index e79e4c0c91d7b5b2026ac922ebb9bb170210558f..17ffec6781da7076db0c096fece7d36c592a0691 100644
--- a/syscall/fs.rs
+++ b/syscall/fs.rs
@@ -62,6 +62,50 @@ pub fn open(path: &[u8], flags: usize) -> Result<usize> {
     }).ok_or(Error::new(EMFILE))
 }
 
+/// mkdir syscall
+pub fn mkdir(path: &[u8], mode: usize) -> Result<usize> {
+    let path_canon = {
+        let contexts = context::contexts();
+        let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
+        let context = context_lock.read();
+        context.canonicalize(path)
+    };
+
+    let mut parts = path_canon.splitn(2, |&b| b == b':');
+    let namespace_opt = parts.next();
+    let reference_opt = parts.next();
+
+    let namespace = namespace_opt.ok_or(Error::new(ENOENT))?;
+    let scheme = {
+        let schemes = scheme::schemes();
+        let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
+        scheme.clone()
+    };
+    scheme.mkdir(reference_opt.unwrap_or(b""), mode)
+}
+
+/// rmdir syscall
+pub fn rmdir(path: &[u8]) -> Result<usize> {
+    let path_canon = {
+        let contexts = context::contexts();
+        let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
+        let context = context_lock.read();
+        context.canonicalize(path)
+    };
+
+    let mut parts = path_canon.splitn(2, |&b| b == b':');
+    let namespace_opt = parts.next();
+    let reference_opt = parts.next();
+
+    let namespace = namespace_opt.ok_or(Error::new(ENOENT))?;
+    let scheme = {
+        let schemes = scheme::schemes();
+        let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
+        scheme.clone()
+    };
+    scheme.rmdir(reference_opt.unwrap_or(b""))
+}
+
 /// Unlink syscall
 pub fn unlink(path: &[u8]) -> Result<usize> {
     let path_canon = {
diff --git a/syscall/mod.rs b/syscall/mod.rs
index 9592917da1481221323118e1e690dcd1b2e4432b..d799da04c73fdd8d47d129175255a5b723cb37e6 100644
--- a/syscall/mod.rs
+++ b/syscall/mod.rs
@@ -38,6 +38,8 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize
             SYS_LSEEK => lseek(b, c, d),
             SYS_GETPID => getpid(),
             SYS_FSTAT => fstat(b, &mut validate_slice_mut(c as *mut Stat, 1)?[0]),
+            SYS_MKDIR => mkdir(validate_slice(b as *const u8, c)?, d),
+            SYS_RMDIR => rmdir(validate_slice(b as *const u8, c)?),
             SYS_DUP => dup(b),
             SYS_BRK => brk(b),
             SYS_FTRUNCATE => ftruncate(b, c),