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()