66# Zonesize=1024
77# Maxsize=268966912
88
9- from . import superblock , bitmap
9+ from . import superblock , bitmap , inode
10+
11+ from pathlib import Path
1012
1113
1214class MinixFS :
@@ -22,6 +24,13 @@ def __init__(self, dev: BlockDevice):
2224 self .imap_offset = self .superblock_offset + self .superblock_size
2325 self .inode_size = 32
2426
27+ def store_superblock (self , sb : superblock .SuperBlock ):
28+ sb_bytes = list (sb .pack ())
29+
30+ superblock_offset_lba = self .superblock_offset // self .phys_block_size
31+ superblock_size_lba = self .superblock_size // self .phys_block_size
32+ self .dev .write (superblock_offset_lba , sb_bytes , superblock_size_lba )
33+
2534 def create_superblock (self ):
2635 sb = superblock .SuperBlock (
2736 s_ninodes = 352 ,
@@ -34,13 +43,7 @@ def create_superblock(self):
3443 s_magic = superblock .SB_MAGIC_LONG_FN ,
3544 s_state = 0 ,
3645 )
37-
38- sb_bytes = list (sb .pack ())
39-
40- superblock_offset_lba = self .superblock_offset // self .phys_block_size
41- superblock_size_lba = self .superblock_size // self .phys_block_size
42- self .dev .write (superblock_offset_lba , sb_bytes , superblock_size_lba )
43-
46+ self .store_superblock (sb )
4447
4548 def parse_superblock (self ):
4649 superblock_offset_lba = self .superblock_offset // self .phys_block_size
@@ -54,25 +57,102 @@ def parse_superblock(self):
5457 self .zmap_size = self .sb .s_zmap_blocks * self .block_size
5558 self .inodes_offset = self .zmap_offset + self .zmap_size
5659
57- def create_inode_bitmap (self ):
58- bm = bitmap .BitMap (self .sb .s_ninodes , self .sb .s_imap_blocks * self .block_size )
59- bm_bytes = list (bm .get_bytes ())
60+ def store_inode_bitmap (self , bm : bitmap .BitMap ):
61+ bm_bytes = bm .get_data ()
6062 inode_bitmap_offset_lba = self .imap_offset // self .phys_block_size
61- inode_bitmap_size_lba = (self .sb .s_imap_blocks * self .block_size ) // self .phys_block_size
63+ inode_bitmap_size_lba = (
64+ self .sb .s_imap_blocks * self .block_size
65+ ) // self .phys_block_size
6266 self .dev .write (inode_bitmap_offset_lba , bm_bytes , inode_bitmap_size_lba )
6367
64- def create_znode_bitmap (self ):
65- bm = bitmap .BitMap (self .sb .s_nzones , self .sb .s_zmap_blocks * self .block_size )
66- bm_bytes = list (bm .get_bytes ())
68+ def create_inode_bitmap (self ):
69+ bm = bitmap .BitMap .create (
70+ self .sb .s_ninodes , self .sb .s_imap_blocks * self .block_size
71+ )
72+ self .store_inode_bitmap (bm )
73+
74+ def parse_inode_bitmap (self ):
75+ inode_bitmap_offset_lba = self .imap_offset // self .phys_block_size
76+ inode_bitmap_size_lba = (
77+ self .sb .s_imap_blocks * self .block_size
78+ ) // self .phys_block_size
79+ data = self .dev .read (inode_bitmap_offset_lba , inode_bitmap_size_lba )
80+
81+ self .inode_bitmap = bitmap .BitMap .load (data )
82+
83+ def store_znode_bitmap (self , bm : bitmap .BitMap ):
84+ bm_bytes = bm .get_data ()
6785 znode_bitmap_offset_lba = self .zmap_offset // self .phys_block_size
68- znode_bitmap_size_lba = (self .sb .s_zmap_blocks * self .block_size ) // self .phys_block_size
86+ znode_bitmap_size_lba = (
87+ self .sb .s_zmap_blocks * self .block_size
88+ ) // self .phys_block_size
6989 self .dev .write (znode_bitmap_offset_lba , bm_bytes , znode_bitmap_size_lba )
7090
91+ def create_znode_bitmap (self ):
92+ bm = bitmap .BitMap .create (
93+ self .sb .s_nzones , self .sb .s_zmap_blocks * self .block_size
94+ )
95+ self .store_znode_bitmap (bm )
96+
97+ def parse_znode_bitmap (self ):
98+ znode_bitmap_offset_lba = self .zmap_offset // self .phys_block_size
99+ znode_bitmap_size_lba = (
100+ self .sb .s_zmap_blocks * self .block_size
101+ ) // self .phys_block_size
102+ data = self .dev .read (znode_bitmap_offset_lba , znode_bitmap_size_lba )
103+
104+ self .znode_bitmap = bitmap .BitMap .load (data )
105+
106+ def store_inode (self , i : inode .Inode , pos : int ):
107+ # calc block no and LBA addr where inode located
108+ inode_size_lba = 1
109+ inode_offset = self .inodes_offset + (pos * self .inode_size )
110+ inode_offset_lba = inode_offset // self .phys_block_size
111+ inode_offset_rem = inode_offset % self .phys_block_size
112+
113+ # read full disk block
114+ data = self .dev .read (inode_offset_lba , inode_size_lba )
115+
116+ # read, modify, write
117+ i_raw = i .pack ()
118+ data [inode_offset_rem : inode_offset_rem + len (i_raw )] = i_raw
119+
120+ # storing byte back
121+ self .dev .write (inode_offset_lba , data , inode_size_lba )
122+
123+ def create_inode (self ):
124+ free_inode_num = self .inode_bitmap .get_free_bit ()
125+ self .inode_bitmap .aquire_bit (free_inode_num )
126+ self .store_inode_bitmap (self .inode_bitmap )
127+
128+ free_znode_num = self .znode_bitmap .get_free_bit ()
129+ self .znode_bitmap .aquire_bit (free_znode_num )
130+ self .store_znode_bitmap (self .znode_bitmap )
131+
132+ i = inode .Inode (
133+ i_mode = int (inode .FileType .S_IFDIR ) | 0o755 ,
134+ i_uid = 0 ,
135+ i_size = 64 ,
136+ i_time = 0x699F6471 ,
137+ i_gid = 0 ,
138+ i_nlinks = 2 ,
139+ i_zone = [free_znode_num ] + [0 for i in range (0 , 8 )],
140+ )
141+ self .store_inode (i , free_inode_num )
142+
143+ def create_directory (self , path : Path ):
144+ self .create_inode ()
145+
71146 def create (self ):
72147 self .create_superblock ()
73148 self .parse_superblock ()
74149 self .create_inode_bitmap ()
150+ self .parse_inode_bitmap ()
75151 self .create_znode_bitmap ()
152+ self .parse_znode_bitmap ()
153+ self .create_directory (Path ("." ))
154+ # self.create_directory(Path(".."))
155+ # self.create_inode()
76156
77157 def mount (self ):
78158 # self.cf.write(0, [0x1, 0x02, 0x03], 3)
0 commit comments