what's wrong with cd9660 fs

Thomas Schmitt scdbackup at gmx.net
Fri Apr 20 18:25:58 UTC 2012


> mkisofs -rJ --iso-level 3 -o /path_to/file.iso .
> and i see TWO 4 gigabyte files with the same name!

This happens too on my "8.0-STABLE Mar 23 14:55:20 CET 2010".
FreeBSD is probably not alone with this.

An example image can be found at
compressed 25 KiB bzip2, uncompressed 4.1 GiB ISO 9660 image with
"file_of_4gb" having 2 extents.

The content of the image root directory should be:

$ ls f*
-rw-r--r--  1 1000  1000  4297064448 Apr 16 13:00 file_of_4gb

But on FreeBSD i get this:

$ bunzip2 file_of_4gb.iso.bz2
# su
# mdconfig -a -t vnode -f file_of_4gb.iso
# mount_cd9660 /dev/md1 /mnt
# ls -l /mnt/f*
-rw-r--r--  1 1000  1000  4294965248 Apr 16 13:00 file_of_4gb
-rw-r--r--  1 1000  1000  4294965248 Apr 16 13:00 file_of_4gb

Omitting Rock Ridge interpretation changes the result:

# umount /mnt
# mount_cd9660 -r /dev/md1 /mnt
# ls -l /mnt/f*
-r-xr-xr-x  1 root  wheel  2099200 Apr 16 13:00 file_of_4gb

This is a skewed reflection of the image entrails:
The file content is stored in two file sections (see also ECMA-119 6.5.1).
The directory records of both sections bear the same File Identifier
(struct iso_directory_record.name), but different Location of Extent
(struct iso_directory_record.extent) and Data Length
(struct iso_directory_record.size).
One extent begins at block 55 (= .extent) and has 4294965248 bytes (= .size).
The other begins at block 2097206 and has 2099200 bytes.

Afaics in my local copy of
there is a 1:1 relation between struct iso_node and ECMA-119 extents:
        long iso_extent;        /* extent of file */
        unsigned long i_size;
i believe to see a 1:1 relation between struct vnode and struct iso_node:
        vp->v_data = ip;
        ip->i_vnode = vp;

But there would be needed a 1:N relation between inode and ECMA-119 extents
in order to represent large files.

I am currently trying to understand how fs/udf handles multiple extents.
bears in function udf_bmap_internal() a comment:
                 * If the offset is beyond the current extent, look for the
                 * next extent.

Have a nice day :)


More information about the freebsd-hackers mailing list