From 92d38e32c13f44d000ac687a38315f36343d7df9 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott <ian@iandouglasscott.com> Date: Tue, 25 Jul 2017 08:59:35 -0700 Subject: [PATCH] fuse: Fix readdir when directory does not fit in buffer --- mount/fuse.rs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/mount/fuse.rs b/mount/fuse.rs index 69cf53a..03e7405 100644 --- a/mount/fuse.rs +++ b/mount/fuse.rs @@ -197,20 +197,32 @@ impl Filesystem for Fuse { let mut children = Vec::new(); match self.fs.child_nodes(&mut children, parent_block) { Ok(()) => { + let mut i; + let skip; if offset == 0 { - let mut i = 0; + skip = 0; + i = 0; reply.add(parent_block - self.fs.header.0, i, FileType::Directory, "."); i += 1; reply.add(parent_block - self.fs.header.0, i, FileType::Directory, ".."); i += 1; - for child in children.iter() { - reply.add(child.0 - self.fs.header.0, i, if child.1.is_dir() { - FileType::Directory - } else { - FileType::RegularFile - }, child.1.name().unwrap()); - i += 1; + } else { + i = offset + 1; + skip = offset as usize - 1; + } + + for child in children.iter().skip(skip) { + let full = reply.add(child.0 - self.fs.header.0, i, if child.1.is_dir() { + FileType::Directory + } else { + FileType::RegularFile + }, child.1.name().unwrap()); + + if full { + break; } + + i += 1; } reply.ok(); }, -- GitLab