@@ -491,6 +491,7 @@ impl<S: BitmapSlice + Send + Sync> PassthroughFs<S> {
491491 uid. unwrap_or ( self . cfg . mapping . get_uid ( req. uid ) ) ,
492492 gid. unwrap_or ( self . cfg . mapping . get_gid ( req. gid ) ) ,
493493 ) ?;
494+ // Maybe buggy because `open_file` may call `open_by_handle_at`, which requires CAP_DAC_READ_SEARCH.
494495 data. open_file ( final_flags, & self . proc_self_fd ) ?
495496 }
496497 }
@@ -560,14 +561,14 @@ impl<S: BitmapSlice + Send + Sync> PassthroughFs<S> {
560561 self . validate_path_component ( name) ?;
561562
562563 let data = self . inode_map . get ( parent) . await ?;
564+ let file = data. get_file ( ) ?;
563565
564566 let res = {
565567 let _guard = set_creds (
566568 uid. unwrap_or ( self . cfg . mapping . get_uid ( req. uid ) ) ,
567569 gid. unwrap_or ( self . cfg . mapping . get_gid ( req. gid ) ) ,
568570 ) ?;
569571
570- let file = data. get_file ( ) ?;
571572 // Safe because this doesn't modify any memory and we check the return value.
572573 unsafe { libc:: mkdirat ( file. as_raw_fd ( ) , name. as_ptr ( ) , mode & !umask) }
573574 } ;
@@ -617,14 +618,14 @@ impl<S: BitmapSlice + Send + Sync> PassthroughFs<S> {
617618 self . validate_path_component ( name) ?;
618619
619620 let data = self . inode_map . get ( parent) . await ?;
621+ let file = data. get_file ( ) ?;
620622
621623 let res = {
622624 let _guard = set_creds (
623625 uid. unwrap_or ( self . cfg . mapping . get_uid ( req. uid ) ) ,
624626 gid. unwrap_or ( self . cfg . mapping . get_gid ( req. gid ) ) ,
625627 ) ?;
626628
627- let file = data. get_file ( ) ?;
628629 // Safe because this doesn't modify any memory and we check the return value.
629630 unsafe { libc:: symlinkat ( link. as_ptr ( ) , file. as_raw_fd ( ) , name. as_ptr ( ) ) }
630631 } ;
@@ -1097,8 +1098,14 @@ impl Filesystem for PassthroughFs {
10971098 buf. truncate ( bytes_read) ; // Adjust the buffer size
10981099 }
10991100 } else {
1100- error ! ( "read error: {ret}" ) ;
1101- return Err ( Errno :: from ( ret as i32 ) ) ;
1101+ let e = io:: Error :: last_os_error ( ) ;
1102+ // if e.raw_os_error() == Some(libc::EINVAL) {
1103+ // // Handle EINVAL for sparse files by returning zeroed data
1104+ // buf.clear();
1105+ // } else {
1106+ error ! ( "read error: {e:?}" ) ;
1107+ return Err ( Errno :: from ( e. raw_os_error ( ) . unwrap_or ( -1 ) ) ) ;
1108+ // }
11021109 }
11031110 }
11041111 }
@@ -1145,6 +1152,17 @@ impl Filesystem for PassthroughFs {
11451152 let size = data. len ( ) ;
11461153
11471154 self . check_fd_flags ( & handle_data, raw_fd, flags) . await ?;
1155+ // // Debug for O_DIRECT alignment issues
1156+ // if (flags & libc::O_DIRECT as u32) != 0 {
1157+ // let block_size = 512;
1158+ // debug!(
1159+ // "Alignment check (block_size={}): offset_ok={}, len_ok={}, addr_ok={}",
1160+ // block_size,
1161+ // offset % block_size as u64 == 0,
1162+ // size % block_size == 0,
1163+ // (data.as_ptr() as usize) % block_size == 0
1164+ // );
1165+ // }
11481166 let ret = unsafe {
11491167 libc:: pwrite (
11501168 raw_fd as c_int ,
@@ -1156,8 +1174,9 @@ impl Filesystem for PassthroughFs {
11561174 if ret >= 0 {
11571175 ret
11581176 } else {
1159- error ! ( "write error: {ret}" ) ;
1160- return Err ( Errno :: from ( ret as i32 ) ) ;
1177+ let e = io:: Error :: last_os_error ( ) ;
1178+ error ! ( "write error: {e:?}" ) ;
1179+ return Err ( Errno :: from ( e. raw_os_error ( ) . unwrap_or ( -1 ) ) ) ;
11611180 }
11621181 }
11631182 } ;
@@ -1313,7 +1332,9 @@ impl Filesystem for PassthroughFs {
13131332 )
13141333 } ;
13151334 if res < 0 {
1316- return Err ( io:: Error :: last_os_error ( ) . into ( ) ) ;
1335+ let e = io:: Error :: last_os_error ( ) ;
1336+ // error!("getxattr error: {e:?}");
1337+ return Err ( e. into ( ) ) ;
13171338 }
13181339
13191340 if size == 0 {
@@ -1351,7 +1372,9 @@ impl Filesystem for PassthroughFs {
13511372 )
13521373 } ;
13531374 if res < 0 {
1354- return Err ( io:: Error :: last_os_error ( ) . into ( ) ) ;
1375+ let e = io:: Error :: last_os_error ( ) ;
1376+ // error!("listxattr error: {e:?}");
1377+ return Err ( e. into ( ) ) ;
13551378 }
13561379
13571380 if size == 0 {
0 commit comments