From 9c25c0330a66858c5c0e0415a8a53670ee48465a Mon Sep 17 00:00:00 2001 From: Christian Ebner Date: Thu, 17 Oct 2019 17:04:26 +0200 Subject: [PATCH] pxar: fuse: optimize fuse readdir callback The expensive call to Decoder::read_directory_entry() can be omitted as Decoder::attributes() returns all the information the fuse response needs. Signed-off-by: Christian Ebner --- src/pxar/fuse.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/pxar/fuse.rs b/src/pxar/fuse.rs index ca2fc2c3..ae7180b2 100644 --- a/src/pxar/fuse.rs +++ b/src/pxar/fuse.rs @@ -712,14 +712,9 @@ extern "C" fn readdir(req: Request, inode: u64, size: size_t, offset: c_int, _fi if offset < n_entries { for e in gb_table[offset..gb_table.len()].iter() { - let entry = ctx - .decoder - .read_directory_entry(e.1, e.2) - .map_err(|_| libc::EIO)?; - - let name = CString::new(entry.filename.as_bytes()).map_err(|_| libc::EIO)?; - let (_, entry, _, payload_size) = + let (filename, entry, _, payload_size) = ctx.decoder.attributes(e.1).map_err(|_| libc::EIO)?; + let name = CString::new(filename.as_bytes()).map_err(|_| libc::EIO)?; let item_offset = find_offset(&entry, e.1, e.2); let item_inode = calculate_inode(item_offset, ctx.decoder.root_end_offset()); let attr = stat(item_inode, &entry, payload_size).map_err(|_| libc::EIO)?;