def add_partition(self, drv_name, cyl_range, dev_flags=0, flags=0, dos_type=DosType.DOS0, boot_pri=0): # cyl range is not free anymore or invalid if not self.check_cyl_range(*cyl_range): return False # no space left for partition block if not self._has_free_rdb_blocks(1): return False # allocate block for partition blk_num = self._alloc_rdb_blocks(1)[0] self.used_blks.append(blk_num) self._update_hi_blk() # crete a new parttion block pb = PartitionBlock(self.rawblk, blk_num) heads = self.rdb.phy_drv.heads blk_per_trk = self.rdb.phy_drv.secs dos_env = PartitionDosEnv(low_cyl=cyl_range[0], high_cyl=cyl_range[1], surfaces=heads, \ blk_per_trk=blk_per_trk, dos_type=dos_type, boot_pri=boot_pri) pb.create(drv_name, dos_env, flags=flags) pb.write() # link block if len(self.parts) == 0: # write into RDB self.rdb.part_list = blk_num else: # write into last partition block last_pb = self.parts[-1] last_pb.part_blk.next = blk_num last_pb.write() # always write RDB as allocated block is stored there, too self.rdb.write() # create partition object and add to partition list p = Partition(self.rawblk, blk_num, len(self.parts), blk_per_trk, self) p.read() self.parts.append(p) return True
def add_partition(self, drv_name, cyl_range, dev_flags=0, flags=0, dos_type=DosType.DOS0, boot_pri=0, more_dos_env=None, fs_block_size=None): # cyl range is not free anymore or invalid if not self.check_cyl_range(*cyl_range): return False # no space left for partition block if not self._has_free_rdb_blocks(1): return False # allocate block for partition blk_num = self._alloc_rdb_blocks(1)[0] self.used_blks.append(blk_num) self._update_hi_blk() # crete a new parttion block pb = PartitionBlock(self.rawblk, blk_num) # setup fs block size (may be multiple sectors) if not fs_block_size: fs_block_size = self.block_bytes sec_per_blk = int(fs_block_size / self.block_bytes) if sec_per_blk < 1 or sec_per_blk > 16: raise IOError("Invalid sec_per_blk: " + sec_per_blk) # block size in longs bsl = self.block_bytes >> 2 # setup dos env heads = self.rdb.phy_drv.heads blk_per_trk = self.rdb.phy_drv.secs dos_env = PartitionDosEnv(low_cyl=cyl_range[0], high_cyl=cyl_range[1], surfaces=heads, blk_per_trk=blk_per_trk, dos_type=dos_type, boot_pri=boot_pri, block_size=bsl, sec_per_blk=sec_per_blk) self._adjust_dos_env(dos_env, more_dos_env) pb.create(drv_name, dos_env, flags=flags) pb.write() # link block if len(self.parts) == 0: # write into RDB self.rdb.part_list = blk_num else: # write into last partition block last_pb = self.parts[-1] last_pb.part_blk.next = blk_num last_pb.write() # always write RDB as allocated block is stored there, too self.rdb.write() # flush out all changes before we read again self.rawblk.flush() # create partition object and add to partition list blk_per_cyl = blk_per_trk * heads p = Partition(self.rawblk, blk_num, len(self.parts), blk_per_cyl, self) p.read() self.parts.append(p) return True