code: def _walk_udf_directories(self, extent_to_inode):
          '''
          An internal method to walk a UDF filesystem and add all the metadata
          to this object.
          Parameters:
           extent_to_inode - A map from extent numbers to Inodes.
          Returns:
           Nothing.
          '''
          part_start = self.udf_main_descs.partition.part_start_location
          self.udf_root = self._parse_udf_file_entry(part_start + self.udf_file_set.root_dir_icb.log_block_num,
                                                     self.udf_file_set.root_dir_icb,
                                                     None)
          log_block_size = self.pvd.logical_block_size()
          udf_file_entries = collections.deque([self.udf_root])
          while udf_file_entries:
              udf_file_entry = udf_file_entries.popleft()
              if udf_file_entry is None:
                  continue
              for desc_len, desc_pos in udf_file_entry.alloc_descs:
                  abs_file_ident_extent = part_start + desc_pos
                  self._seek_to_extent(abs_file_ident_extent)
                  data = self._cdfp.read(desc_len)
                  offset = 0
                  while offset < len(data):
                      current_extent = (abs_file_ident_extent * log_block_size + offset) // log_block_size
                      desc_tag = udfmod.UDFTag()
                      desc_tag.parse(data[offset:], current_extent - part_start)
                      if desc_tag.tag_ident != 257:
                          raise pycdlibexception.PyCdlibInvalidISO('UDF File Identifier Tag identifier not 257')
                      file_ident = udfmod.UDFFileIdentifierDescriptor()
                      offset += file_ident.parse(data[offset:],
                                                 current_extent,
                                                 desc_tag,
                                                 udf_file_entry)
                      if file_ident.is_parent():
                          udf_file_entry.track_file_ident_desc(file_ident)
                          continue
                      abs_file_entry_extent = part_start + file_ident.icb.log_block_num
                      next_entry = self._parse_udf_file_entry(abs_file_entry_extent,
                                                              file_ident.icb,
                                                              udf_file_entry)
                      udf_file_entry.track_file_ident_desc(file_ident)
                      if next_entry is None:
                          if file_ident.is_dir():
                              raise pycdlibexception.PyCdlibInvalidISO('Empty UDF File Entry for directories are not allowed')
                          else:
                              continue
                      file_ident.file_entry = next_entry
                      next_entry.file_ident = file_ident
                      if file_ident.is_dir():
                          udf_file_entries.append(next_entry)
                      else:
                          if next_entry.get_data_length() > 0:
                              abs_file_data_extent = part_start + next_entry.alloc_descs[0][1]
                          else:
                              abs_file_data_extent = 0
                          if self.eltorito_boot_catalog is not None and abs_file_data_extent == self.eltorito_boot_catalog.extent_location():
                              self.eltorito_boot_catalog.add_dirrecord(next_entry)
                          else:
                              if abs_file_data_extent in extent_to_inode:
                                  ino = extent_to_inode[abs_file_data_extent]
                              else:
                                  ino = inode.Inode()
                                  ino.parse(abs_file_data_extent,
                                            next_entry.get_data_length(), self._cdfp,
                                            log_block_size)
                                  extent_to_inode[abs_file_data_extent] = ino
                                  self.inodes.append(ino)
                              ino.linked_records.append(next_entry)
                              next_entry.inode = ino
                  udf_file_entry.finish_directory_parse()