瀏覽代碼

fix: inode set uid

liujingx 10 月之前
父節點
當前提交
1754ca424e
共有 2 個文件被更改,包括 12 次插入10 次删除
  1. 12 4
      ext4_fuse/src/fuse_fs.rs
  2. 0 6
      src/ext4/rw.rs

+ 12 - 4
ext4_fuse/src/fuse_fs.rs

@@ -52,15 +52,14 @@ impl<T: 'static> StateExt4FuseFs<T> {
             fs: Ext4::load(block_dev.clone()).unwrap(),
             block_dev,
             states: HashMap::new(),
-            // files: Vec::new(),
             next_fid: 0,
-            // dirs: Vec::new(),
             next_did: 0,
         }
     }
 
     /// Save a state
     fn checkpoint(&mut self, key: StateKey) -> bool {
+        log::info!("Checkpoint {}", key);
         self.states
             .insert(key, self.block_dev.checkpoint())
             .is_none()
@@ -68,6 +67,7 @@ impl<T: 'static> StateExt4FuseFs<T> {
 
     /// Restore a state
     fn restore(&mut self, key: StateKey) -> bool {
+        log::info!("Restore {}", key);
         if let Some(state) = self.states.remove(&key) {
             self.block_dev.restore(state);
             true
@@ -419,12 +419,20 @@ impl<T: 'static> Filesystem for StateExt4FuseFs<T> {
         _req: &Request<'_>,
         ino: u64,
         name: &OsStr,
-        _size: u32,
+        size: u32,
         reply: fuser::ReplyXattr,
     ) {
         let name = name.to_str().unwrap();
         match self.fs.getxattr(ino as u32, name) {
-            Ok(value) => reply.data(&value),
+            Ok(value) => {
+                if size == 0 {
+                    reply.size(value.len() as u32);
+                } else if value.len() == size as usize {
+                    reply.data(&value);
+                } else {
+                    reply.error(ErrCode::ERANGE as i32);
+                }
+            }
             Err(e) => reply.error(e.code() as i32),
         }
     }

+ 0 - 6
src/ext4/rw.rs

@@ -35,9 +35,6 @@ impl Ext4 {
         let (block_id, offset) = self.inode_disk_pos(inode_id);
         let block = self.read_block(block_id);
         let inode = InodeRef::new(inode_id, block.read_offset_as(offset));
-        if inode.inode.uid() != 0 {
-            panic!("Inode {:?} has invalid uid", inode);
-        }
         inode
     }
 
@@ -56,9 +53,6 @@ impl Ext4 {
 
     /// Write an inode to block device without checksum
     pub(super) fn write_inode_without_csum(&self, inode_ref: &InodeRef) {
-        if inode_ref.inode.uid() != 0 {
-            panic!();
-        }
         let (block_id, offset) = self.inode_disk_pos(inode_ref.id);
         let mut block = self.read_block(block_id);
         block.write_offset_as(offset, &inode_ref.inode);