Skip to content

Commit c31e6bb

Browse files
committed
rafs: enhance RAFS FUSE implementation to support TARFS
Enhance RAFS FUSE implementation to support RAFS filesystms in TARFS mode. Signed-off-by: Jiang Liu <[email protected]>
1 parent 8f1d146 commit c31e6bb

File tree

2 files changed

+45
-12
lines changed

2 files changed

+45
-12
lines changed

rafs/src/fs.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use nydus_utils::{
3939
};
4040

4141
use crate::metadata::{
42-
Inode, RafsInode, RafsInodeWalkAction, RafsSuper, RafsSuperFlags, RafsSuperMeta, DOT, DOTDOT,
42+
Inode, RafsInode, RafsInodeWalkAction, RafsSuper, RafsSuperMeta, DOT, DOTDOT,
4343
};
4444
use crate::{RafsError, RafsIoReader, RafsResult};
4545

@@ -616,10 +616,6 @@ impl FileSystem for Rafs {
616616
}
617617

618618
let real_size = cmp::min(size as u64, inode_size - offset);
619-
if self.sb.meta.flags.contains(RafsSuperFlags::TARTFS_MODE) {
620-
return Err(enosys!("rafs: `TARFS` mode is not supported by FUSE yet"));
621-
}
622-
623619
let mut result = 0;
624620
let mut descs = inode.alloc_bio_vecs(&self.device, offset, real_size as usize, true)?;
625621
assert!(!descs.is_empty() && !descs[0].is_empty());

rafs/src/metadata/direct_v6.rs

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ use crate::metadata::layout::v5::RafsV5ChunkInfo;
4040
use crate::metadata::layout::v6::{
4141
rafsv6_load_blob_extra_info, recover_namespace, RafsV6BlobTable, RafsV6Dirent,
4242
RafsV6InodeChunkAddr, RafsV6InodeCompact, RafsV6InodeExtended, RafsV6OndiskInode,
43-
RafsV6XattrEntry, RafsV6XattrIbodyHeader, EROFS_BLOCK_SIZE_4096, EROFS_BLOCK_SIZE_512,
44-
EROFS_INODE_CHUNK_BASED, EROFS_INODE_FLAT_INLINE, EROFS_INODE_FLAT_PLAIN,
43+
RafsV6XattrEntry, RafsV6XattrIbodyHeader, EROFS_BLOCK_BITS_9, EROFS_BLOCK_SIZE_4096,
44+
EROFS_BLOCK_SIZE_512, EROFS_INODE_CHUNK_BASED, EROFS_INODE_FLAT_INLINE, EROFS_INODE_FLAT_PLAIN,
4545
EROFS_INODE_SLOT_SIZE, EROFS_I_DATALAYOUT_BITS, EROFS_I_VERSION_BIT, EROFS_I_VERSION_BITS,
4646
};
4747
use crate::metadata::layout::{bytes_to_os_str, MetaRange, XattrName, XattrValue};
@@ -533,6 +533,8 @@ impl OndiskInodeWrapper {
533533
content_offset: u32,
534534
content_len: u32,
535535
user_io: bool,
536+
is_tarfs_mode: bool,
537+
is_tail: bool,
536538
) -> Option<BlobIoDesc> {
537539
let blob_index = chunk_addr.blob_index();
538540
let chunk_index = chunk_addr.blob_ci_index();
@@ -545,9 +547,29 @@ impl OndiskInodeWrapper {
545547
);
546548
None
547549
}
548-
Ok(blob) => device
549-
.create_io_chunk(blob.blob_index(), chunk_index)
550-
.map(|v| BlobIoDesc::new(blob, v, content_offset, content_len, user_io)),
550+
Ok(blob) => {
551+
if is_tarfs_mode {
552+
let offset = (chunk_addr.block_addr() as u64) << EROFS_BLOCK_BITS_9;
553+
let size = if is_tail {
554+
(self.size() % self.chunk_size() as u64) as u32
555+
} else {
556+
self.chunk_size()
557+
};
558+
let chunk = PlainChunkInfoV6::new(blob_index, chunk_index, offset, size);
559+
let chunk = Arc::new(chunk) as Arc<dyn BlobChunkInfo>;
560+
Some(BlobIoDesc::new(
561+
blob,
562+
chunk.into(),
563+
content_offset,
564+
content_len,
565+
user_io,
566+
))
567+
} else {
568+
device
569+
.create_io_chunk(blob.blob_index(), chunk_index)
570+
.map(|v| BlobIoDesc::new(blob, v, content_offset, content_len, user_io))
571+
}
572+
}
551573
}
552574
}
553575

@@ -777,6 +799,9 @@ impl RafsInode for OndiskInodeWrapper {
777799
return Ok(vec);
778800
}
779801

802+
let mut curr_chunk_index = head_chunk_index as u32;
803+
let tail_chunk_index = self.get_chunk_count() - 1;
804+
let is_tarfs_mode = state.is_tarfs();
780805
let content_offset = (offset % chunk_size as u64) as u32;
781806
let mut left = std::cmp::min(self.size() - offset, size as u64) as u32;
782807
let mut content_len = std::cmp::min(chunk_size - content_offset, left);
@@ -788,6 +813,8 @@ impl RafsInode for OndiskInodeWrapper {
788813
content_offset,
789814
content_len,
790815
user_io,
816+
is_tarfs_mode,
817+
curr_chunk_index == tail_chunk_index,
791818
)
792819
.ok_or_else(|| einval!("failed to get chunk information"))?;
793820

@@ -797,9 +824,19 @@ impl RafsInode for OndiskInodeWrapper {
797824
if left != 0 {
798825
// Handle the rest of chunks since they shares the same content length = 0.
799826
for c in chunks.iter().skip(1) {
827+
curr_chunk_index += 1;
800828
content_len = std::cmp::min(chunk_size, left);
801829
let desc = self
802-
.make_chunk_io(&state, device, c, 0, content_len, user_io)
830+
.make_chunk_io(
831+
&state,
832+
device,
833+
c,
834+
0,
835+
content_len,
836+
user_io,
837+
is_tarfs_mode,
838+
curr_chunk_index == tail_chunk_index,
839+
)
803840
.ok_or_else(|| einval!("failed to get chunk information"))?;
804841
if desc.blob.blob_index() != descs.blob_index() {
805842
vec.push(descs);
@@ -1286,7 +1323,7 @@ impl RafsInodeExt for OndiskInodeWrapper {
12861323
} else if state.is_tarfs() {
12871324
let blob_index = chunk_addr.blob_index();
12881325
let chunk_index = chunk_addr.blob_ci_index();
1289-
let offset = (chunk_addr.block_addr() as u64) << 9;
1326+
let offset = (chunk_addr.block_addr() as u64) << EROFS_BLOCK_BITS_9;
12901327
let size = if idx == self.get_chunk_count() - 1 {
12911328
(self.size() % self.chunk_size() as u64) as u32
12921329
} else {

0 commit comments

Comments
 (0)