diff --git a/src/scheme/root.rs b/src/scheme/root.rs
index 14cdfa6b530978e6f503ecfcdc590776facb87d6..7aaf165f121d312f9d1a79964b820fa78c1d3672 100644
--- a/src/scheme/root.rs
+++ b/src/scheme/root.rs
@@ -2,14 +2,14 @@ use alloc::sync::Arc;
 use alloc::boxed::Box;
 use alloc::collections::BTreeMap;
 use alloc::vec::Vec;
-use core::str;
+use core::{cmp, str};
 use core::sync::atomic::{AtomicUsize, Ordering};
 use spin::{Mutex, RwLock};
 
 use context;
 use syscall::data::Stat;
 use syscall::error::*;
-use syscall::flag::{O_CREAT, MODE_FILE, MODE_DIR};
+use syscall::flag::{O_CREAT, MODE_FILE, MODE_DIR, SEEK_SET, SEEK_CUR, SEEK_END};
 use syscall::scheme::Scheme;
 use scheme::{self, SchemeNamespace, SchemeId};
 use scheme::user::{UserInner, UserScheme};
@@ -32,6 +32,18 @@ impl FolderInner {
 
         Ok(i)
     }
+
+    fn seek(&self, pos: usize, whence: usize) -> Result<usize> {
+        let mut seek = self.pos.lock();
+        *seek = match whence {
+            SEEK_SET => cmp::min(self.data.len(), pos),
+            SEEK_CUR => cmp::max(0, cmp::min(self.data.len() as isize, *seek as isize + pos as isize)) as usize,
+            SEEK_END => cmp::max(0, cmp::min(self.data.len() as isize, self.data.len() as isize + pos as isize)) as usize,
+            _ => return Err(Error::new(EINVAL))
+        };
+
+        Ok(*seek)
+    }
 }
 
 #[derive(Clone)]
@@ -168,6 +180,26 @@ impl Scheme for RootScheme {
         }
     }
 
+    fn seek(&self, file: usize, pos: usize, whence: usize) -> Result<usize> {
+        let handle = {
+            let handles = self.handles.read();
+            let handle = handles.get(&file).ok_or(Error::new(EBADF))?;
+            handle.clone()
+        };
+
+        match handle {
+            Handle::Scheme(_) => {
+                Err(Error::new(EBADF))
+            },
+            Handle::File(_) => {
+                Err(Error::new(EBADF))
+            },
+            Handle::Folder(inner) => {
+                inner.seek(pos, whence)
+            }
+        }
+    }
+
     fn fevent(&self, file: usize, flags: usize) -> Result<usize> {
         let handle = {
             let handles = self.handles.read();