/// <summary> /// Creates inodes and dirents for superroot, flat_path_table, and uroot. /// Also, creates the root node for the FS tree. /// </summary> void SetupRootStructure() { inodes.Add(super_root_ino = MakeInode( Mode: InodeMode.dir | InodeMode.rx_only, Blocks: 1, Size: 65536, SizeCompressed: 65536, Nlink: 1, Number: 0, Flags: InodeFlags.@internal | InodeFlags.@readonly )); inodes.Add(fpt_ino = MakeInode( Mode: InodeMode.file | InodeMode.rx_only, Blocks: 1, Number: 1, Flags: InodeFlags.@internal | InodeFlags.@readonly )); var uroot_ino = MakeInode( Mode: InodeMode.dir | InodeMode.rx_only, Number: 2, Size: 65536, SizeCompressed: 65536, Blocks: 1, Flags: InodeFlags.@readonly, Nlink: 3 ); super_root_dirents = new List <PfsDirent> { new PfsDirent { InodeNumber = 1, Name = "flat_path_table", Type = DirentType.File }, new PfsDirent { InodeNumber = 2, Name = "uroot", Type = DirentType.Directory } }; root = properties.root; root.name = "uroot"; root.ino = uroot_ino; root.Dirents = new List <PfsDirent> { new PfsDirent { Name = ".", Type = DirentType.Dot, InodeNumber = 2 }, new PfsDirent { Name = "..", Type = DirentType.DotDot, InodeNumber = 2 } }; if (properties.Sign) // HACK: Outer PFS lacks readonly flags { super_root_ino.Flags &= ~InodeFlags.@readonly; fpt_ino.Flags &= ~InodeFlags.@readonly; uroot_ino.Flags &= ~InodeFlags.@readonly; } }
/// <summary> /// Creates inodes and dirents for superroot, flat_path_table, and uroot. /// Also, creates the root node for the FS tree. /// </summary> void SetupRootStructure(bool hasCollision) { var inodeNum = 0u; inodes.Add(super_root_ino = MakeInode( Mode: InodeMode.dir | inode.RXOnly, Blocks: 1, Size: 65536, SizeCompressed: 65536, Nlink: 1, Number: inodeNum++, Flags: InodeFlags.@internal | InodeFlags.@readonly )); inodes.Add(fpt_ino = MakeInode( Mode: InodeMode.file | inode.RXOnly, Blocks: 1, Number: inodeNum++, Flags: InodeFlags.@internal | InodeFlags.@readonly )); if (hasCollision) { inodes.Add(cr_ino = MakeInode( Mode: InodeMode.file | inode.RXOnly, Blocks: 1, Number: inodeNum++, Flags: InodeFlags.@internal | InodeFlags.@readonly )); } var uroot_ino = MakeInode( Mode: InodeMode.dir | inode.RXOnly, Number: inodeNum++, Size: 65536, SizeCompressed: 65536, Blocks: 1, Flags: InodeFlags.@readonly, Nlink: 3 ); super_root_dirents = new List <PfsDirent> { new PfsDirent { InodeNumber = fpt_ino.Number, Name = "flat_path_table", Type = DirentType.File }, }; if (hasCollision) { super_root_dirents.Add( new PfsDirent { InodeNumber = cr_ino.Number, Name = "collision_resolver", Type = DirentType.File }); } super_root_dirents.Add( new PfsDirent { InodeNumber = uroot_ino.Number, Name = "uroot", Type = DirentType.Directory }); properties.root.name = "uroot"; properties.root.ino = uroot_ino; properties.root.Dirents = new List <PfsDirent> { new PfsDirent { Name = ".", Type = DirentType.Dot, InodeNumber = uroot_ino.Number }, new PfsDirent { Name = "..", Type = DirentType.DotDot, InodeNumber = uroot_ino.Number } }; if (properties.Sign) // HACK: Outer PFS lacks readonly flags { super_root_ino.Flags &= ~InodeFlags.@readonly; fpt_ino.Flags &= ~InodeFlags.@readonly; uroot_ino.Flags &= ~InodeFlags.@readonly; } }